From 9ef8b162a9d17db4c5453bb13b0adbb0e3f1a5f7 Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Sun, 25 Feb 2018 23:21:32 +0100 Subject: [PATCH] Also lint stdlib --- .travis.yml | 18 +- dist/asc.js | 2 +- dist/assemblyscript.js.map | 2 +- package.json | 11 +- std/assembly.d.ts | 6 +- std/assembly/allocator/tlsf.ts | 31 ++-- std/assembly/array.ts | 118 ++++++++---- std/assembly/builtins.ts | 19 +- std/assembly/map.ts | 12 +- std/assembly/memory.ts | 30 +-- std/assembly/set.ts | 18 +- std/assembly/string.ts | 203 ++++++++++++--------- std/portable.js | 1 + std/portable.json | 2 +- std/portable/{heap.js => memory.js} | 15 +- std/portable/tsconfig.json | 9 - tests/compiler/binary.optimized.wat | 12 -- tests/compiler/memcpy.optimized.wat | 16 +- tests/compiler/memmove.optimized.wat | 24 +-- tests/compiler/showcase.optimized.wat | 28 +-- tests/compiler/std/array.optimized.wat | 74 ++++---- tests/compiler/std/array.untouched.wat | 2 +- tests/compiler/std/carray.optimized.wat | 8 +- tests/compiler/std/polyfills.optimized.wat | 62 +++---- tests/compiler/std/set.optimized.wat | 34 ++-- tests/compiler/std/set.untouched.wat | 138 +++++++------- tests/compiler/std/string.optimized.wat | 10 +- tests/compiler/std/string.untouched.wat | 48 ++--- tests/compiler/tlsf.optimized.wat | 12 +- tslint.json | 2 +- 30 files changed, 506 insertions(+), 461 deletions(-) rename std/portable/{heap.js => memory.js} (70%) delete mode 100644 std/portable/tsconfig.json diff --git a/.travis.yml b/.travis.yml index 576525fb..d3cf2688 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,22 +5,18 @@ jobs: - stage: lint node_js: node script: npm run lint - env: DESC="Checks the sources with TSLint" + env: Checks the sources with TSLint - stage: test node_js: lts/* script: npm run clean && node bin/asc -v && npm test - env: DESC="Tests the sources on latest node.js LTS" - - stage: test - node_js: node - script: npm run clean && node bin/asc -v && npm test - env: DESC="Tests the sources on latest stable node.js" + env: Tests the sources on latest node.js LTS + - node_js: node + env: Tests the sources on latest stable node.js - stage: build node_js: lts/* script: npm run build && node bin/asc -v && npm test - env: DESC="Builds and tests the bundle on latest node.js LTS" - - stage: build - node_js: node - script: npm run build && node bin/asc -v && npm test - env: DESC="Builds and tests the bundle on latest stable node.js" + env: Builds and tests the bundle on latest node.js LTS + - node_js: node + env: Builds and tests the bundle on latest stable node.js diff --git a/dist/asc.js b/dist/asc.js index f958e635..47316623 100644 --- a/dist/asc.js +++ b/dist/asc.js @@ -1,4 +1,4 @@ -(function(e,t){'object'==typeof exports&&'object'==typeof module?module.exports=t(function(){try{return require('assemblyscript')}catch(t){}}(),require('./assemblyscript')):'function'==typeof define&&define.amd?define(['assemblyscript'],t):'object'==typeof exports?exports.asc=t(function(){try{return require('assemblyscript')}catch(t){}}(),require('./assemblyscript')):e.asc=t(e._,e[void 0])})('undefined'==typeof self?this:self,function(t,e){var r=Math.floor,o=Math.pow,s=Math.min;return function(e){function t(r){if(i[r])return i[r].exports;var s=i[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,r){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var i=e&&e.__esModule?function(){return e['default']}:function(){return e};return t.d(i,'a',i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p='',t(t.s=3)}([function(e,t,i){t.nextTick=function(e){setTimeout(e,0)},t.platform=t.arch=t.execPath=t.title='browser',t.pid=1,t.browser=!0,t.env={},t.argv=[],t.binding=function(){throw new Error('No such module. (Possibly not yet loaded)')},function(){var e,r='/';t.cwd=function(){return r},t.chdir=function(t){e||(e=i(1)),r=e.resolve(t,r)}}(),t.exit=t.kill=t.umask=t.dlopen=t.uptime=t.memoryUsage=t.uvCounters=function(){},t.features={}},function(e,t,i){(function(e){function r(e,t){for(var r,s=0,o=e.length-1;0<=o;o--)r=e[o],'.'===r?e.splice(o,1):'..'===r?(e.splice(o,1),s++):s&&(e.splice(o,1),s--);if(t)for(;s--;s)e.unshift('..');return e}function o(e,t){if(e.filter)return e.filter(t);for(var r=[],s=0;si?[]:e.slice(t,i-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var n=o(e.split('/')),a=o(r.split('/')),l=s(n.length,a.length),u=l,c=0;c{const i=t.options[e];i.aliases&&((r.alias||(r.alias={}))[e]=i.aliases),void 0!==i.default&&((r.default||(r.default={}))[e]=i.default),'string'===i.type?(r.string||(r.string=[])).push(e):'boolean'===i.type&&(r.boolean||(r.boolean=[])).push(e)}),i(14)(e,r)}function o(e,t){for(var i,r=!1;null!=(i=d.nextDiagnostic(e));)t.write(d.formatDiagnostic(i,t.isTTY,!0)+f.EOL+f.EOL),d.isError(i)&&(r=!0);return r}function n(){return{readTime:0,readCount:0,writeTime:0,writeCount:0,parseTime:0,parseCount:0,compileTime:0,compileCount:0,emitTime:0,emitCount:0,validateTime:0,validateCount:0,optimizeTime:0,optimizeCount:0}}function a(t){const i=e.hrtime();t();const r=e.hrtime(i);return 1e9*r[0]+r[1]}function l(t,i){function r(e){return e?(e/1e6).toFixed(3)+' ms':'N/A'}(i||e.stdout).write(['I/O Read : '+r(t.readTime,t.readCount),'I/O Write : '+r(t.writeTime,t.writeCount),'Parse : '+r(t.parseTime,t.parseCount),'Compile : '+r(t.compileTime,t.compileCount),'Emit : '+r(t.emitTime,t.emitCount),'Validate : '+r(t.validateTime,t.validateCount),'Optimize : '+r(t.optimizeTime,t.optimizeCount)].join(f.EOL)+f.EOL)}const u=i(9),c=i(1),f=i(10);var d,p;try{d=i(11),p=!1;try{i(!function(){var t=new Error('Cannot find module "source-map-support"');throw t.code='MODULE_NOT_FOUND',t}()).install()}catch(t){}}catch(t){try{i(!function(){var t=new Error('Cannot find module "ts-node"');throw t.code='MODULE_NOT_FOUND',t}()).register({project:c.join('.','..','src','tsconfig.json')}),i(!function(){var t=new Error('Cannot find module "../src/glue/js"');throw t.code='MODULE_NOT_FOUND',t}()),d=i(!function(){var t=new Error('Cannot find module "../src"');throw t.code='MODULE_NOT_FOUND',t}()),p=!0}catch(t){d=i(12),p=!1}}t.isBundle=!0,t.isDev=p,t.version=t.isBundle?'0.5.0':i(!function(){var t=new Error('Cannot find module "../package.json"');throw t.code='MODULE_NOT_FOUND',t}()).version,t.options=i(13),t.sourceMapRoot='assemblyscript:///',t.libraryPrefix=d.LIBRARY_PREFIX,t.defaultOptimizeLevel=2,t.defaultShrinkLevel=1,t.libraryFiles=t.isBundle?{"(lib)/allocator/arena":'/////////////// A simple yet effective Arena Memory Allocator /////////////////\n\n// Provides a `reset_memory` function to reset the heap to its initial state. A\n// user has to make sure that there are no more references to cleared memory\n// afterwards. Always aligns to 8 bytes.\n\nconst ALIGN_LOG2: usize = 3;\nconst ALIGN_SIZE: usize = 1 << ALIGN_LOG2;\nconst ALIGN_MASK: usize = ALIGN_SIZE - 1;\n\nvar HEAP_OFFSET: usize = HEAP_BASE;\n\n@global\nexport function allocate_memory(size: usize): usize {\n if (!size) return 0;\n var ptr = HEAP_OFFSET;\n var off = (ptr + size + ALIGN_MASK) & ~ALIGN_MASK;\n var avail = current_memory() << 16;\n if (off > avail && grow_memory(\n max(\n (((off + 0xffff) & ~0xffff) - avail) >> 16, // minimum required pages\n avail >> 16 // at least double memory\n )\n ) < 0) unreachable(); // out of memory\n HEAP_OFFSET = off;\n return ptr;\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n // nop\n}\n\n@global\nexport function reset_memory(): void {\n HEAP_OFFSET = HEAP_BASE;\n}\n',"(lib)/allocator/emscripten":'///////////////////////// Emscripten Memory Allocator //////////////////////////\n\n// Uses Emscripten\'s exported _malloc and _free implementations, i.e., when\n// linking with Emscripten-compiled programs that already provide these.\n// Differs from \'system\' in that their names are prefixed with an underscore.\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n@global\nexport function allocate_memory(size: usize): usize {\n return _malloc(size);\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n _free(ptr);\n}\n\n@global\nexport { reset_memory } from "./none";\n',"(lib)/allocator/none":'export function allocate_memory(size: usize): usize {\n throw new Error("not supported");\n}\n\nexport function free_memory(ptr: usize): void {\n throw new Error("not supported");\n}\n\nexport function reset_memory(): void {\n throw new Error("not supported");\n}\n',"(lib)/allocator/system":'/////////////////////////// System Memory Allocator ////////////////////////////\n\n// Uses the environment\'s malloc and free implementations, i.e., when linking\n// with other C-like programs that already provide these.\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n@global\nexport function allocate_memory(size: usize): usize {\n return malloc(size);\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n free(ptr);\n}\n\n@global\nexport { reset_memory } from "./none";\n',"(lib)/allocator/tlsf":'////////////// TLSF (Two-Level Segregate Fit) Memory Allocator ////////////////\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Block size interpretation (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u253C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u256B\u2500\u2534\u2500\u2534\u2500\u2524\n// \u2502 | FL \u2502 SB = SL + AL \u2502 \u25C4\u2500 usize\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2568\u2500\u2500\u2500\u2500\u2500\u2518\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nconst AL_BITS: u32 = sizeof() == sizeof() ? 2 : 3;\nconst AL_SIZE: usize = 1 << AL_BITS;\nconst AL_MASK: usize = AL_SIZE - 1;\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\nconst SB_MASK: usize = SB_SIZE - 1;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Block structure layout (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u253C\u2500\u253C\u2500\u2524\n// \u2502 size \u2502L\u2502F\u2502 \u25C4\u2500\u2510\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2567\u2550\u2561 \u2502 \u2510\n// \u2502 if free: \u25C4 prev \u2502 \u25C4\u2500\u2524 usize\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 if free: next \u25BA \u2502 \u25C4\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 ... unused free space >= 0 ... \u2502 \u2502 = 0\n// \u251C \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2524 \u2502\n// \u2502 if free: jump \u25B2 \u2502 \u25C4\u2500\u2518\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 MIN SIZE \u2518\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block\'s left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\nassert(AL_BITS >= 2); // alignment must be large enough to store all tags\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block\'s size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = sizeof();\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = 3 * sizeof(); // prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block\'s left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can\'t be null\n }\n\n /** Gets this block\'s right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can\'t skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can\'t be null\n }\n}\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Root structure layout (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2524 \u2510\n// \u2502 0 | flMap S\u2502 \u25C4\u2500\u2500\u2500\u2500\u2510\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 \u2502\n// \u2502 slMap[0] S \u2502 \u25C4\u2500\u2510 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502 \u2502\n// \u2502 slMap[1] \u2502 \u25C4\u2500\u2524 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 u32 \u2502\n// \u2502 ... \u2502 \u25C4\u2500\u2524 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502 \u2502\n// \u2502 slMap[22] P \u2502 \u25C4\u2500\u2518 \u2502\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 usize\n// \u2502 head[0] \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 ... \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 head[736] \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 \u2502\n// \u2502 tailRef \u2502 \u25C4\u2500\u2500\u2500\u2500\u2518\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 SIZE \u2518\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can\'t be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n var left: Block = assert(block.left); // can\'t be null\n var leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev)\n prev.next = next;\n if (next)\n next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n var slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap)\n this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n var flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can\'t be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else\n head = this.getHead(fl, ffs(slMap));\n\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block\'s (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n var spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n var right: Block = assert(block.right); // can\'t be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO)\n return false;\n\n // left size is total minus its own and the zero-length tail\'s header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit\'s index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit\'s index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// External interface\n\n/** Allocates a chunk of memory. */\n@global\nexport function allocate_memory(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n var rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (var fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (var sl: u32 = 0; sl < SL_SIZE; ++sl)\n root.setHead(fl, sl, null);\n }\n root.addMemory(rootOffset + Root.SIZE, current_memory() << 16);\n }\n\n // search for a suitable block\n var data: usize = 0;\n if (size && size < Block.MAX_SIZE) {\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n var pagesBefore = current_memory();\n var pagesNeeded = ((size + 0xffff) & ~0xffff) >>> 16;\n var pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (grow_memory(pagesWanted) < 0)\n if (grow_memory(pagesNeeded) < 0)\n unreachable(); // out of memory\n var pagesAfter = current_memory();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n data = root.use(block, size);\n }\n\n return data;\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global\nexport function free_memory(data: usize): void {\n if (data) {\n var root = ROOT;\n if (root) {\n var block = changetype(data - Block.INFO);\n var blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\nexport { reset_memory } from "./none";\n',"(lib)/array":'export class Array {\n\n private __memory: usize;\n private __capacity: i32; // capped to [0, 0x7fffffff]\n private __length: i32; // capped to [0, __capacity]\n\n private __grow(newCapacity: i32): void {\n assert(newCapacity > this.__capacity);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(newMemory, this.__memory, this.__capacity * sizeof());\n free_memory(this.__memory);\n }\n this.__memory = newMemory;\n this.__capacity = newCapacity;\n }\n\n constructor(capacity: i32 = 0) {\n if (capacity < 0)\n throw new RangeError("Invalid array length");\n this.__memory = capacity ? allocate_memory(capacity * sizeof()) : 0;\n this.__capacity = this.__length = capacity;\n }\n\n get length(): i32 {\n return this.__length;\n }\n\n set length(length: i32) {\n if (length < 0)\n throw new RangeError("Invalid array length");\n if (length > this.__capacity)\n this.__grow(max(length, this.__capacity << 1));\n this.__length = length;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n if (index >= this.__capacity)\n throw new Error("Index out of bounds"); // return changetype(0) ?\n return load(this.__memory + index * sizeof());\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n if (index < 0)\n throw new Error("Index out of bounds");\n if (index >= this.__capacity)\n this.__grow(max(index + 1, this.__capacity << 1));\n store(this.__memory + index * sizeof(), value);\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n if (fromIndex < 0)\n fromIndex = this.__length + fromIndex;\n while (fromIndex < this.__length) {\n if (load(this.__memory + fromIndex * sizeof()) == searchElement)\n return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n if (fromIndex < 0)\n fromIndex = this.__length + fromIndex;\n else if (fromIndex >= this.__length)\n fromIndex = this.__length - 1;\n while (fromIndex >= 0) {\n if (load(this.__memory + fromIndex * sizeof()) == searchElement)\n return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n if (this.__length == this.__capacity)\n this.__grow(this.__capacity ? this.__capacity << 1 : 1);\n store(this.__memory + this.__length * sizeof(), element);\n return ++this.__length;\n }\n\n pop(): T {\n if (this.__length < 1)\n throw new RangeError("Array is empty"); // return changetype(0) ?\n return load(this.__memory + --this.__length * sizeof());\n }\n\n shift(): T {\n if (this.__length < 1)\n throw new RangeError("Array is empty"); // return changetype(0) ?\n var element = load(this.__memory);\n move_memory(this.__memory, this.__memory + sizeof(), (this.__capacity - 1) * sizeof());\n set_memory(this.__memory + (this.__capacity - 1) * sizeof(), 0, sizeof());\n --this.__length;\n return element;\n }\n\n unshift(element: T): i32 {\n var oldCapacity = this.__capacity;\n if (this.__length == oldCapacity) {\n // inlined __grow (avoids moving twice)\n var newCapacity: i32 = oldCapacity ? oldCapacity << 1 : 1;\n assert(newCapacity > this.__capacity);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(newMemory + sizeof(), this.__memory, oldCapacity * sizeof());\n free_memory(this.__memory);\n }\n this.__memory = newMemory;\n this.__capacity = newCapacity;\n } else\n move_memory(this.__memory + sizeof(), this.__memory, oldCapacity * sizeof());\n store(this.__memory, element);\n return ++this.__length;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n if (begin < 0) {\n begin = this.__length + begin;\n if (begin < 0)\n begin = 0;\n } else if (begin > this.__length)\n begin = this.__length;\n if (end < 0)\n end = this.__length + end;\n else if (end > this.__length)\n end = this.__length;\n if (end < begin)\n end = begin;\n var capacity = end - begin;\n assert(capacity >= 0);\n var sliced = new Array(capacity);\n if (capacity)\n move_memory(sliced.__memory, this.__memory + begin * sizeof(), capacity * sizeof());\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): void {\n if (deleteCount < 1)\n return;\n if (start < 0) {\n start = this.__length + start;\n if (start < 0)\n start = 0;\n else if (start >= this.__length)\n return;\n } else if (start >= this.__length)\n return;\n deleteCount = min(deleteCount, this.__length - start);\n move_memory(this.__memory + start * sizeof(), this.__memory + (start + deleteCount) * sizeof(), deleteCount * sizeof());\n this.__length -= deleteCount;\n }\n\n reverse(): Array {\n for (var front: usize = 0, back: usize = this.__length - 1; front < back; ++front, --back) {\n var temp = load(this.__memory + front * sizeof());\n store(this.__memory + front * sizeof(), load(this.__memory + back * sizeof()));\n store(this.__memory + back * sizeof(), temp);\n }\n return this;\n }\n}\n\n@unmanaged\nexport class CArray {\n\n private constructor() {}\n\n @operator("[]")\n private __get(index: i32): T {\n if (index < 0)\n throw new RangeError("Index out of range");\n return load(changetype(this) + index * sizeof());\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n if (index < 0)\n throw new RangeError("Index out of range");\n store(changetype(this) + index * sizeof(), value);\n }\n}\n',"(lib)/builtins":'@builtin\nexport declare const NaN: f64; // | f32\n\n@builtin\nexport declare const Infinity: f64; // | f32\n\n@builtin\nexport declare function isNaN(value: T): bool;\n\n@builtin\nexport declare function isFinite(value: T): bool;\n\n@builtin\nexport declare function clz(value: T): T;\n\n@builtin\nexport declare function ctz(value: T): T;\n\n@builtin\nexport declare function popcnt(value: T): T;\n\n@builtin\nexport declare function rotl(value: T, shift: T): T;\n\n@builtin\nexport declare function rotr(value: T, shift: T): T;\n\n@builtin\nexport declare function abs(value: T): T;\n\n@builtin\nexport declare function max(left: T, right: T): T;\n\n@builtin\nexport declare function min(left: T, right: T): T;\n\n@builtin\nexport declare function ceil(value: T): T;\n\n@builtin\nexport declare function floor(value: T): T;\n\n@builtin\nexport declare function copysign(left: T, right: T): T;\n\n@builtin\nexport declare function nearest(left: T, right: T): T;\n\n@builtin\nexport declare function reinterpret(value: void): T;\n\n@builtin\nexport declare function sqrt(value: T): T;\n\n@builtin\nexport declare function trunc(value: T): T;\n\n@builtin\nexport declare function load(offset: usize, constantOffset?: usize): T;\n\n@builtin\nexport declare function store(offset: usize, value: void, constantOffset?: usize): T;\n\n@builtin\nexport declare function sizeof(): usize;\n\n@builtin\nexport declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n\n@builtin\nexport declare function unreachable(): void;\n\n@builtin\nexport declare function current_memory(): i32;\n\n@builtin\nexport declare function grow_memory(pages: i32): i32;\n\n// @builtin\n// export declare function move_memory(dest: usize, src: usize: n: usize): void;\n\n// @builtin\n// export declare function set_memory(dest: usize, value: u32, n: usize): void;\n\n@builtin\nexport declare function changetype(value: void): T;\n\n@builtin\nexport declare function assert(isTrueish: T, message?: string): T;\n\n@builtin\nexport declare function abort(message?: string | null, fileName?: string | null, lineNumber?: u32, columnNumber?: u32): void;\n\n@builtin\ndeclare function i8(value: void): i8;\nnamespace i8 {\n export const MIN_VALUE: i8 = -128;\n export const MAX_VALUE: i8 = 127;\n}\nexport { i8 };\n\n@builtin\ndeclare function i16(value: void): i16;\nnamespace i16 {\n export const MIN_VALUE: i16 = -32768;\n export const MAX_VALUE: i16 = 32767;\n}\nexport { i16 };\n\n@builtin\ndeclare function i32(value: void): i32;\nnamespace i32 {\n export const MIN_VALUE: i32 = -2147483648;\n export const MAX_VALUE: i32 = 2147483647;\n}\nexport { i32 };\n\n@builtin\ndeclare function i64(value: void): i64;\nnamespace i64 {\n export const MIN_VALUE: i64 = -9223372036854775808;\n export const MAX_VALUE: i64 = 9223372036854775807;\n}\nexport { i64 };\n\n@builtin\ndeclare function isize(value: void): isize;\nnamespace isize {\n export const MIN_VALUE: isize = sizeof() == sizeof() ? -2147483648 : -9223372036854775808;\n export const MAX_VALUE: isize = sizeof() == sizeof() ? 2147483647 : 9223372036854775807;\n}\nexport { isize };\n\n@builtin\ndeclare function u8(value: void): u8;\nnamespace u8 {\n export const MIN_VALUE: u8 = 0;\n export const MAX_VALUE: u8 = 255;\n}\nexport { u8 };\n\n@builtin\ndeclare function u16(value: void): u16;\nnamespace u16 {\n export const MIN_VALUE: u16 = 0;\n export const MAX_VALUE: u16 = 65535;\n}\nexport { u16 };\n\n@builtin\ndeclare function u32(value: void): u32;\nnamespace u32 {\n export const MIN_VALUE: u32 = 0;\n export const MAX_VALUE: u32 = 4294967295;\n}\nexport { u32 };\n\n@builtin\ndeclare function u64(value: void): u64;\nnamespace u64 {\n export const MIN_VALUE: u64 = 0;\n export const MAX_VALUE: u64 = 18446744073709551615;\n}\nexport { u64 };\n\n@builtin\ndeclare function usize(value: void): usize;\nnamespace usize {\n export const MIN_VALUE: usize = 0;\n export const MAX_VALUE: usize = sizeof() == sizeof() ? 4294967295 : 18446744073709551615;\n}\nexport { usize };\n\n@builtin\ndeclare function bool(value: void): bool;\nnamespace bool {\n export const MIN_VALUE: bool = 0;\n export const MAX_VALUE: bool = 1;\n}\nexport { bool };\n\n@builtin\ndeclare function f32(value: void): f32;\nnamespace f32 {\n export const MIN_VALUE: f32 = -3.40282347e+38;\n export const MAX_VALUE: f32 = 3.40282347e+38;\n export const MIN_SAFE_INTEGER: f32 = -16777215;\n export const MAX_SAFE_INTEGER: f32 = 16777215;\n export const EPSILON: f32 = 1.19209290e-07;\n}\nexport { f32 };\n\n@builtin\ndeclare function f64(value: void): f64;\nnamespace f64 {\n export const MIN_VALUE: f64 = -1.7976931348623157e+308;\n export const MAX_VALUE: f64 = 1.7976931348623157e+308;\n export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n export const EPSILON: f64 = 2.2204460492503131e-16;\n}\nexport{ f64 };\n\n@builtin\nexport declare const HEAP_BASE: usize;\n\n@builtin\nexport declare function start(): void;\n',"(lib)/error":'export class Error {\n\n name: string = "Error";\n message: string;\n stack: string = ""; // TODO\n\n constructor(message: string = "") {\n this.message = message;\n }\n}\n\nexport class RangeError extends Error {\n name: string = "RangeError";\n}\n\nexport class TypeError extends Error {\n name: string = "TypeError";\n}\n',"(lib)/iterator":'// export abstract class Iterator {\n// abstract get done(): bool;\n// abstract next(): T;\n// }\n',"(lib)/map":'export class Map {\n\n private __keys: K[] = [];\n private __values: V[] = [];\n\n // FIXME: not a proper map implementation, just a filler\n\n get size(): i32 {\n return this.__keys.length;\n }\n\n get(key: K): V | null {\n var keys = this.__keys;\n for (var i = 0, k = keys.length; i < k; ++i)\n if (keys[i] == key)\n return this.__values[i];\n return null;\n }\n\n has(key: K): bool {\n var keys = this.__keys;\n for (var i = 0, k = keys.length; i < k; ++i)\n if (keys[i] == key)\n return true;\n return false;\n }\n\n set(key: K, value: V): void {\n this.__keys.push(key);\n this.__values.push(value);\n }\n\n clear(): void {\n this.__keys.length = 0;\n this.__values.length = 0;\n }\n}\n',"(lib)/memory":'function copy_memory(dest: usize, src: usize, n: usize): void {\n // based on musl\'s implementation of memcpy\n // not a future instruction and sufficiently covered by the upcoming move_memory intrinsic\n\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1:\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n case 2:\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n case 3:\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\nexport function move_memory(dest: usize, src: usize, n: usize): void {\n // based on musl\'s implementation of memmove\n // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands\n\n if (dest == src)\n return;\n if (src + n <= dest || dest + n <= src) {\n copy_memory(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n)\n return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n)\n return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\nexport function set_memory(dest: usize, c: u8, n: usize): void {\n // based on musl\'s implementation of memset\n // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands\n\n // fill head and tail with minimal branching\n if (!n)\n return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2)\n return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6)\n return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8)\n return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8)\n return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24)\n return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function compare_memory(vl: usize, vr: usize, n: usize): i32 {\n // based on musl\'s implementation of memcmp\n // provided because there\'s no proposed alternative\n if (vl == vr)\n return 0;\n while (n && load(vl) == load(vr)) {\n n--;\n vl++;\n vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n',"(lib)/polyfills":'export function bswap(value: T): T {\n assert(sizeof() == 1 || sizeof() == 2 || sizeof() == 4 || sizeof() == 8);\n\n if (sizeof() == 2) {\n return bswap16(value);\n } else if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n } else if (sizeof() == 8) {\n var a: u64 = (value >> 8) & 0x00FF00FF00FF00FF;\n var b: u64 = (value & 0x00FF00FF00FF00FF) << 8;\n var v: u64 = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n}\n\nexport function bswap16(value: T): T {\n assert(sizeof() == 1 || sizeof() == 2 || sizeof() == 4);\n\n if (sizeof() == 2 || sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n}\n',"(lib)/regexp":'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',"(lib)/set":'// const prime1: u32 = 73;\n// const prime2: u32 = 5009;\n\nexport class Set {\n\n private __memory: usize;\n private __capacity: u32;\n private __size: u32;\n\n constructor() {\n this.__memory = 0;\n this.__capacity = this.__size = 0;\n }\n\n get size(): i32 {\n return this.__size;\n }\n\n // FIXME: not a proper set implementation, just a filler\n\n has(value: T): bool {\n assert(this != null);\n\n for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index)\n if (load(this.__memory + index * sizeof()) == value)\n return true;\n return false;\n }\n\n add(value: T): Set {\n assert(this != null);\n\n if (this.__size >= this.__capacity) {\n var newCapacity = max(this.__capacity << 1, 8);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(newMemory, this.__memory, this.__capacity * sizeof());\n free_memory(this.__memory);\n }\n this.__capacity = newCapacity;\n this.__memory = newMemory;\n }\n store(this.__memory + this.__size * sizeof(), value);\n ++this.__size;\n return this;\n }\n\n delete(value: T): bool {\n assert(this != null);\n\n for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index)\n if (load(this.__memory + index * sizeof()) == value) {\n if (index + 1 < this.__size)\n move_memory(this.__memory + index * sizeof(), this.__memory + (index + 1) * sizeof(), this.__size - index - 1);\n --this.__size;\n return true;\n }\n return false;\n }\n\n clear(): void {\n assert(this != null);\n\n this.__size = 0;\n }\n\n // TODO: think about iterators\n}\n\n// class SetIterator extends Iterator {\n\n// get done(): bool {\n// throw new Error("not implemented");\n// }\n\n// next(): T {\n// throw new Error("not implemented");\n// }\n// }\n',"(lib)/string":'// singleton empty string\nconst EMPTY: String = changetype("");\n\n// number of bytes preceeding string data\nconst HEAD: usize = 4;\n\nfunction allocate(length: i32): String {\n assert(length > 0); // 0 -> EMPTY\n var ptr = allocate_memory(HEAD + (length << 1));\n store(ptr, length);\n return changetype(ptr);\n}\n\nexport class String {\n\n readonly length: i32;\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this != null);\n\n if (pos >= this.length)\n return EMPTY;\n\n var out = allocate(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEAD\n ),\n HEAD\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this != null);\n\n if (pos >= this.length)\n return -1; // (NaN)\n\n return load(\n changetype(this) + (pos << 1),\n HEAD\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this != null);\n\n if (pos >= this.length)\n return -1; // (undefined)\n var first = load(\n changetype(this) + (pos << 1),\n HEAD\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length)\n return first;\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEAD\n );\n if (second < 0xDC00 || second > 0xDFFF)\n return first;\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (left == null)\n left = changetype("null");\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this != null);\n\n if (other == null)\n other = changetype("null");\n\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0)\n return EMPTY;\n\n var out = allocate(outLen);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD,\n thisLen << 1\n );\n move_memory(\n changetype(out) + HEAD + (thisLen << 1),\n changetype(other) + HEAD,\n otherLen << 1\n );\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = 0x7fffffff): bool {\n assert(this != null);\n\n if (searchString == null)\n return false;\n\n var end: isize = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0)\n return false;\n\n return !compare_memory(\n changetype(this) + HEAD + (start << 1),\n changetype(searchString) + HEAD,\n searchLength << 1\n );\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left == null)\n return right == null;\n else if (right == null)\n return false;\n\n var leftLength = left.length;\n if (leftLength != right.length)\n return false;\n\n return !compare_memory(\n changetype(left) + HEAD,\n changetype(right) + HEAD,\n (leftLength << 1)\n );\n }\n\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, position: i32 = 0): i32 {\n assert(this != null);\n\n if (searchString == null)\n searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start: isize = min(max(pos, 0), len);\n var searchLen: isize = searchString.length;\n\n // TODO: two-way, multiple char codes\n for (var k: usize = start; k + searchLen <= len; ++k)\n if (!compare_memory(\n changetype(this) + HEAD + (k << 1),\n changetype(searchString) + HEAD,\n searchLen << 1)\n )\n return k;\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this != null);\n\n if (searchString == null)\n searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start: isize = min(max(position, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len)\n return false;\n\n return !compare_memory(\n changetype(this) + HEAD + (start << 1),\n changetype(searchString) + HEAD,\n searchLength << 1\n );\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this != null);\n\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0)\n intStart = max(size + intStart, 0);\n\n var resultLength: isize = min(max(end, 0), size - intStart);\n if (resultLength <= 0)\n return EMPTY;\n\n var out = allocate(resultLength);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (intStart << 1),\n resultLength << 1\n );\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this != null);\n\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len)\n return EMPTY;\n\n if (!from && to == this.length)\n return this;\n\n var out = allocate(len);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (from << 1),\n len << 1\n );\n return out;\n }\n\n trim(): String {\n assert(this != null);\n\n var length: usize = this.length;\n while (length && isWhiteSpaceOrLineTerminator(load(changetype(this) + (length << 1), HEAD)))\n --length;\n\n var start: usize = 0;\n while (start < length && isWhiteSpaceOrLineTerminator(load(changetype(this) + (start << 1), HEAD)))\n ++start, --length;\n\n if (!length)\n return EMPTY;\n\n if (!start && length == this.length)\n return this;\n\n var out = allocate(length);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (start << 1),\n length << 1\n );\n return out;\n }\n\n trimLeft(): String {\n assert(this != null);\n\n var start: isize = 0;\n var len: isize = this.length;\n while (start < len && isWhiteSpaceOrLineTerminator(load(changetype(this) + (start << 1), HEAD)))\n ++start;\n\n if (!start)\n return this;\n\n var outLen = len - start;\n if (!outLen)\n return EMPTY;\n\n var out = allocate(outLen);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (start << 1),\n outLen << 1\n );\n return out;\n }\n\n trimRight(): String {\n assert(this != null);\n\n var len: isize = this.length;\n while (len > 0 && isWhiteSpaceOrLineTerminator(load(changetype(this) + (len << 1), HEAD)))\n --len;\n\n if (len <= 0)\n return EMPTY;\n\n if (len == this.length)\n return this;\n\n var out = allocate(len);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD,\n len << 1\n );\n return out;\n }\n}\n\nfunction isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n\n case 10: // \n case 13: // \n case 8232: // \n case 8233: // \n\n case 9: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 65279: // \n\n return true;\n default:\n return false;\n }\n}\n\nconst enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\nfunction parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len)\n return NaN;\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEAD);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len)\n return NaN;\n code = load(ptr += 2, HEAD);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len)\n return NaN;\n code = load(ptr += 2, HEAD);\n sign = 1;\n } else\n sign = 1;\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEAD)) {\n\n case CharCode.B:\n case CharCode.b:\n ptr += 4; len -= 2;\n radix = 2;\n break;\n\n case CharCode.O:\n case CharCode.o:\n ptr += 4; len -= 2;\n radix = 8;\n break;\n\n case CharCode.X:\n case CharCode.x:\n ptr += 4; len -= 2;\n radix = 16;\n break;\n\n default:\n radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36)\n return NaN;\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEAD);\n if (code >= CharCode._0 && code <= CharCode._9)\n code -= CharCode._0;\n else if (code >= CharCode.A && code <= CharCode.Z)\n code -= CharCode.A - 10;\n else if (code >= CharCode.a && code <= CharCode.z)\n code -= CharCode.a - 10;\n else\n break;\n if (code >= radix)\n break;\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len)\n return NaN;\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEAD);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len)\n return NaN;\n code = load(ptr += 2, HEAD);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len)\n return NaN;\n code = load(ptr += 2, HEAD);\n sign = 1;\n } else\n sign = 1;\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEAD);\n if (code == CharCode.DOT) {\n ptr += 2;\n var fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEAD);\n if (code == CharCode.E || code == CharCode.e)\n assert(false); // TODO\n code -= CharCode._0;\n if (code > 9)\n break;\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10)\n break;\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n'}:{},t.definitionFiles=t.isBundle?{assembly:'// Definitions for the "AssemblyScript" subset.\n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = any; // sic\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n export const MIN_VALUE: i8;\n export const MAX_VALUE: i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n export const MIN_VALUE: i16;\n export const MAX_VALUE: i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n export const MIN_VALUE: i32;\n export const MAX_VALUE: i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n export const MIN_VALUE: i64;\n export const MAX_VALUE: i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n export const MIN_VALUE: isize;\n export const MAX_VALUE: isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n export const MIN_VALUE: u8;\n export const MAX_VALUE: u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n export const MIN_VALUE: u16;\n export const MAX_VALUE: u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n export const MIN_VALUE: u32;\n export const MAX_VALUE: u32;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n export const MIN_VALUE: u64;\n export const MAX_VALUE: u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n export const MIN_VALUE: usize;\n export const MAX_VALUE: usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n export const MIN_VALUE: bool;\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n export const MIN_VALUE: f32;\n export const MAX_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n export const MIN_VALUE: f64;\n export const MAX_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n}\n\n// Built-ins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): any;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Returns the current memory size in units of pages. One page is 64kb. */\ndeclare function current_memory(): i32;\n/** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\ndeclare function grow_memory(value: i32): i32;\n/** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\ndeclare function move_memory(destination: usize, source: usize, n: usize): void;\n/** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\ndeclare function set_memory(destination: usize, value: u8, count: usize): void;\n/** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\ndeclare function compare_memory(vl: usize, vr: usize, n: usize): i32;\n/** Allocates a chunk of memory of the specified size and returns a pointer to it. */\ndeclare function allocate_memory(size: usize): usize;\n/** Disposes a chunk of memory by its pointer. */\ndeclare function free_memory(ptr: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified core or class type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n\n// Standard library (not yet implemented)\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): void;\n pop(): T;\n shift(): T;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): T[];\n splice(start: i32, deleteCount?: i32): void;\n reverse(): T[];\n}\n\n/** Class representing a C-like array of values of type `T` with limited capabilities. */\ndeclare class CArray {\n [key: number]: T;\n private constructor();\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(cp: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: u32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string): u32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n}\n\n// Internal decorators\n\n/** Annotates an element as a program global. */\ndeclare function global(target: Function): any;\n\n/** Annotates a method as an operator overload. */\ndeclare function operator(token: string): any;\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(target: Function): any;\n\n/** Annotates a class field with an explicit offset. */\ndeclare function offset(offset: usize): any;\n\n/** Annotates an element as begin built-in. */\ndeclare function builtin(target: Function): any;\n',portable:'// Definitions for the "portable AssemblyScript" subset.\n\n// Portable types\n\n// Note that semantic differences require additional explicit conversions for full compatibility.\n// For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n// result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n\n// Note that i64\'s are not portable (JS numbers are IEEE754 doubles with a maximum safe integer value\n// of 2^53-1) and instead require a compatibility layer to work in JS as well. See: src/util/i64.ts\n\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type bool = boolean;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n export const MIN_VALUE: i8;\n export const MAX_VALUE: i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n export const MIN_VALUE: i16;\n export const MAX_VALUE: i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n export const MIN_VALUE: i32;\n export const MAX_VALUE: i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n export const MIN_VALUE: isize;\n export const MAX_VALUE: isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n export const MIN_VALUE: u8;\n export const MAX_VALUE: u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n export const MIN_VALUE: u16;\n export const MAX_VALUE: u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n export const MIN_VALUE: u32;\n export const MAX_VALUE: u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n export const MIN_VALUE: usize;\n export const MAX_VALUE: usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n export const MIN_VALUE: bool;\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n}\n\n// Portable built-ins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Allocates a chunk of memory of the specified size and returns a pointer to it. */\ndeclare function allocate_memory(size: usize): usize;\n/** Disposes a chunk of memory by its pointer. */\ndeclare function free_memory(ptr: usize): void;\n/** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\ndeclare function move_memory(destination: usize, source: usize, n: usize): void;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n\n// Portable standard library\n// Everything marked @deprecated is a temporary filler. Do not use.\n\ndeclare const NaN: f32 | f64;\ndeclare const Infinity: f32 | f64;\n\ndeclare class Array {\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): void;\n pop(): T;\n shift(): T;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): T[];\n splice(start: i32, deleteCount?: i32): void;\n reverse(): T[];\n\n join(delim: string): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\ndeclare class String {\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(cp: i32): string;\n static fromCodePoints(arr: i32[]): string;\n readonly length: i32;\n private constructor();\n indexOf(subject: string, position?: i32): i32;\n includes(other: string): bool;\n lastIndexOf(subject: string, position?: i32): i32;\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n substring(from: i32, to?: i32): string;\n startsWith(subject: string): bool;\n endsWith(subject: string): bool;\n replace(search: string, replacement: string): string;\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\ndeclare class Error {\n constructor(message: string);\n message: string;\n stack: string | null;\n}\n\ndeclare class Symbol {\n private constructor();\n static readonly iterator: symbol;\n}\n\ndeclare class Set {\n constructor(entries?: T[]);\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n'}:{},t.main=function(r,h,m){function g(e){try{var t;return A.readCount++,A.readTime+=a(()=>{t=u.readFileSync(e,{encoding:'utf8'})}),t}catch(t){return null}}function b(e,t){try{return A.writeCount++,A.writeTime+=a(()=>{'string'==typeof t?u.writeFileSync(e,t,{encoding:'utf8'}):u.writeFileSync(e,t)}),!0}catch(t){return!1}}function y(e){var t;try{return A.readTime+=a(()=>{t=i(!function(){var t=new Error('Cannot find module "glob"');throw t.code='MODULE_NOT_FOUND',t}()).sync('*.ts',{cwd:e})}),t}catch(t){return[]}}function _(e){_.used||(A.writeCount++,_.used=!0),A.writeTime+=a(()=>{'string'==typeof e?v.write(e,{encoding:'utf8'}):v.write(e)})}'function'==typeof h?(m=h,h={}):!h&&(h={});const v=h.stdout||e.stdout,z=h.stderr||e.stderr,T=h.readFile||g,E=h.writeFile||b,x=h.listFiles||y,A=h.stats||n();if(!v)throw Error('\'options.stdout\' must be specified');if(!z)throw Error('\'options.stderr\' must be specified');if(!u.readFileSync){if(T===g)throw Error('\'options.readFile\' must be specified');if(E===b)throw Error('\'options.writeFile\' must be specified');if(x===y)throw Error('\'options.listFiles\' must be specified')}const S=s(r),k=24;if(m||(m=function(e){var t=0;return e&&(z.write(e.stack+f.EOL),t=1),t}),S.version)return v.write('Version '+t.version+(p?'-dev':'')+f.EOL),m(null);if(S.help||1>S._.length){const e=[];return Object.keys(t.options).forEach((i)=>{var r=t.options[i],s=' ';for(s+='--'+i,r.aliases&&1===r.aliases[0].length&&(s+=', -'+r.aliases[0]);s.length{for(let t=0;t hello.wasm','','Options:'].concat(e).join(f.EOL)+f.EOL),m(null)}const I=S.baseDir?c.resolve(S.baseDir):e.cwd(),L=c.join('.','..','std','assembly'),w=S.noLib?[]:[L];S.lib&&('string'==typeof S.lib&&(S.lib=S.lib.split(',')),Array.prototype.push.apply(w,S.lib.map(trim)));var F=null;for(let e=0,i=S._.length;e{F=d.parseFile(s,r,!0,F)});null!=(r=F.nextFile());){if(r.startsWith(t.libraryPrefix)){for(let e=0,i=w.length;e{d.parseFile(s,r,!1,F)})}if(o(F,z))return m(Error('Parse error'))}var M=!1;S.noLib||Object.keys(t.libraryFiles).forEach((e)=>{e.lastIndexOf('/')>=t.libraryPrefix.length||(A.parseCount++,A.parseTime+=a(()=>{F=d.parseFile(t.libraryFiles[e],e+'.ts',!1,F)}),M=!0)});for(let e=0,i=w.length;e{F=d.parseFile(o,t.libraryPrefix+s,!1,F)})}}const C=d.createOptions();d.setTarget(C,0),d.setNoTreeShaking(C,!!S.noTreeShaking),d.setNoAssert(C,!!S.noAssert),d.setNoMemory(C,!!S.noMemory),d.setMemoryBase(C,S.memoryBase>>>0),d.setSourceMap(C,null!=S.sourceMap);var B;A.compileCount++;try{A.compileTime+=a(()=>{B=d.compile(F,C)})}catch(t){return m(t)}if(o(F,z))return B&&B.dispose(),m(Error('Compile error'));if(S.validate&&(A.validateCount++,A.validateTime+=a(()=>{if(!B.validate())return B.dispose(),m(Error('Validate error'))})),'clamp'===S.trapMode)A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(['trap-mode-clamp'])});else if('js'===S.trapMode)A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(['trap-mode-js'])});else if('allow'!==S.trapMode)return B.dispose(),m(Error('Unsupported trap mode'));var N=-1,R=0,P=!S.noDebug;!1!==S.optimize&&('number'==typeof S.optimize?N=S.optimize:S[0]?N=0:S[1]?N=1:S[2]?N=2:S[3]?N=3:!0===S.optimize?(N=t.defaultOptimizeLevel,R=t.defaultShrinkLevel):N=0),S.s?R=1:S.z&&(R=2),'number'==typeof S.optimizeLevel&&(N=S.optimizeLevel),'number'==typeof S.shrinkLevel?R=S.shrinkLevel:'s'===S.shrinkLevel?R=1:'z'===S.shrinkLevel&&(R=2),B.setOptimizeLevel(0{0>O.indexOf(e)&&O.push(e)})),0<=N&&(A.optimizeCount++,A.optimizeTime+=a(()=>{B.optimize()})),O.length&&(A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(O.map((e)=>e.trim()))})),!S.noEmit){let e=!1;if(null!=S.outFile&&(/\.was?t$/.test(S.outFile)&&null==S.textFile?S.textFile=S.outFile:/\.js$/.test(S.outFile)&&null==S.asmjsFile?S.asmjsFile=S.outFile:null==S.binaryFile&&(S.binaryFile=S.outFile)),null!=S.binaryFile){let i,r=null==S.sourceMap?null:S.sourceMap.length?S.sourceMap:c.basename(S.binaryFile)+'.map';if(A.emitCount++,A.emitTime+=a(()=>{i=B.toBinary(r)}),S.binaryFile.length?E(c.join(I,S.binaryFile),i.output):(_(i.output),e=!0),null!=i.sourceMap)if(S.binaryFile.length){let e=JSON.parse(i.sourceMap);e.sourceRoot=t.sourceMapRoot,e.sources.forEach((r,i)=>{let s=null;if(r.startsWith(t.libraryPrefix))for(let e=0,i=w.length;e{t=B.toText()}),E(c.join(I,S.textFile),t)):!e&&(A.emitCount++,A.emitTime+=a(()=>{t=B.toText()}),_(t),e=!0)}if(null!=S.asmjsFile){let t;S.asmjsFile.length?(A.emitCount++,A.emitTime+=a(()=>{t=B.toAsmjs()}),E(c.join(I,S.asmjsFile),t)):!e&&(A.emitCount++,A.emitTime+=a(()=>{t=B.toAsmjs()}),_(t),e=!0)}}return B.dispose(),S.measure&&l(A,z),m(null)},t.parseArguments=s,t.checkDiagnostics=o,t.createStats=n,e.hrtime||(e.hrtime=i(15)),t.measure=a,t.printStats=l,t.createMemoryStream=function(e){var t=[];return t.write=function(t){'string'==typeof t?this.push(r.from(t,'utf8')):this.push(t),e&&e(t)},t.toBuffer=function(){return r.concat(this)},t.toString=function(){return this.toBuffer().toString('utf8')},t},t.tscOptions={alwaysStrict:!0,noImplicitAny:!0,noImplicitReturns:!0,noImplicitThis:!0,noEmitOnError:!0,strictNullChecks:!0,experimentalDecorators:!0,target:'esnext',module:'commonjs',noLib:!0,types:[],allowJs:!1}}).call(t,i(0),i(5).Buffer)},function(e,t,i){'use strict';(function(e){function n(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(n()e)throw new RangeError('"size" argument must not be negative')}function f(e,t,i,r){return c(t),0>=t?a(e,t):void 0===i?a(e,t):'string'==typeof r?a(e,t).fill(i,r):a(e,t).fill(i)}function d(e,t){if(c(t),e=a(e,0>t?0:0|b(t)),!l.TYPED_ARRAY_SUPPORT)for(var r=0;rt.length?0:0|b(t.length);e=a(e,r);for(var s=0;si||t.byteLength=n())throw new RangeError('Attempt to allocate Buffer larger than maximum size: 0x'+n().toString(16)+' bytes');return 0|e}function y(e,t){if(l.isBuffer(e))return e.length;if('undefined'!=typeof ArrayBuffer&&'function'==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;'string'!=typeof e&&(e=''+e);var i=e.length;if(0===i)return 0;for(var r=!1;;)switch(t){case'ascii':case'latin1':case'binary':return i;case'utf8':case'utf-8':case void 0:return Z(e).length;case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':return 2*i;case'hex':return i>>>1;case'base64':return K(e).length;default:if(r)return Z(e).length;t=(''+t).toLowerCase(),r=!0;}}function _(e,t,i){var r=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return'';if((void 0===i||i>this.length)&&(i=this.length),0>=i)return'';if(i>>>=0,t>>>=0,i<=t)return'';for(e||(e='utf8');;)switch(e){case'hex':return B(this,t,i);case'utf8':case'utf-8':return w(this,t,i);case'ascii':return M(this,t,i);case'latin1':case'binary':return C(this,t,i);case'base64':return L(this,t,i);case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':return N(this,t,i);default:if(r)throw new TypeError('Unknown encoding: '+e);e=(e+'').toLowerCase(),r=!0;}}function v(e,t,r){var s=e[t];e[t]=e[r],e[r]=s}function z(e,t,i,r,s){if(0===e.length)return-1;if('string'==typeof i?(r=i,i=0):2147483647i&&(i=-2147483648),i=+i,isNaN(i)&&(i=s?0:e.length-1),0>i&&(i=e.length+i),i>=e.length){if(s)return-1;i=e.length-1}else if(0>i)if(s)i=0;else return-1;if('string'==typeof t&&(t=l.from(t,r)),l.isBuffer(t))return 0===t.length?-1:T(e,t,i,r,s);if('number'==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&'function'==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(e,t,i):Uint8Array.prototype.lastIndexOf.call(e,t,i):T(e,[t],i,r,s);throw new TypeError('val must be string, number or Buffer')}function T(e,t,r,s,o){function n(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,l=e.length,u=t.length;if(void 0!==s&&(s=(s+'').toLowerCase(),'ucs2'===s||'ucs-2'===s||'utf16le'===s||'utf-16le'===s)){if(2>e.length||2>t.length)return-1;a=2,l/=2,u/=2,r/=2}var c;if(o){var i=-1;for(c=r;cl&&(r=l-u),c=r;0<=c;c--){for(var f=!0,d=0;do&&(s=o)):s=o;var n=t.length;if(0!=n%2)throw new TypeError('Invalid hex string');s>n/2&&(s=n/2);for(var a,l=0;li&&(a=i):2==l?(u=e[n+1],128==(192&u)&&(d=(31&i)<<6|63&u,127d||57343d&&(a=d))):void 0}null===a?(a=65533,l=1):65535>>10),a=56320|1023&a),o.push(a),n+=l}return F(o)}function F(e){var t=e.length;if(t<=ie)return Q.apply(String,e);for(var r='',s=0;st)&&(t=0),(!r||0>r||r>s)&&(r=s);for(var o='',n=t;ne)throw new RangeError('offset is not uint');if(e+t>i)throw new RangeError('Trying to access beyond buffer length')}function P(e,t,i,r,s,o){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>s||te.length)throw new RangeError('Index out of range')}function O(e,t,r,o){0>t&&(t=65535+t+1);for(var n=0,i=s(e.length-r,2);n>>8*(o?n:1-n)}function U(e,t,r,o){0>t&&(t=4294967295+t+1);for(var n=0,i=s(e.length-r,4);n>>8*(o?n:3-n)}function D(e,t,i,r){if(i+r>e.length)throw new RangeError('Index out of range');if(0>i)throw new RangeError('Index out of range')}function V(e,t,i,r,s){return s||D(e,t,i,4,34028234663852886e22,-34028234663852886e22),ee.write(e,t,i,r,23,4),i+4}function j(e,t,i,r,s){return s||D(e,t,i,8,17976931348623157e292,-17976931348623157e292),ee.write(e,t,i,r,52,8),i+8}function H(e){if(e=X(e).replace(re,''),2>e.length)return'';for(;0!=e.length%4;)e+='=';return e}function X(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,'')}function Y(e){return 16>e?'0'+e.toString(16):e.toString(16)}function Z(e,t){t=t||Infinity;for(var r,s=e.length,o=null,n=[],a=0;ar){if(!o){if(56319r){-1<(t-=3)&&n.push(239,191,189),o=r;continue}r=(o-55296<<10|r-56320)+65536}else o&&-1<(t-=3)&&n.push(239,191,189);if(o=null,128>r){if(0>(t-=1))break;n.push(r)}else if(2048>r){if(0>(t-=2))break;n.push(192|r>>6,128|63&r)}else if(65536>r){if(0>(t-=3))break;n.push(224|r>>12,128|63&r>>6,128|63&r)}else if(1114112>r){if(0>(t-=4))break;n.push(240|r>>18,128|63&r>>12,128|63&r>>6,128|63&r)}else throw new Error('Invalid code point')}return n}function G(e){for(var t=[],r=0;r(t-=2));++a)r=e.charCodeAt(a),s=r>>8,o=r%256,n.push(o),n.push(s);return n}function K(e){return $.toByteArray(H(e))}function q(e,t,r,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+r]=e[o];return o}function J(e){return e!==e}var Q=String.fromCharCode,$=i(6),ee=i(7),te=i(8);/*! +(function(e,t){'object'==typeof exports&&'object'==typeof module?module.exports=t(function(){try{return require('assemblyscript')}catch(t){}}(),require('./assemblyscript')):'function'==typeof define&&define.amd?define(['assemblyscript'],t):'object'==typeof exports?exports.asc=t(function(){try{return require('assemblyscript')}catch(t){}}(),require('./assemblyscript')):e.asc=t(e._,e[void 0])})('undefined'==typeof self?this:self,function(t,e){var r=Math.floor,o=Math.pow,s=Math.min;return function(e){function t(r){if(i[r])return i[r].exports;var s=i[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,t),s.l=!0,s.exports}var i={};return t.m=e,t.c=i,t.d=function(e,i,r){t.o(e,i)||Object.defineProperty(e,i,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var i=e&&e.__esModule?function(){return e['default']}:function(){return e};return t.d(i,'a',i),i},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p='',t(t.s=3)}([function(e,t,i){t.nextTick=function(e){setTimeout(e,0)},t.platform=t.arch=t.execPath=t.title='browser',t.pid=1,t.browser=!0,t.env={},t.argv=[],t.binding=function(){throw new Error('No such module. (Possibly not yet loaded)')},function(){var e,r='/';t.cwd=function(){return r},t.chdir=function(t){e||(e=i(1)),r=e.resolve(t,r)}}(),t.exit=t.kill=t.umask=t.dlopen=t.uptime=t.memoryUsage=t.uvCounters=function(){},t.features={}},function(e,t,i){(function(e){function r(e,t){for(var r,s=0,o=e.length-1;0<=o;o--)r=e[o],'.'===r?e.splice(o,1):'..'===r?(e.splice(o,1),s++):s&&(e.splice(o,1),s--);if(t)for(;s--;s)e.unshift('..');return e}function o(e,t){if(e.filter)return e.filter(t);for(var r=[],s=0;si?[]:e.slice(t,i-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var n=o(e.split('/')),a=o(r.split('/')),l=s(n.length,a.length),u=l,c=0;c{const i=t.options[e];i.aliases&&((r.alias||(r.alias={}))[e]=i.aliases),void 0!==i.default&&((r.default||(r.default={}))[e]=i.default),'string'===i.type?(r.string||(r.string=[])).push(e):'boolean'===i.type&&(r.boolean||(r.boolean=[])).push(e)}),i(14)(e,r)}function o(e,t){for(var i,r=!1;null!=(i=d.nextDiagnostic(e));)t.write(d.formatDiagnostic(i,t.isTTY,!0)+f.EOL+f.EOL),d.isError(i)&&(r=!0);return r}function n(){return{readTime:0,readCount:0,writeTime:0,writeCount:0,parseTime:0,parseCount:0,compileTime:0,compileCount:0,emitTime:0,emitCount:0,validateTime:0,validateCount:0,optimizeTime:0,optimizeCount:0}}function a(t){const i=e.hrtime();t();const r=e.hrtime(i);return 1e9*r[0]+r[1]}function l(t,i){function r(e){return e?(e/1e6).toFixed(3)+' ms':'N/A'}(i||e.stdout).write(['I/O Read : '+r(t.readTime,t.readCount),'I/O Write : '+r(t.writeTime,t.writeCount),'Parse : '+r(t.parseTime,t.parseCount),'Compile : '+r(t.compileTime,t.compileCount),'Emit : '+r(t.emitTime,t.emitCount),'Validate : '+r(t.validateTime,t.validateCount),'Optimize : '+r(t.optimizeTime,t.optimizeCount)].join(f.EOL)+f.EOL)}const u=i(9),c=i(1),f=i(10);var d,p;try{d=i(11),p=!1;try{i(!function(){var t=new Error('Cannot find module "source-map-support"');throw t.code='MODULE_NOT_FOUND',t}()).install()}catch(t){}}catch(t){try{i(!function(){var t=new Error('Cannot find module "ts-node"');throw t.code='MODULE_NOT_FOUND',t}()).register({project:c.join('.','..','src','tsconfig.json')}),i(!function(){var t=new Error('Cannot find module "../src/glue/js"');throw t.code='MODULE_NOT_FOUND',t}()),d=i(!function(){var t=new Error('Cannot find module "../src"');throw t.code='MODULE_NOT_FOUND',t}()),p=!0}catch(t){d=i(12),p=!1}}t.isBundle=!0,t.isDev=p,t.version=t.isBundle?'0.5.0':i(!function(){var t=new Error('Cannot find module "../package.json"');throw t.code='MODULE_NOT_FOUND',t}()).version,t.options=i(13),t.sourceMapRoot='assemblyscript:///',t.libraryPrefix=d.LIBRARY_PREFIX,t.defaultOptimizeLevel=2,t.defaultShrinkLevel=1,t.libraryFiles=t.isBundle?{"(lib)/allocator/arena":'/////////////// A simple yet effective Arena Memory Allocator /////////////////\n\n// Provides a `reset_memory` function to reset the heap to its initial state. A\n// user has to make sure that there are no more references to cleared memory\n// afterwards. Always aligns to 8 bytes.\n\nconst ALIGN_LOG2: usize = 3;\nconst ALIGN_SIZE: usize = 1 << ALIGN_LOG2;\nconst ALIGN_MASK: usize = ALIGN_SIZE - 1;\n\nvar HEAP_OFFSET: usize = HEAP_BASE;\n\n@global\nexport function allocate_memory(size: usize): usize {\n if (!size) return 0;\n var ptr = HEAP_OFFSET;\n var off = (ptr + size + ALIGN_MASK) & ~ALIGN_MASK;\n var avail = current_memory() << 16;\n if (off > avail && grow_memory(\n max(\n (((off + 0xffff) & ~0xffff) - avail) >> 16, // minimum required pages\n avail >> 16 // at least double memory\n )\n ) < 0) unreachable(); // out of memory\n HEAP_OFFSET = off;\n return ptr;\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n // nop\n}\n\n@global\nexport function reset_memory(): void {\n HEAP_OFFSET = HEAP_BASE;\n}\n',"(lib)/allocator/emscripten":'///////////////////////// Emscripten Memory Allocator //////////////////////////\n\n// Uses Emscripten\'s exported _malloc and _free implementations, i.e., when\n// linking with Emscripten-compiled programs that already provide these.\n// Differs from \'system\' in that their names are prefixed with an underscore.\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n@global\nexport function allocate_memory(size: usize): usize {\n return _malloc(size);\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n _free(ptr);\n}\n\n@global\nexport { reset_memory } from "./none";\n',"(lib)/allocator/none":'export function allocate_memory(size: usize): usize {\n throw new Error("not supported");\n}\n\nexport function free_memory(ptr: usize): void {\n throw new Error("not supported");\n}\n\nexport function reset_memory(): void {\n throw new Error("not supported");\n}\n',"(lib)/allocator/system":'/////////////////////////// System Memory Allocator ////////////////////////////\n\n// Uses the environment\'s malloc and free implementations, i.e., when linking\n// with other C-like programs that already provide these.\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n@global\nexport function allocate_memory(size: usize): usize {\n return malloc(size);\n}\n\n@global\nexport function free_memory(ptr: usize): void {\n free(ptr);\n}\n\n@global\nexport { reset_memory } from "./none";\n',"(lib)/allocator/tlsf":'////////////// TLSF (Two-Level Segregate Fit) Memory Allocator ////////////////\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Block size interpretation (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u253C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u256B\u2500\u2534\u2500\u2534\u2500\u2524\n// \u2502 | FL \u2502 SB = SL + AL \u2502 \u25C4\u2500 usize\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2568\u2500\u2500\u2500\u2500\u2500\u2518\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nconst AL_BITS: u32 = sizeof() == sizeof() ? 2 : 3;\nconst AL_SIZE: usize = 1 << AL_BITS;\nconst AL_MASK: usize = AL_SIZE - 1;\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Block structure layout (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u253C\u2500\u253C\u2500\u2524\n// \u2502 size \u2502L\u2502F\u2502 \u25C4\u2500\u2510\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2567\u2550\u2561 \u2502 \u2510\n// \u2502 if free: \u25C4 prev \u2502 \u25C4\u2500\u2524 usize\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 if free: next \u25BA \u2502 \u25C4\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 ... unused free space >= 0 ... \u2502 \u2502 = 0\n// \u251C \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2500 \u2524 \u2502\n// \u2502 if free: jump \u25B2 \u2502 \u25C4\u2500\u2518\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 MIN SIZE \u2518\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block\'s left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\nassert(AL_BITS >= 2); // alignment must be large enough to store all tags\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block\'s size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = sizeof();\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = 3 * sizeof(); // prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block\'s left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can\'t be null\n }\n\n /** Gets this block\'s right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can\'t skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can\'t be null\n }\n}\n\n// \u2552\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 Root structure layout (32-bit) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// \u251C\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2534\u2500\u2524 \u2510\n// \u2502 0 | flMap S\u2502 \u25C4\u2500\u2500\u2500\u2500\u2510\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 \u2502\n// \u2502 slMap[0] S \u2502 \u25C4\u2500\u2510 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502 \u2502\n// \u2502 slMap[1] \u2502 \u25C4\u2500\u2524 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 u32 \u2502\n// \u2502 ... \u2502 \u25C4\u2500\u2524 \u2502\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502 \u2502\n// \u2502 slMap[22] P \u2502 \u25C4\u2500\u2518 \u2502\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 usize\n// \u2502 head[0] \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 ... \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2502\n// \u2502 head[736] \u2502 \u25C4\u2500\u2500\u2500\u2500\u2524\n// \u255E\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561 \u2502\n// \u2502 tailRef \u2502 \u25C4\u2500\u2500\u2500\u2500\u2518\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 SIZE \u2518\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can\'t be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n var left: Block = assert(block.left); // can\'t be null\n var leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n var slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n var flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can\'t be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else {\n head = this.getHead(fl, ffs(slMap));\n }\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block\'s (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n var spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n var right: Block = assert(block.right); // can\'t be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else {\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail\'s header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit\'s index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit\'s index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// External interface\n\n/** Allocates a chunk of memory. */\n@global\nexport function allocate_memory(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n var rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (var fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (var sl: u32 = 0; sl < SL_SIZE; ++sl) {\n root.setHead(fl, sl, null);\n }\n }\n root.addMemory(rootOffset + Root.SIZE, current_memory() << 16);\n }\n\n // search for a suitable block\n var data: usize = 0;\n if (size && size < Block.MAX_SIZE) {\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n var pagesBefore = current_memory();\n var pagesNeeded = ((size + 0xffff) & ~0xffff) >>> 16;\n var pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (grow_memory(pagesWanted) < 0) {\n if (grow_memory(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n var pagesAfter = current_memory();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n data = root.use(block, size);\n }\n\n return data;\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global\nexport function free_memory(data: usize): void {\n if (data) {\n var root = ROOT;\n if (root) {\n var block = changetype(data - Block.INFO);\n var blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\nexport { reset_memory } from "./none";\n',"(lib)/array":'export class Array {\n\n private __memory: usize;\n private __capacity: i32; // capped to [0, 0x7fffffff]\n private __length: i32; // capped to [0, __capacity]\n\n private __grow(newCapacity: i32): void {\n assert(newCapacity > this.__capacity);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(newMemory, this.__memory, this.__capacity * sizeof());\n free_memory(this.__memory);\n }\n this.__memory = newMemory;\n this.__capacity = newCapacity;\n }\n\n constructor(capacity: i32 = 0) {\n if (capacity < 0) {\n throw new RangeError("Invalid array length");\n }\n this.__memory = capacity\n ? allocate_memory(capacity * sizeof())\n : 0;\n this.__capacity = this.__length = capacity;\n }\n\n get length(): i32 {\n return this.__length;\n }\n\n set length(length: i32) {\n if (length < 0) {\n throw new RangeError("Invalid array length");\n }\n if (length > this.__capacity) {\n this.__grow(max(length, this.__capacity << 1));\n }\n this.__length = length;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n if (index >= this.__capacity) {\n throw new Error("Index out of bounds"); // return changetype(0) ?\n }\n return load(this.__memory + index * sizeof());\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n if (index < 0) {\n throw new Error("Index out of bounds");\n }\n if (index >= this.__capacity) {\n this.__grow(max(index + 1, this.__capacity << 1));\n }\n store(this.__memory + index * sizeof(), value);\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n if (fromIndex < 0) {\n fromIndex = this.__length + fromIndex;\n }\n while (fromIndex < this.__length) {\n if (load(this.__memory + fromIndex * sizeof()) == searchElement) {\n return fromIndex;\n }\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n if (fromIndex < 0) {\n fromIndex = this.__length + fromIndex;\n } else if (fromIndex >= this.__length) {\n fromIndex = this.__length - 1;\n }\n while (fromIndex >= 0) {\n if (load(this.__memory + fromIndex * sizeof()) == searchElement) {\n return fromIndex;\n }\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n if (this.__length == this.__capacity) {\n this.__grow(this.__capacity ? this.__capacity << 1 : 1);\n }\n store(this.__memory + this.__length * sizeof(), element);\n return ++this.__length;\n }\n\n pop(): T {\n if (this.__length < 1) {\n throw new RangeError("Array is empty"); // return changetype(0) ?\n }\n return load(this.__memory + --this.__length * sizeof());\n }\n\n shift(): T {\n if (this.__length < 1) {\n throw new RangeError("Array is empty"); // return changetype(0) ?\n }\n var element = load(this.__memory);\n move_memory(\n this.__memory,\n this.__memory + sizeof(),\n (this.__capacity - 1) * sizeof()\n );\n set_memory(\n this.__memory + (this.__capacity - 1) * sizeof(),\n 0,\n sizeof()\n );\n --this.__length;\n return element;\n }\n\n unshift(element: T): i32 {\n var oldCapacity = this.__capacity;\n if (this.__length == oldCapacity) {\n // inlined __grow (avoids moving twice)\n var newCapacity: i32 = oldCapacity ? oldCapacity << 1 : 1;\n assert(newCapacity > this.__capacity);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(\n newMemory + sizeof(),\n this.__memory,\n oldCapacity * sizeof()\n );\n free_memory(this.__memory);\n }\n this.__memory = newMemory;\n this.__capacity = newCapacity;\n } else {\n move_memory(\n this.__memory + sizeof(),\n this.__memory,\n oldCapacity * sizeof()\n );\n }\n store(this.__memory, element);\n return ++this.__length;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n if (begin < 0) {\n begin = this.__length + begin;\n if (begin < 0) {\n begin = 0;\n }\n } else if (begin > this.__length) {\n begin = this.__length;\n }\n if (end < 0) {\n end = this.__length + end;\n } else if (end > this.__length) {\n end = this.__length;\n }\n if (end < begin) {\n end = begin;\n }\n var capacity = end - begin;\n assert(capacity >= 0);\n var sliced = new Array(capacity);\n if (capacity) {\n move_memory(\n sliced.__memory,\n this.__memory + begin * sizeof(),\n capacity * sizeof()\n );\n }\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): void {\n if (deleteCount < 1) {\n return;\n }\n if (start < 0) {\n start = this.__length + start;\n if (start < 0) {\n start = 0;\n } else if (start >= this.__length) {\n return;\n }\n } else if (start >= this.__length) {\n return;\n }\n deleteCount = min(deleteCount, this.__length - start);\n move_memory(\n this.__memory + start * sizeof(),\n this.__memory + (start + deleteCount) * sizeof(),\n deleteCount * sizeof()\n );\n this.__length -= deleteCount;\n }\n\n reverse(): Array {\n for (var front: usize = 0, back: usize = this.__length - 1; front < back; ++front, --back) {\n var temp = load(this.__memory + front * sizeof());\n store(this.__memory + front * sizeof(), load(this.__memory + back * sizeof()));\n store(this.__memory + back * sizeof(), temp);\n }\n return this;\n }\n}\n\n@unmanaged\nexport class CArray {\n\n private constructor() {}\n\n @operator("[]")\n private __get(index: i32): T {\n if (index < 0) {\n throw new RangeError("Index out of range");\n }\n return load(changetype(this) + index * sizeof());\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n if (index < 0) {\n throw new RangeError("Index out of range");\n }\n store(changetype(this) + index * sizeof(), value);\n }\n}\n',"(lib)/builtins":'@builtin\nexport declare const NaN: f64; // | f32\n\n@builtin\nexport declare const Infinity: f64; // | f32\n\n@builtin\nexport declare function isNaN(value: T): bool;\n\n@builtin\nexport declare function isFinite(value: T): bool;\n\n@builtin\nexport declare function clz(value: T): T;\n\n@builtin\nexport declare function ctz(value: T): T;\n\n@builtin\nexport declare function popcnt(value: T): T;\n\n@builtin\nexport declare function rotl(value: T, shift: T): T;\n\n@builtin\nexport declare function rotr(value: T, shift: T): T;\n\n@builtin\nexport declare function abs(value: T): T;\n\n@builtin\nexport declare function max(left: T, right: T): T;\n\n@builtin\nexport declare function min(left: T, right: T): T;\n\n@builtin\nexport declare function ceil(value: T): T;\n\n@builtin\nexport declare function floor(value: T): T;\n\n@builtin\nexport declare function copysign(left: T, right: T): T;\n\n@builtin\nexport declare function nearest(left: T, right: T): T;\n\n@builtin\nexport declare function reinterpret(value: void): T;\n\n@builtin\nexport declare function sqrt(value: T): T;\n\n@builtin\nexport declare function trunc(value: T): T;\n\n@builtin\nexport declare function load(offset: usize, constantOffset?: usize): T;\n\n@builtin\nexport declare function store(offset: usize, value: void, constantOffset?: usize): T;\n\n@builtin\nexport declare function sizeof(): usize;\n\n@builtin\nexport declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n\n@builtin\nexport declare function unreachable(): void;\n\n@builtin\nexport declare function current_memory(): i32;\n\n@builtin\nexport declare function grow_memory(pages: i32): i32;\n\n// @builtin\n// export declare function move_memory(dest: usize, src: usize: n: usize): void;\n\n// @builtin\n// export declare function set_memory(dest: usize, value: u32, n: usize): void;\n\n@builtin\nexport declare function changetype(value: void): T;\n\n@builtin\nexport declare function assert(isTrueish: T, message?: string): T;\n\n@builtin\nexport declare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\n@builtin\ndeclare function i8(value: void): i8;\nnamespace i8 {\n export const MIN_VALUE: i8 = -128;\n export const MAX_VALUE: i8 = 127;\n}\nexport { i8 };\n\n@builtin\ndeclare function i16(value: void): i16;\nnamespace i16 {\n export const MIN_VALUE: i16 = -32768;\n export const MAX_VALUE: i16 = 32767;\n}\nexport { i16 };\n\n@builtin\ndeclare function i32(value: void): i32;\nnamespace i32 {\n export const MIN_VALUE: i32 = -2147483648;\n export const MAX_VALUE: i32 = 2147483647;\n}\nexport { i32 };\n\n@builtin\ndeclare function i64(value: void): i64;\nnamespace i64 {\n export const MIN_VALUE: i64 = -9223372036854775808;\n export const MAX_VALUE: i64 = 9223372036854775807;\n}\nexport { i64 };\n\n@builtin\ndeclare function isize(value: void): isize;\nnamespace isize {\n export const MIN_VALUE: isize = sizeof() == sizeof()\n ? -2147483648\n : -9223372036854775808;\n export const MAX_VALUE: isize = sizeof() == sizeof()\n ? 2147483647\n : 9223372036854775807;\n}\nexport { isize };\n\n@builtin\ndeclare function u8(value: void): u8;\nnamespace u8 {\n export const MIN_VALUE: u8 = 0;\n export const MAX_VALUE: u8 = 255;\n}\nexport { u8 };\n\n@builtin\ndeclare function u16(value: void): u16;\nnamespace u16 {\n export const MIN_VALUE: u16 = 0;\n export const MAX_VALUE: u16 = 65535;\n}\nexport { u16 };\n\n@builtin\ndeclare function u32(value: void): u32;\nnamespace u32 {\n export const MIN_VALUE: u32 = 0;\n export const MAX_VALUE: u32 = 4294967295;\n}\nexport { u32 };\n\n@builtin\ndeclare function u64(value: void): u64;\nnamespace u64 {\n export const MIN_VALUE: u64 = 0;\n export const MAX_VALUE: u64 = 18446744073709551615;\n}\nexport { u64 };\n\n@builtin\ndeclare function usize(value: void): usize;\nnamespace usize {\n export const MIN_VALUE: usize = 0;\n export const MAX_VALUE: usize = sizeof() == sizeof()\n ? 4294967295\n : 18446744073709551615;\n}\nexport { usize };\n\n@builtin\ndeclare function bool(value: void): bool;\nnamespace bool {\n export const MIN_VALUE: bool = 0;\n export const MAX_VALUE: bool = 1;\n}\nexport { bool };\n\n@builtin\ndeclare function f32(value: void): f32;\nnamespace f32 {\n export const MIN_VALUE: f32 = -3.40282347e+38;\n export const MAX_VALUE: f32 = 3.40282347e+38;\n export const MIN_SAFE_INTEGER: f32 = -16777215;\n export const MAX_SAFE_INTEGER: f32 = 16777215;\n export const EPSILON: f32 = 1.19209290e-07;\n}\nexport { f32 };\n\n@builtin\ndeclare function f64(value: void): f64;\nnamespace f64 {\n export const MIN_VALUE: f64 = -1.7976931348623157e+308;\n export const MAX_VALUE: f64 = 1.7976931348623157e+308;\n export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n export const EPSILON: f64 = 2.2204460492503131e-16;\n}\nexport{ f64 };\n\n@builtin\nexport declare const HEAP_BASE: usize;\n\n@builtin\nexport declare function start(): void;\n',"(lib)/error":'export class Error {\n\n name: string = "Error";\n message: string;\n stack: string = ""; // TODO\n\n constructor(message: string = "") {\n this.message = message;\n }\n}\n\nexport class RangeError extends Error {\n name: string = "RangeError";\n}\n\nexport class TypeError extends Error {\n name: string = "TypeError";\n}\n',"(lib)/iterator":'// export abstract class Iterator {\n// abstract get done(): bool;\n// abstract next(): T;\n// }\n',"(lib)/map":'export class Map {\n\n private __keys: K[] = [];\n private __values: V[] = [];\n\n // FIXME: not a proper map implementation, just a filler\n\n get size(): i32 {\n return this.__keys.length;\n }\n\n get(key: K): V | null {\n var keys = this.__keys;\n for (var i = 0, k = keys.length; i < k; ++i) {\n if (keys[i] == key) {\n return this.__values[i];\n }\n }\n return null;\n }\n\n has(key: K): bool {\n var keys = this.__keys;\n for (var i = 0, k = keys.length; i < k; ++i) {\n if (keys[i] == key) {\n return true;\n }\n }\n return false;\n }\n\n set(key: K, value: V): void {\n this.__keys.push(key);\n this.__values.push(value);\n }\n\n clear(): void {\n this.__keys.length = 0;\n this.__values.length = 0;\n }\n}\n',"(lib)/memory":'function copy_memory(dest: usize, src: usize, n: usize): void {\n // based on musl\'s implementation of memcpy\n // not a future instruction and sufficiently covered by the upcoming move_memory intrinsic\n\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1:\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n case 2:\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n case 3:\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\nexport function move_memory(dest: usize, src: usize, n: usize): void {\n // based on musl\'s implementation of memmove\n // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands\n\n if (dest == src) return;\n if (src + n <= dest || dest + n <= src) {\n copy_memory(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n) return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n) return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\nexport function set_memory(dest: usize, c: u8, n: usize): void {\n // based on musl\'s implementation of memset\n // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands\n\n // fill head and tail with minimal branching\n if (!n) return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2) return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6) return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8) return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8) return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24) return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function compare_memory(vl: usize, vr: usize, n: usize): i32 {\n // based on musl\'s implementation of memcmp\n // provided because there\'s no proposed alternative\n if (vl == vr) return 0;\n while (n && load(vl) == load(vr)) {\n n--;\n vl++;\n vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n',"(lib)/polyfills":'export function bswap(value: T): T {\n assert(sizeof() == 1 || sizeof() == 2 || sizeof() == 4 || sizeof() == 8);\n\n if (sizeof() == 2) {\n return bswap16(value);\n } else if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n } else if (sizeof() == 8) {\n var a: u64 = (value >> 8) & 0x00FF00FF00FF00FF;\n var b: u64 = (value & 0x00FF00FF00FF00FF) << 8;\n var v: u64 = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n}\n\nexport function bswap16(value: T): T {\n assert(sizeof() == 1 || sizeof() == 2 || sizeof() == 4);\n\n if (sizeof() == 2 || sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n}\n',"(lib)/regexp":'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',"(lib)/set":'// const prime1: u32 = 73;\n// const prime2: u32 = 5009;\n\nexport class Set {\n\n private __memory: usize;\n private __capacity: u32;\n private __size: u32;\n\n constructor() {\n this.__memory = 0;\n this.__capacity = this.__size = 0;\n }\n\n get size(): i32 {\n return this.__size;\n }\n\n // FIXME: not a proper set implementation, just a filler\n\n has(value: T): bool {\n assert(this != null);\n\n for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) {\n if (load(this.__memory + index * sizeof()) == value) {\n return true;\n }\n }\n return false;\n }\n\n add(value: T): Set {\n assert(this != null);\n\n if (this.__size >= this.__capacity) {\n var newCapacity = max(this.__capacity << 1, 8);\n var newMemory = allocate_memory(newCapacity * sizeof());\n if (this.__memory) {\n move_memory(newMemory, this.__memory, this.__capacity * sizeof());\n free_memory(this.__memory);\n }\n this.__capacity = newCapacity;\n this.__memory = newMemory;\n }\n store(this.__memory + this.__size * sizeof(), value);\n ++this.__size;\n return this;\n }\n\n delete(value: T): bool {\n assert(this != null);\n\n for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) {\n if (load(this.__memory + index * sizeof()) == value) {\n if (index + 1 < this.__size) {\n move_memory(\n this.__memory + index * sizeof(),\n this.__memory + (index + 1) * sizeof(),\n this.__size - index - 1\n );\n }\n --this.__size;\n return true;\n }\n }\n return false;\n }\n\n clear(): void {\n assert(this != null);\n\n this.__size = 0;\n }\n\n // TODO: think about iterators\n}\n\n// class SetIterator extends Iterator {\n\n// get done(): bool {\n// throw new Error("not implemented");\n// }\n\n// next(): T {\n// throw new Error("not implemented");\n// }\n// }\n',"(lib)/string":'// singleton empty string\nconst EMPTY: String = changetype("");\n\n// number of bytes preceeding string data\nconst HEAD: usize = 4;\n\nfunction allocate(length: i32): String {\n assert(length > 0); // 0 -> EMPTY\n var ptr = allocate_memory(HEAD + (length << 1));\n store(ptr, length);\n return changetype(ptr);\n}\n\nexport class String {\n\n readonly length: i32;\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this != null);\n\n if (pos >= this.length) {\n return EMPTY;\n }\n\n var out = allocate(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEAD\n ),\n HEAD\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this != null);\n if (pos >= this.length) {\n return -1; // (NaN)\n }\n return load(\n changetype(this) + (pos << 1),\n HEAD\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this != null);\n if (pos >= this.length) {\n return -1; // (undefined)\n }\n var first = load(\n changetype(this) + (pos << 1),\n HEAD\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) {\n return first;\n }\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEAD\n );\n if (second < 0xDC00 || second > 0xDFFF) {\n return first;\n }\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (left == null) {\n left = changetype("null");\n }\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this != null);\n if (other == null) {\n other = changetype("null");\n }\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0) {\n return EMPTY;\n }\n var out = allocate(outLen);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD,\n thisLen << 1\n );\n move_memory(\n changetype(out) + HEAD + (thisLen << 1),\n changetype(other) + HEAD,\n otherLen << 1\n );\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = 0x7fffffff): bool {\n assert(this != null);\n if (searchString == null) {\n return false;\n }\n var end: isize = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0) {\n return false;\n }\n return !compare_memory(\n changetype(this) + HEAD + (start << 1),\n changetype(searchString) + HEAD,\n searchLength << 1\n );\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left == null) {\n return right == null;\n } else if (right == null) {\n return false;\n }\n var leftLength = left.length;\n if (leftLength != right.length) {\n return false;\n }\n return !compare_memory(\n changetype(left) + HEAD,\n changetype(right) + HEAD,\n (leftLength << 1)\n );\n }\n\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, position: i32 = 0): i32 {\n assert(this != null);\n if (searchString == null) {\n searchString = changetype("null");\n }\n var pos: isize = position;\n var len: isize = this.length;\n var start: isize = min(max(pos, 0), len);\n var searchLen: isize = searchString.length;\n\n // TODO: two-way, multiple char codes\n for (var k: usize = start; k + searchLen <= len; ++k) {\n if (!compare_memory(\n changetype(this) + HEAD + (k << 1),\n changetype(searchString) + HEAD,\n searchLen << 1)\n ) {\n return k;\n }\n }\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this != null);\n if (searchString == null) {\n searchString = changetype("null");\n }\n var pos: isize = position;\n var len: isize = this.length;\n var start: isize = min(max(pos, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len) {\n return false;\n }\n return !compare_memory(\n changetype(this) + HEAD + (start << 1),\n changetype(searchString) + HEAD,\n searchLength << 1\n );\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this != null);\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0) {\n intStart = max(size + intStart, 0);\n }\n var resultLength: isize = min(max(end, 0), size - intStart);\n if (resultLength <= 0) {\n return EMPTY;\n }\n var out = allocate(resultLength);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (intStart << 1),\n resultLength << 1\n );\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this != null);\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len) {\n return EMPTY;\n }\n if (!from && to == this.length) {\n return this;\n }\n var out = allocate(len);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (from << 1),\n len << 1\n );\n return out;\n }\n\n trim(): String {\n assert(this != null);\n var length: usize = this.length;\n while (\n length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (length << 1), HEAD)\n )\n ) {\n --length;\n }\n var start: usize = 0;\n while (\n start < length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEAD)\n )\n ) {\n ++start, --length;\n }\n if (!length) {\n return EMPTY;\n }\n if (!start && length == this.length) {\n return this;\n }\n var out = allocate(length);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (start << 1),\n length << 1\n );\n return out;\n }\n\n trimLeft(): String {\n assert(this != null);\n var start: isize = 0;\n var len: isize = this.length;\n while (\n start < len &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEAD)\n )\n ) {\n ++start;\n }\n if (!start) {\n return this;\n }\n var outLen = len - start;\n if (!outLen) {\n return EMPTY;\n }\n var out = allocate(outLen);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD + (start << 1),\n outLen << 1\n );\n return out;\n }\n\n trimRight(): String {\n assert(this != null);\n var len: isize = this.length;\n while (\n len > 0 &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (len << 1), HEAD)\n )\n ) {\n --len;\n }\n if (len <= 0) {\n return EMPTY;\n }\n if (len == this.length) {\n return this;\n }\n var out = allocate(len);\n move_memory(\n changetype(out) + HEAD,\n changetype(this) + HEAD,\n len << 1\n );\n return out;\n }\n}\n\nfunction isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n case 10: // \n case 13: // \n case 8232: // \n case 8233: // \n case 9: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 65279: // \n return true;\n default:\n return false;\n }\n}\n\nconst enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\nfunction parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len) {\n return NaN;\n }\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEAD);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len) {\n return NaN;\n }\n code = load(ptr += 2, HEAD);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) {\n return NaN;\n }\n code = load(ptr += 2, HEAD);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEAD)) {\n\n case CharCode.B:\n case CharCode.b:\n ptr += 4; len -= 2;\n radix = 2;\n break;\n\n case CharCode.O:\n case CharCode.o:\n ptr += 4; len -= 2;\n radix = 8;\n break;\n\n case CharCode.X:\n case CharCode.x:\n ptr += 4; len -= 2;\n radix = 16;\n break;\n\n default:\n radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36) {\n return NaN;\n }\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEAD);\n if (code >= CharCode._0 && code <= CharCode._9) {\n code -= CharCode._0;\n } else if (code >= CharCode.A && code <= CharCode.Z) {\n code -= CharCode.A - 10;\n } else if (code >= CharCode.a && code <= CharCode.z) {\n code -= CharCode.a - 10;\n } else {\n break;\n }\n if (code >= radix) {\n break;\n }\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len) {\n return NaN;\n }\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEAD);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len) {\n return NaN;\n }\n code = load(ptr += 2, HEAD);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) {\n return NaN;\n }\n code = load(ptr += 2, HEAD);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEAD);\n if (code == CharCode.DOT) {\n ptr += 2;\n var fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEAD);\n if (code == CharCode.E || code == CharCode.e) {\n assert(false); // TODO\n }\n code -= CharCode._0;\n if (code > 9) {\n break;\n }\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10) {\n break;\n }\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n'}:{},t.definitionFiles=t.isBundle?{assembly:'// Definitions for the "AssemblyScript" subset.\n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = any; // sic\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n export const MIN_VALUE: i8;\n export const MAX_VALUE: i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n export const MIN_VALUE: i16;\n export const MAX_VALUE: i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n export const MIN_VALUE: i32;\n export const MAX_VALUE: i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n export const MIN_VALUE: i64;\n export const MAX_VALUE: i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n export const MIN_VALUE: isize;\n export const MAX_VALUE: isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n export const MIN_VALUE: u8;\n export const MAX_VALUE: u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n export const MIN_VALUE: u16;\n export const MAX_VALUE: u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n export const MIN_VALUE: u32;\n export const MAX_VALUE: u32;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n export const MIN_VALUE: u64;\n export const MAX_VALUE: u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n export const MIN_VALUE: usize;\n export const MAX_VALUE: usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n export const MIN_VALUE: bool;\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n export const MIN_VALUE: f32;\n export const MAX_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n export const MIN_VALUE: f64;\n export const MAX_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n}\n\n// Built-ins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Returns the current memory size in units of pages. One page is 64kb. */\ndeclare function current_memory(): i32;\n/** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\ndeclare function grow_memory(value: i32): i32;\n/** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\ndeclare function move_memory(destination: usize, source: usize, n: usize): void;\n/** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\ndeclare function set_memory(destination: usize, value: u8, count: usize): void;\n/** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\ndeclare function compare_memory(vl: usize, vr: usize, n: usize): i32;\n/** Allocates a chunk of memory of the specified size and returns a pointer to it. */\ndeclare function allocate_memory(size: usize): usize;\n/** Disposes a chunk of memory by its pointer. */\ndeclare function free_memory(ptr: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified core or class type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n\n// Standard library (not yet implemented)\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): void;\n pop(): T;\n shift(): T;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): T[];\n splice(start: i32, deleteCount?: i32): void;\n reverse(): T[];\n}\n\n/** Class representing a C-like array of values of type `T` with limited capabilities. */\ndeclare class CArray {\n [key: number]: T;\n private constructor();\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(cp: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: u32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string): u32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n}\n\n// Internal decorators\n\n/** Annotates an element as a program global. */\ndeclare function global(target: Function, propertyKey: string, descriptor: any): void;\n\n/** Annotates a method as an operator overload. */\ndeclare function operator(token: string): (target: any, propertyKey: string, descriptor: any) => void;\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(target: Function): any;\n\n/** Annotates a class field with an explicit offset. */\ndeclare function offset(offset: usize): any;\n\n/** Annotates an element as begin built-in. */\ndeclare function builtin(target: Function): any;\n',portable:'// Definitions for the "portable AssemblyScript" subset.\n\n// Portable types\n\n// Note that semantic differences require additional explicit conversions for full compatibility.\n// For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n// result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n\n// Note that i64\'s are not portable (JS numbers are IEEE754 doubles with a maximum safe integer value\n// of 2^53-1) and instead require a compatibility layer to work in JS as well. See: src/util/i64.ts\n\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type bool = boolean;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n export const MIN_VALUE: i8;\n export const MAX_VALUE: i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n export const MIN_VALUE: i16;\n export const MAX_VALUE: i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n export const MIN_VALUE: i32;\n export const MAX_VALUE: i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n export const MIN_VALUE: isize;\n export const MAX_VALUE: isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n export const MIN_VALUE: u8;\n export const MAX_VALUE: u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n export const MIN_VALUE: u16;\n export const MAX_VALUE: u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n export const MIN_VALUE: u32;\n export const MAX_VALUE: u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n export const MIN_VALUE: usize;\n export const MAX_VALUE: usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n export const MIN_VALUE: bool;\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n}\n\n// Portable built-ins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Allocates a chunk of memory of the specified size and returns a pointer to it. */\ndeclare function allocate_memory(size: usize): usize;\n/** Disposes a chunk of memory by its pointer. */\ndeclare function free_memory(ptr: usize): void;\n/** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\ndeclare function move_memory(destination: usize, source: usize, n: usize): void;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n\n// Portable standard library\n// Everything marked @deprecated is a temporary filler. Do not use.\n\ndeclare const NaN: f32 | f64;\ndeclare const Infinity: f32 | f64;\n\ndeclare class Array {\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): void;\n pop(): T;\n shift(): T;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): T[];\n splice(start: i32, deleteCount?: i32): void;\n reverse(): T[];\n\n join(delim: string): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\ndeclare class String {\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(cp: i32): string;\n static fromCodePoints(arr: i32[]): string;\n readonly length: i32;\n private constructor();\n indexOf(subject: string, position?: i32): i32;\n includes(other: string): bool;\n lastIndexOf(subject: string, position?: i32): i32;\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n substring(from: i32, to?: i32): string;\n startsWith(subject: string): bool;\n endsWith(subject: string): bool;\n replace(search: string, replacement: string): string;\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\ndeclare class Error {\n constructor(message: string);\n message: string;\n stack: string | null;\n}\n\ndeclare class Symbol {\n private constructor();\n static readonly iterator: symbol;\n}\n\ndeclare class Set {\n constructor(entries?: T[]);\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n'}:{},t.main=function(r,h,m){function g(e){try{var t;return A.readCount++,A.readTime+=a(()=>{t=u.readFileSync(e,{encoding:'utf8'})}),t}catch(t){return null}}function b(e,t){try{return A.writeCount++,A.writeTime+=a(()=>{'string'==typeof t?u.writeFileSync(e,t,{encoding:'utf8'}):u.writeFileSync(e,t)}),!0}catch(t){return!1}}function y(e){var t;try{return A.readTime+=a(()=>{t=i(!function(){var t=new Error('Cannot find module "glob"');throw t.code='MODULE_NOT_FOUND',t}()).sync('*.ts',{cwd:e})}),t}catch(t){return[]}}function _(e){_.used||(A.writeCount++,_.used=!0),A.writeTime+=a(()=>{'string'==typeof e?v.write(e,{encoding:'utf8'}):v.write(e)})}'function'==typeof h?(m=h,h={}):!h&&(h={});const v=h.stdout||e.stdout,z=h.stderr||e.stderr,T=h.readFile||g,E=h.writeFile||b,x=h.listFiles||y,A=h.stats||n();if(!v)throw Error('\'options.stdout\' must be specified');if(!z)throw Error('\'options.stderr\' must be specified');if(!u.readFileSync){if(T===g)throw Error('\'options.readFile\' must be specified');if(E===b)throw Error('\'options.writeFile\' must be specified');if(x===y)throw Error('\'options.listFiles\' must be specified')}const S=s(r),k=24;if(m||(m=function(e){var t=0;return e&&(z.write(e.stack+f.EOL),t=1),t}),S.version)return v.write('Version '+t.version+(p?'-dev':'')+f.EOL),m(null);if(S.help||1>S._.length){const e=[];return Object.keys(t.options).forEach((i)=>{var r=t.options[i],s=' ';for(s+='--'+i,r.aliases&&1===r.aliases[0].length&&(s+=', -'+r.aliases[0]);s.length{for(let t=0;t hello.wasm','','Options:'].concat(e).join(f.EOL)+f.EOL),m(null)}const I=S.baseDir?c.resolve(S.baseDir):e.cwd(),L=c.join('.','..','std','assembly'),w=S.noLib?[]:[L];S.lib&&('string'==typeof S.lib&&(S.lib=S.lib.split(',')),Array.prototype.push.apply(w,S.lib.map(trim)));var F=null;for(let e=0,i=S._.length;e{F=d.parseFile(s,r,!0,F)});null!=(r=F.nextFile());){if(r.startsWith(t.libraryPrefix)){for(let e=0,i=w.length;e{d.parseFile(s,r,!1,F)})}if(o(F,z))return m(Error('Parse error'))}var M=!1;S.noLib||Object.keys(t.libraryFiles).forEach((e)=>{e.lastIndexOf('/')>=t.libraryPrefix.length||(A.parseCount++,A.parseTime+=a(()=>{F=d.parseFile(t.libraryFiles[e],e+'.ts',!1,F)}),M=!0)});for(let e=0,i=w.length;e{F=d.parseFile(o,t.libraryPrefix+s,!1,F)})}}const C=d.createOptions();d.setTarget(C,0),d.setNoTreeShaking(C,!!S.noTreeShaking),d.setNoAssert(C,!!S.noAssert),d.setNoMemory(C,!!S.noMemory),d.setMemoryBase(C,S.memoryBase>>>0),d.setSourceMap(C,null!=S.sourceMap);var B;A.compileCount++;try{A.compileTime+=a(()=>{B=d.compile(F,C)})}catch(t){return m(t)}if(o(F,z))return B&&B.dispose(),m(Error('Compile error'));if(S.validate&&(A.validateCount++,A.validateTime+=a(()=>{if(!B.validate())return B.dispose(),m(Error('Validate error'))})),'clamp'===S.trapMode)A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(['trap-mode-clamp'])});else if('js'===S.trapMode)A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(['trap-mode-js'])});else if('allow'!==S.trapMode)return B.dispose(),m(Error('Unsupported trap mode'));var N=-1,R=0,P=!S.noDebug;!1!==S.optimize&&('number'==typeof S.optimize?N=S.optimize:S[0]?N=0:S[1]?N=1:S[2]?N=2:S[3]?N=3:!0===S.optimize?(N=t.defaultOptimizeLevel,R=t.defaultShrinkLevel):N=0),S.s?R=1:S.z&&(R=2),'number'==typeof S.optimizeLevel&&(N=S.optimizeLevel),'number'==typeof S.shrinkLevel?R=S.shrinkLevel:'s'===S.shrinkLevel?R=1:'z'===S.shrinkLevel&&(R=2),B.setOptimizeLevel(0{0>O.indexOf(e)&&O.push(e)})),0<=N&&(A.optimizeCount++,A.optimizeTime+=a(()=>{B.optimize()})),O.length&&(A.optimizeCount++,A.optimizeTime+=a(()=>{B.runPasses(O.map((e)=>e.trim()))})),!S.noEmit){let e=!1;if(null!=S.outFile&&(/\.was?t$/.test(S.outFile)&&null==S.textFile?S.textFile=S.outFile:/\.js$/.test(S.outFile)&&null==S.asmjsFile?S.asmjsFile=S.outFile:null==S.binaryFile&&(S.binaryFile=S.outFile)),null!=S.binaryFile){let i,r=null==S.sourceMap?null:S.sourceMap.length?S.sourceMap:c.basename(S.binaryFile)+'.map';if(A.emitCount++,A.emitTime+=a(()=>{i=B.toBinary(r)}),S.binaryFile.length?E(c.join(I,S.binaryFile),i.output):(_(i.output),e=!0),null!=i.sourceMap)if(S.binaryFile.length){let e=JSON.parse(i.sourceMap);e.sourceRoot=t.sourceMapRoot,e.sources.forEach((r,i)=>{let s=null;if(r.startsWith(t.libraryPrefix))for(let e=0,i=w.length;e{t=B.toText()}),E(c.join(I,S.textFile),t)):!e&&(A.emitCount++,A.emitTime+=a(()=>{t=B.toText()}),_(t),e=!0)}if(null!=S.asmjsFile){let t;S.asmjsFile.length?(A.emitCount++,A.emitTime+=a(()=>{t=B.toAsmjs()}),E(c.join(I,S.asmjsFile),t)):!e&&(A.emitCount++,A.emitTime+=a(()=>{t=B.toAsmjs()}),_(t),e=!0)}}return B.dispose(),S.measure&&l(A,z),m(null)},t.parseArguments=s,t.checkDiagnostics=o,t.createStats=n,e.hrtime||(e.hrtime=i(15)),t.measure=a,t.printStats=l,t.createMemoryStream=function(e){var t=[];return t.write=function(t){'string'==typeof t?this.push(r.from(t,'utf8')):this.push(t),e&&e(t)},t.toBuffer=function(){return r.concat(this)},t.toString=function(){return this.toBuffer().toString('utf8')},t},t.tscOptions={alwaysStrict:!0,noImplicitAny:!0,noImplicitReturns:!0,noImplicitThis:!0,noEmitOnError:!0,strictNullChecks:!0,experimentalDecorators:!0,target:'esnext',module:'commonjs',noLib:!0,types:[],allowJs:!1}}).call(t,i(0),i(5).Buffer)},function(e,t,i){'use strict';(function(e){function n(){return l.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(e,t){if(n()e)throw new RangeError('"size" argument must not be negative')}function f(e,t,i,r){return c(t),0>=t?a(e,t):void 0===i?a(e,t):'string'==typeof r?a(e,t).fill(i,r):a(e,t).fill(i)}function d(e,t){if(c(t),e=a(e,0>t?0:0|b(t)),!l.TYPED_ARRAY_SUPPORT)for(var r=0;rt.length?0:0|b(t.length);e=a(e,r);for(var s=0;si||t.byteLength=n())throw new RangeError('Attempt to allocate Buffer larger than maximum size: 0x'+n().toString(16)+' bytes');return 0|e}function y(e,t){if(l.isBuffer(e))return e.length;if('undefined'!=typeof ArrayBuffer&&'function'==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;'string'!=typeof e&&(e=''+e);var i=e.length;if(0===i)return 0;for(var r=!1;;)switch(t){case'ascii':case'latin1':case'binary':return i;case'utf8':case'utf-8':case void 0:return Z(e).length;case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':return 2*i;case'hex':return i>>>1;case'base64':return K(e).length;default:if(r)return Z(e).length;t=(''+t).toLowerCase(),r=!0;}}function _(e,t,i){var r=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return'';if((void 0===i||i>this.length)&&(i=this.length),0>=i)return'';if(i>>>=0,t>>>=0,i<=t)return'';for(e||(e='utf8');;)switch(e){case'hex':return B(this,t,i);case'utf8':case'utf-8':return w(this,t,i);case'ascii':return M(this,t,i);case'latin1':case'binary':return C(this,t,i);case'base64':return L(this,t,i);case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':return N(this,t,i);default:if(r)throw new TypeError('Unknown encoding: '+e);e=(e+'').toLowerCase(),r=!0;}}function v(e,t,r){var s=e[t];e[t]=e[r],e[r]=s}function z(e,t,i,r,s){if(0===e.length)return-1;if('string'==typeof i?(r=i,i=0):2147483647i&&(i=-2147483648),i=+i,isNaN(i)&&(i=s?0:e.length-1),0>i&&(i=e.length+i),i>=e.length){if(s)return-1;i=e.length-1}else if(0>i)if(s)i=0;else return-1;if('string'==typeof t&&(t=l.from(t,r)),l.isBuffer(t))return 0===t.length?-1:T(e,t,i,r,s);if('number'==typeof t)return t&=255,l.TYPED_ARRAY_SUPPORT&&'function'==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(e,t,i):Uint8Array.prototype.lastIndexOf.call(e,t,i):T(e,[t],i,r,s);throw new TypeError('val must be string, number or Buffer')}function T(e,t,r,s,o){function n(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}var a=1,l=e.length,u=t.length;if(void 0!==s&&(s=(s+'').toLowerCase(),'ucs2'===s||'ucs-2'===s||'utf16le'===s||'utf-16le'===s)){if(2>e.length||2>t.length)return-1;a=2,l/=2,u/=2,r/=2}var c;if(o){var i=-1;for(c=r;cl&&(r=l-u),c=r;0<=c;c--){for(var f=!0,d=0;do&&(s=o)):s=o;var n=t.length;if(0!=n%2)throw new TypeError('Invalid hex string');s>n/2&&(s=n/2);for(var a,l=0;li&&(a=i):2==l?(u=e[n+1],128==(192&u)&&(d=(31&i)<<6|63&u,127d||57343d&&(a=d))):void 0}null===a?(a=65533,l=1):65535>>10),a=56320|1023&a),o.push(a),n+=l}return F(o)}function F(e){var t=e.length;if(t<=ie)return Q.apply(String,e);for(var r='',s=0;st)&&(t=0),(!r||0>r||r>s)&&(r=s);for(var o='',n=t;ne)throw new RangeError('offset is not uint');if(e+t>i)throw new RangeError('Trying to access beyond buffer length')}function P(e,t,i,r,s,o){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>s||te.length)throw new RangeError('Index out of range')}function O(e,t,r,o){0>t&&(t=65535+t+1);for(var n=0,i=s(e.length-r,2);n>>8*(o?n:1-n)}function U(e,t,r,o){0>t&&(t=4294967295+t+1);for(var n=0,i=s(e.length-r,4);n>>8*(o?n:3-n)}function D(e,t,i,r){if(i+r>e.length)throw new RangeError('Index out of range');if(0>i)throw new RangeError('Index out of range')}function V(e,t,i,r,s){return s||D(e,t,i,4,34028234663852886e22,-34028234663852886e22),ee.write(e,t,i,r,23,4),i+4}function j(e,t,i,r,s){return s||D(e,t,i,8,17976931348623157e292,-17976931348623157e292),ee.write(e,t,i,r,52,8),i+8}function H(e){if(e=X(e).replace(re,''),2>e.length)return'';for(;0!=e.length%4;)e+='=';return e}function X(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,'')}function Y(e){return 16>e?'0'+e.toString(16):e.toString(16)}function Z(e,t){t=t||Infinity;for(var r,s=e.length,o=null,n=[],a=0;ar){if(!o){if(56319r){-1<(t-=3)&&n.push(239,191,189),o=r;continue}r=(o-55296<<10|r-56320)+65536}else o&&-1<(t-=3)&&n.push(239,191,189);if(o=null,128>r){if(0>(t-=1))break;n.push(r)}else if(2048>r){if(0>(t-=2))break;n.push(192|r>>6,128|63&r)}else if(65536>r){if(0>(t-=3))break;n.push(224|r>>12,128|63&r>>6,128|63&r)}else if(1114112>r){if(0>(t-=4))break;n.push(240|r>>18,128|63&r>>12,128|63&r>>6,128|63&r)}else throw new Error('Invalid code point')}return n}function G(e){for(var t=[],r=0;r(t-=2));++a)r=e.charCodeAt(a),s=r>>8,o=r%256,n.push(o),n.push(s);return n}function K(e){return $.toByteArray(H(e))}function q(e,t,r,s){for(var o=0;o=t.length||o>=e.length);++o)t[o+r]=e[o];return o}function J(e){return e!==e}var Q=String.fromCharCode,$=i(6),ee=i(7),te=i(8);/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh diff --git a/dist/assemblyscript.js.map b/dist/assemblyscript.js.map index 8b00bb1e..d8c17464 100644 --- a/dist/assemblyscript.js.map +++ b/dist/assemblyscript.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///assemblyscript.js","webpack:///webpack/bootstrap 8abb22f57846a456c1cd","webpack:///./src/module.ts","webpack:///./src/diagnostics.ts","webpack:///./src/program.ts","webpack:///(webpack)/buildin/global.js","webpack:///./src/compiler.ts","webpack:///./src/types.ts","webpack:///./src/ast.ts","webpack:///./src/tokenizer.ts","webpack:///./src/diagnosticMessages.generated.ts","webpack:///./src/util/charcode.ts","webpack:///./src/util/path.ts","webpack:///./src/glue/js/index.ts","webpack:///./std/portable.js","webpack:///./src/glue/js/binaryen.js","webpack:///external \"binaryen\"","webpack:///./src/builtins.ts","webpack:///./src/glue/js/i64.js","webpack:///./node_modules/long/src/long.js","webpack:///./src/index.ts","webpack:///./src/decompiler.ts","webpack:///./src/parser.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE_15__","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","allocU8Array","u8s","ptr","allocate_memory","length","idx","k","store","allocI32Array","i32s","val","stringLengthUTF8","str","len","u","charCodeAt","allocString","readInt","load","readBuffer","ret","Uint8Array","readString","cp","u1","u2","u3","u4","u5","arr","Array","push","String","fromCodePoints","value","NativeType","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeUnreachable","_BinaryenTypeAuto","ExpressionId","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallImportId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenPageSize","_BinaryenCurrentMemory","_BinaryenGrowMemory","_BinaryenHasFeature","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","MemorySegment","create","buffer","offset","segment","Module","ref","_BinaryenModuleCreate","out","createFrom","cArr","_BinaryenModuleRead","free_memory","changetype","addFunctionType","result","paramTypes","cStr","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","createI32","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createUnary","op","expr","_BinaryenUnary","createBinary","left","right","_BinaryenBinary","createHost","operands","_BinaryenHost","createGetLocal","index","type","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","bytes","signed","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","label","children","None","_BinaryenBlock","createBreak","condition","_BinaryenBreak","createDrop","expression","_BinaryenDrop","createLoop","body","_BinaryenLoop","createIf","ifTrue","ifFalse","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","strs","_BinaryenSwitch","createCall","target","returnType","_BinaryenCall","createCallImport","_BinaryenCallImport","createUnreachable","_BinaryenUnreachable","addGlobal","mutable","initializer","_BinaryenAddGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addFunctionExport","internalName","externalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","removeImport","_BinaryenRemoveImport","setMemory","initial","maximum","segments","exportName","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","binaryBytes","Binary","output","sourceMap","toText","Error","toAsmjs","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","i32","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","_BinaryenExpressionGetType","I32","_BinaryenConstGetValueI32","I64","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","F32","_BinaryenConstGetValueF32","F64","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","setDebugLocation","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","MAX_MEMORY_WASM32","relooper","_RelooperCreate","createStub","addBlock","code","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","diagnosticCategoryToString","category","DiagnosticCategory","INFO","WARNING","ERROR","diagnosticCategoryToColor","colorBlue","colorYellow","colorRed","formatDiagnosticMessage","message","useColors","showContext","context","range","formatDiagnosticContext","sb","colorReset","toString","source","normalizedPath","line","column","join","text","start","end","charcode_1","isLineBreak","substring","diagnosticMessages_generated_1","diagnosticMessages_generated_2","DiagnosticCode","diagnosticCodeToString","DiagnosticMessage","arg0","arg1","replace","createInfo","createWarning","createError","withRange","DiagnosticEmitter","diagnostics","emitDiagnostic","error","info","warning","__extends","extendStatics","setPrototypeOf","__proto__","b","__","constructor","__values","Symbol","iterator","next","done","__read","r","e","ar","diagnostics_1","types_1","ast_1","module_1","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","QueuedExport","QueuedImport","noTypesYet","Map","Program","_super","_this","diagnosticsOffset","elements","types","typeAliases","sources","initialize","options","Type","i8","i16","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","queuedExports","queuedImports","queuedDerivedClasses","statements","j","statement","kind","NodeKind","CLASSDECLARATION","initializeClass","ENUMDECLARATION","initializeEnum","EXPORT","initializeExports","FUNCTIONDECLARATION","initializeFunction","IMPORT","initializeImports","INTERFACEDECLARATION","initializeInterface","NAMESPACEDECLARATION","initializeNamespace","TYPEDECLARATION","initializeTypeAlias","VARIABLE","initializeVariables","element","queuedImport","tryResolveImport","referencedName","set","splice","referencedNameAlt","Module_0_has_no_exported_member_1","declaration","parent","path","queuedExports_1","queuedExports_1_1","_a","queuedExport","currentExport","isReExport","member","setExportAndCheckLibrary","Cannot_find_name_0","e_1_1","e_1","_b","return","derivedDeclaration","derivedType","assert","extendsType","resolved","resolveIdentifier","ElementKind","CLASS_PROTOTYPE","A_class_may_only_extend_another_class","basePrototype","checkInternalDecorators","isBuiltin","hasDecorator","decorators","ElementFlags","BUILTIN","isLibrary","is","EXPORTED","SOURCE","GLOBAL","has","Duplicate_identifier_0","namespace","fileLevelInternalName","ClassPrototype","isUnmanaged","implementsTypes","Structs_cannot_implement_interfaces","Range","members","Export_declaration_conflicts_with_exported_declaration_of_0","memberDeclarations","memberDeclaration","FIELDDECLARATION","initializeField","METHODDECLARATION","isGetter","hasModifier","ModifierKind","GET","modifiers","SET","initializeAccessor","initializeMethod","instance","resolve","classPrototype","STATIC","staticField","Global","instanceMembers","instanceField","FieldPrototype","CONSTRUCTOR","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperators","decorator","decoratorKind","Operation_not_supported","numArgs","arguments","firstArg","LITERAL","literalKind","fnIndexedGet","simpleName","fnIndexedSet","fnConcat","fnEquals","String_literal_expected","Expected_0_arguments_but_got_1","propertyName","internalPropertyName","propertyElement","PROPERTY","getterPrototype","setterPrototype","Property","staticName","staticPrototype","instanceName","instancePrototype","enm","Enum","values","initializeEnumValue","EnumValue","initializeExport","internalPath","identifier","referencedElement","seen","Set","add","declarations","initializeImport","namespaceName","indexPart","endsWith","InterfacePrototype","queuedExtendingClasses","parentNamespace","Namespace","alias","global","resolveType","node","contextualTypeArguments","reportNotFound","localName","resolveInclTypeArguments","typeArguments","paramType","instanceKey","typesToString","placeholderType","resolveTypeArguments","typeParameters","typeArgumentNodes","alternativeReportNode","parameterCount","argumentCount","Expected_0_type_arguments_but_got_1","atEnd","contextualFunction","contextualEnum","ENUMVALUE","resolvedElement","ResolvedElement","flow","getScopedLocal","resolvePropertyAccess","propertyAccess","targetExpression","resolveExpression","targetType","LOCAL","FIELD","classType","Property_0_does_not_exist_on_type_1","CLASS","withTarget","base","resolveElementAccess","elementAccess","indexedGet","indexedGetName","FUNCTION_PROTOTYPE","Index_signature_is_missing_in_type_0","PARENTHESIZED","ASSERTION","toType","BINARY","THIS","instanceMethodOf","_this_cannot_be_referenced_in_current_location","SUPER","_super_can_only_be_referenced_in_a_derived_class","IDENTIFIER","PROPERTYACCESS","ELEMENTACCESS","CALL","Element","program","flags","NONE","flag","NAMESPACE","modifierKind","IMPORTED","DECLARE","DECLARED","ENUM","CONST","CONSTANT","constantValue","enum","ConstantValueKind","VariableLikeElement","apply","constantValueKind","withConstantIntegerValue","lo","hi","constantIntegerValue","i64_new","INLINED","withConstantFloatValue","constantFloatValue","LET","SCOPED","READONLY","PUBLIC","PRIVATE","PROTECTED","Parameter","Local","instances","classTypeArguments","GETTER","SETTER","ABSTRACT","GENERIC","INSTANCE","functionTypeArguments","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","inheritedName","inheritedType","e_2_1","e_2","classDeclaration","classTypeParameters","functionTypeParameters","parameters","typeNode","parameterTypes","parameterDeclaration","parameterType","classInstance","Function","reportNode","resolvedTypeArguments","resolvePartial","partialPrototype","FUNCTION","locals","additionalLocals","breakContext","debugLocations","nextBreakId","breakStack","tempI32s","tempI64s","tempF32s","tempF64s","localIndex","_c","e_3_1","e_3","_d","parameter","parameterName","Flow","addLocal","local","getTempLocal","temps","toNativeType","pop","freeTempLocal","getAndFreeTempLocal","enterBreakContext","id","leaveBreakContext","finalize","debugLocation","debugInfoRef","debugInfoIndex","toTypeString","FIELD_PROTOTYPE","Field","memoryOffset","UNMANAGED","inheritedTypeArguments_2","inheritedTypeArguments_2_1","e_4_1","e_4","baseClass","baseClassType","Structs_cannot_extend_classes_and_vice_versa","Class","currentMemoryOffset","inheritedMember","e_5_1","e_5","_e","partialConstructor","constructorInstance","_f","_g","fieldDeclaration","fieldType","fieldInstance","byteSize","methodPrototype","instanceProperty","e_6_1","e_6","_h","asClass","baseName","baseType","e_7_1","e_7","INTERFACE_PROTOTYPE","Interface","INTERFACE","FlowFlags","scopedLocals","currentFunction","parentFlow","continueLabel","breakLabel","enterBranchOrScope","branchFlow","leaveBranchOrScope","scopedLocal","e_8_1","e_8","addScopedLocal","current","g","eval","window","makeSmallIntegerWrap","ShrI32","ShlI32","AndI32","makeIsFalseish","EqzI32","EqzI64","size","EqF32","EqF64","makeIsTrueish","NeI32","NeI64","NeF32","NeF64","builtins_1","program_1","tokenizer_1","Options","WASM32","noTreeShaking","noAssert","noMemory","memoryBase","allocateImpl","freeImpl","usize64","usize32","isize64","isize32","ConversionKind","Compiler","startFunctionBody","currentEnum","currentType","memorySegments","stringSegments","files","max","compile","startFunctionPrototype","startFunctionInstance","START","startFunction","isEntry","compileSource","typeRef","typesToNativeTypes","i64_align","isWasm64","pages","i64_shr_u","compileSourceByPath","normalizedPathWithoutExtension","File_0_not_found","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFunction","compileStatement","compileGlobalDeclaration","compileGlobal","COMPILED","initExpr","resolvedType","Type_0_is_not_assignable_to_type_1","Type_expected","compileExpression","nativeType","initializeInStart","compileInlineConstant","precomputeExpressionRef","Compiling_constant_with_non_constant_initializer_as_mutable","toNativeZero","setExpr","exprType","isTopLevel","isTopLevelExport","programLevelInternalName","compileEnum","previousValue","initInStart","valueDeclaration","AddI32","Cannot_export_a_mutable_global","compileFunctionUsingTypeArguments","compileFunction","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","stmts","compileStatements","allBranchesReturn","A_function_whose_declared_type_is_not_void_must_return_a_value","numParameters","numParametersInclThis","paramIndex","nativeResultType","nativeParamTypes","signatureNameParts","toSignatureString","compileInterfaceDeclaration","compileNamespace","ns","compileClassUsingTypeArguments","internalExportName","functionInstance","functionDeclaration","needsExplicitExport","globalDeclaration","compileClass","addMemorySegment","alignment","i64_add","BLOCK","compileBlockStatement","BREAK","compileBreakStatement","CONTINUE","compileContinueStatement","DO","compileDoStatement","EMPTY","compileEmptyStatement","EXPRESSION","compileExpressionStatement","FOR","compileForStatement","IF","compileIfStatement","RETURN","compileReturnStatement","SWITCH","compileSwitchStatement","THROW","compileThrowStatement","TRY","compileTryStatement","WHILE","compileWhileStatement","addDebugLocation","stmt","stmtReturns","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","previousBreakLabel","previousContinueLabel","incrementor","alwaysReturns","ifTrueReturns","ifFalseReturns","tempLocal","cases","breaks","breakIndex","defaultIndex","case_","EqI32","currentBlock","fallsThrough","nextLabel","isKnownGlobal","initializers","init","_const_declarations_must_be_initialized","compileAssignmentWithValue","contextualType","shift","computeSmallIntegerShift","mask","computeSmallIntegerMask","conversionKind","wrapSmallIntegers","compileAssertionExpression","compileBinaryExpression","compileCallExpression","COMMA","compileCommaExpression","compileElementAccessExpression","FALSE","NULL","TRUE","compileIdentifierExpression","compileLiteralExpression","NEW","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","TERNARY","compileTernaryExpression","UNARYPOSTFIX","compileUnaryPostfixExpression","UNARYPREFIX","compileUnaryPrefixExpression","convertExpression","precomputeExpression","funcRef","_BinaryenFunctionGetBody","fromType","mod","losesInformation","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast","compound","possiblyOverflows","operator","Token","LESSTHAN","LtI32","LtI64","LtU32","LtU64","LtF32","LtF64","GREATERTHAN","GtI32","GtI64","GtU32","GtU64","GtF32","GtF64","LESSTHAN_EQUALS","LeI32","LeI64","LeU32","LeU64","LeF32","LeF64","GREATERTHAN_EQUALS","GeI32","GeI64","GeU32","GeU64","GeF32","GeF64","EQUALS_EQUALS_EQUALS","EQUALS_EQUALS","EqI64","EXCLAMATION_EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS","compileAssignment","PLUS_EQUALS","PLUS","AddI64","AddF32","AddF64","MINUS_EQUALS","MINUS","SubI32","SubI64","SubF32","SubF64","ASTERISK_EQUALS","ASTERISK","MulI32","MulI64","MulF32","MulF64","SLASH_EQUALS","SLASH","DivI32","DivI64","DivU32","DivU64","DivF32","DivF64","PERCENT_EQUALS","PERCENT","RemI32","RemI64","RemU32","RemU64","LESSTHAN_LESSTHAN_EQUALS","LESSTHAN_LESSTHAN","ShlI64","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN","ShrI64","ShrU32","ShrU64","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND_EQUALS","AMPERSAND","AndI64","BAR_EQUALS","BAR","OrI32","OrI64","CARET_EQUALS","CARET","XorI32","XorI64","AMPERSAND_AMPERSAND","BAR_BAR","valueExpression","elementType","setterInstance","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","resolvedIndexedSet","valueWithCorrectType","tee","targetExpr","globalNativeType","isReadonly","elementNativeType","makeCall","getterInstance","resolvedIndexedGet","indexedSet","indexedSetName","elementExpr","elementExpression","Index_signature_in_type_0_only_permits_reading","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","functionPrototype","compileCall","numArguments","numArgumentsInclThis","argumentIndex","args","argumentExpressions","thisArg","operandIndex","Expected_at_least_0_arguments_but_got_1","expressions","exprs","compileGetConstant","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileStaticArray","elementExpressions","floatValue","intValue","i64_sub","i64_is_i8","i64_is_i16","i64_is_i32","i64_is_u8","i64_is_u16","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStaticString","stringValue","stringSegment","stringLength","stringBuffer","stringOffset","isStatic","Int32Array","Float32Array","Float64Array","thisExpr","compileAllocate","field","nativeSizeType","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","ifThen","ifElse","nativeOne","getValue","operand","PLUS_PLUS","toNativeOne","MINUS_MINUS","setValue","isReference","NegF32","NegF64","EXCLAMATION","TILDE","toNativeNegOne","TYPEOF","TypeKind","TypeFlags","nullableType","ceil","nonNullableType","asFunction","asNullable","kindOnly","setReusableModifiers","reusableModifiers","createModifiers","addModifier","modifier","getModifier","getFirstDecorator","mangleInternalName","asGlobal","VARIABLEDECLARATION","mangleInternalPath","setParent","nodes","setParentOpt","path_1","Node","createType","isNullable","TypeNode","createIdentifierExpression","IdentifierExpression","createArrayLiteralExpression","ArrayLiteralExpression","createAssertionExpression","assertionKind","AssertionExpression","createBinaryExpression","BinaryExpression","createCallExpression","typeArgs","CallExpression","createCommaExpression","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","ElementAccessExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","BlockStatement","createBreakStatement","BreakStatement","createClassDeclaration","ClassDeclaration","createContinueStatement","ContinueStatement","createDecorator","Decorator","createDoStatement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","ExportStatement","normalize","startsWith","createExportImportStatement","ExportImportStatement","createExportMember","elem","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","IfStatement","createImportStatement","decls","ImportStatement","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","ForStatement","createTypeParameter","TypeParameter","createParameter","parameterKind","createFunctionDeclaration","FunctionDeclaration","createMethodDeclaration","MethodDeclaration","createModifier","Modifier","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createWhileStatement","WhileStatement","TYPE","TYPEPARAMETER","Expression","LiteralKind","LiteralExpression","AssertionKind","UnaryExpression","Statement","SourceKind","Source","tokenizer","sourceKind","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","VariableLikeDeclarationStatement","DecoratorKind","DECORATOR","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","IMPORTDECLARATION","ParameterKind","PARAMETER","MODIFIER","SWITCHCASE","fromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","INSTANCEOF","IS","KEYOF","MODULE","OF","PACKAGE","VAR","VOID","WITH","YIELD","INVALID","isAlsoIdentifier","token","a","pos","Tokenizer","tokenPos","markedPos","markedToken","markedTokenPos","nextToken","nextTokenOnNewLine","preferIdentifier","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","ASTERISK_ASTERISK_EQUALS","ASTERISK_ASTERISK","isDecimalDigit","FLOATLITERAL","DOT_DOT_DOT","DOT","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordText","keywordToken","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skip","mark","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","i64_mul","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","parseFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","isUnicodeIdentifierStart","isUnicodeIdentifierPart","lookupInUnicodeMap","map","mid","unicodeIdentifierStart","unicodeIdentifierPart","CharCode","separator","ipos","origin","dirname","UnreachableError","captureStackTrace","stack","AssertionError","globalScope","defineProperties","MIN_VALUE","writable","Math","fround","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","EPSILON","clz32","abs","min","floor","sqrt","trunc","isTrueish","radix","parseInt","undefined","fromCodePoint","binaryen","Binaryen","key","_malloc","_free","move_memory","dest","src","_memmove","HEAPU8","previousPrint","print","x","_BinaryenModulePrint","_BinaryenModulePrintAsmjs","compiler","NaN","Infinity","arg2","tempLocal0","tempLocal1","AbsF32","AbsF64","ClzI32","ClzI64","CtzI32","CtzI64","PopcntI32","PopcntI64","RotlI32","RotlI64","RotrI32","RotrI64","MaxF32","MaxF64","MinF32","MinF64","CeilF32","CeilF64","FloorF32","FloorF64","CopysignF32","CopysignF64","NearestF32","NearestF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","SqrtF32","SqrtF64","TruncF32","TruncF64","evaluateConstantOffset","Type_0_is_not_generic","CurrentMemory","GrowMemory","abort","compileAbort","cls","Implementation_0_must_match_the_signature_1","abortPrototype","stringType","abortInstance","Long","fromBits","low","high","sub","mul","i64_div","div","i64_div_u","toUnsigned","toSigned","i64_rem","i64_rem_u","i64_and","and","i64_or","or","i64_xor","xor","i64_shl","shl","i64_shr","shr","shru","i64_not","not","fromInt","minSafeF32","fromNumber","maxSafeF32","gte","lte","minSafeF64","maxSafeF64","toNumber","i64_to_string","unsigned","isLong","obj","cachedObj","cache","UINT_CACHE","INT_CACHE","isNaN","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","fromString","RangeError","indexOf","radixToPower","pow_dbl","power","fromValue","wasm","WebAssembly","Instance","__isLong__","pow","TWO_PWR_16_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","toInt","isZero","isNegative","eq","radixLong","rem1","rem","remDiv","intval","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","other","notEquals","neq","ne","lessThan","comp","lt","lessThanOrEqual","le","greaterThan","gt","greaterThanOrEqual","ge","compare","thisNeg","otherNeg","negate","addend","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","divide","divisor","div_u","div_s","approx","res","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toBytes","toBytesLE","toBytesBE","fromBytes","fromBytesLE","fromBytesBE","parseFile","parser","parser_1","Parser","nextFile","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setNoMemory","setSourceMap","setMemoryBase","decompile","decompiler","decompiler_1","Decompiler","formatDiagnostic","nativeTypeToType","Unreachable","Auto","functionId","decompileFunction","_BinaryenFunctionGetName","_BinaryenFunctionGetNumParams","_BinaryenFunctionGetParam","_BinaryenFunctionGetResult","Block","decompileExpression","nested","string","_BinaryenBlockGetName","_BinaryenBlockGetNumChildren","_BinaryenBlockGetChild","If","_BinaryenIfGetCondition","_BinaryenIfGetIfTrue","_BinaryenIfGetIfFalse","Loop","_BinaryenLoopGetName","_BinaryenLoopGetBody","Break","_BinaryenBreakGetCondition","_BinaryenBreakGetName","Switch","Call","CallImport","CallIndirect","SetLocal","_BinaryenSetLocalGetIndex","_BinaryenSetLocalGetValue","SetGlobal","Store","_BinaryenStoreGetOffset","_BinaryenStoreGetPtr","_BinaryenStoreGetValue","Select","_BinaryenSelectGetIfTrue","_BinaryenSelectGetIfFalse","_BinaryenSelectGetCondition","Drop","_BinaryenDropGetValue","Return","_BinaryenReturnGetValue","Host","_BinaryenHostGetOp","_BinaryenHostGetOperand","Nop","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","determinePrecedenceStart","determinePrecedence","isRightAssociative","backlog","seenlog","tn","parseTopLevelStatement","isNamespaceMember","parseDecorator","Line_break_not_permitted_here","parseEnum","parseVariable","parseFunction","parseClass","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","parseStatement","Decorators_are_not_valid_here","clear","parseType","acceptParenthesized","suppressErrors","startPos","innerType","Identifier_expected","nullable","bracketStart","bracketRange","parseArguments","isDeclare","parseVariableDeclaration","parentModifiers","parentDecorators","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","parseEnumValue","parseReturn","parseTypeParameters","Type_parameter_list_cannot_be_empty","typeParameter","parseTypeParameter","parseParameters","seenRest","seenOptional","reportedRest","param","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","OPTIONAL","REST","isRest","isOptional","startRange","A_rest_parameter_cannot_be_optional","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseClassMember","parentIsDeclare","isConstructor","Type_parameters_cannot_appear_on_a_constructor_declaration","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","retMethod","Constructor_implementation_is_missing","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","parseBlockStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseWhileStatement","parseExpressionStatement","elseStatement","parseSwitchCase","_case_or_default_expected","parseExpressionStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","precedence","nextPrecedence","commaExprs","propertyCall","Precedence"],"mappings":"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,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCC,GACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QX+/UpD,SAAUlqD,EAAQD,EAASS,GAEjC,YYv0VA,SAAA28C,GAA0B/zB,GAKxB,IAJA,GAAIg7B,GAAM,EACNthD,EAAMsmB,EAAK/mB,OAGR+hD,EAAM,EAAIthD,GACK,IAApBsmB,EAAKpmB,WAAWohD,IAChBh7B,EAAKpmB,WAAWohD,EAAM,IAAMgG,GAE5BhG,GAAO,GAGLA,EAAM,GAAKthD,EAAMsmB,EAAK/mB,UACxB+mB,EAAOA,EAAK/G,UAAU+hC,EAAKthD,GAC3BA,GAAOshD,EACPA,EAAM,EAIR,KADA,GAAIpyB,GACGoyB,EAAM,EAAIthD,GAAK,CAIpB,GAHAkvB,GAAQ,EAIN5I,EAAKpmB,WAAWohD,IAAQgG,GACA,IAAxBhhC,EAAKpmB,WAAWohD,EAAM,GACtB,CAGA,IADApyB,EAAQoyB,EAAM,GAAKthD,IAEjBshD,EAAM,EAAIthD,GACVsmB,EAAKpmB,WAAWohD,EAAM,IAAMgG,EAC5B,CACAhhC,EAAO4I,EACH5I,EAAK/G,UAAU,EAAG+hC,GAClBh7B,EAAK/G,UAAU,EAAG+hC,GAAOh7B,EAAK/G,UAAU+hC,EAAM,GAClDthD,GAAO,CACP,UAKF,IADAkvB,EAAQoyB,EAAM,GAAKthD,IACkB,IAAxBsmB,EAAKpmB,WAAWohD,EAAM,IACjCA,EAAM,EAAIthD,GACc,IAAxBsmB,EAAKpmB,WAAWohD,EAAM,IACtBh7B,EAAKpmB,WAAWohD,EAAM,IAAMgG,EAC5B,CAGA,IADA,GAAIC,GAAOjG,IACFiG,GAAQ,GACf,GAAIjhC,EAAKpmB,WAAWqnD,IAASD,EAAW,CAClChG,EAAMiG,GAAQ,GACS,IAAzBjhC,EAAKpmB,WAAWqnD,EAAO,IACE,IAAzBjhC,EAAKpmB,WAAWqnD,EAAO,KAEvBjhC,EAAO4I,EACH5I,EAAK/G,UAAU,EAAGgoC,GAClBjhC,EAAK/G,UAAU,EAAGgoC,GAAQjhC,EAAK/G,UAAU+hC,EAAM,GACnDthD,GAAOshD,EAAM,EAAIiG,EACjBjG,EAAMiG,EAAO,EAEf,OAKJ,GAAIA,EAAO,GAAKjG,EAAM,IACT,GAAPA,GACgB,IAAlBh7B,EAAKpmB,WAAW,IACE,IAAlBomB,EAAKpmB,WAAW,IAChB,CACAomB,EAAOA,EAAK/G,UAAU+hC,EAAM,GAC5BthD,EAAMsmB,EAAK/mB,MACX,YAKR+hD,IAEF,MAAOthD,GAAM,EAAIsmB,EAAO,IAI1B,QAAA4D,GAAwBpL,EAAwB0oC,GAC9C,MAAI1oC,GAAew7B,WAAW,QACrBx7B,EAEFu7B,EACLoN,EAAQD,GAAUrmD,OAAO4jD,aAAauC,GAAaxoC,GAKvD,QAAA2oC,GAAwB3oC,GAEtB,IADA,GAAIwiC,GAAMxiC,EAAevf,SAChB+hD,EAAM,GACb,GAAIxiC,EAAe5e,WAAWohD,IAAQgG,EACpC,MAAOxoC,GAAeS,UAAU,EAAG+hC,EAGvC,OAAO,IZouVThjD,OAAOC,eAAetB,EAAS,cAAgBoE,OAAO,GY/0VtD,IAAMimD,GAAS,EAMfrqD,GAAAo9C,YAoFAp9C,EAAAitB,UAUAjtB,EAAAwqD,WZ80VM,SAAUvqD,EAAQD,EAASS,GAEjCA,EAAoB,IACpBR,EAAOD,QAAUS,EAAoB,KAK/B,SAAUR,EAAQD,EAASS,GAEjC,YAEAY,QAAOC,eAAetB,EAAS,cAAgBoE,OAAO,Ial8VtD3D,EAAA,IACAA,EAAA,IACAA,EAAA,Kbw8VM,SAAUR,EAAQD,EAASS,Ic18VjC,SAAAqwB,GAwGA,QAAA25B,KACAzuC,MAAA0uC,kBACA1uC,MAAA0uC,kBAAApqD,KAAAmqD,GAEAnqD,KAAAqqD,MAAArqD,KAAAY,KAAA,KAAAZ,KAAA6gB,QAAA,SAAAnF,QAAA2uC,MAWA,QAAAC,GAAAzpC,GACA7gB,KAAA6gB,WAAA,mBACAnF,MAAA0uC,kBACA1uC,MAAA0uC,kBAAApqD,KAAAsqD,GAEAtqD,KAAAqqD,MAAArqD,KAAAY,KAAA,KAAAZ,KAAA6gB,QAAA,SAAAnF,QAAA2uC,MA5HA,GAAAE,GAAA,mBAAA5sB,qBAAA,KAAAnN,MAAAzwB,IAEAgB,QAAAypD,iBACAD,EAAA,YAAAzmD,GAA0C,MAAAA,IAAA,SAE1C2mD,WAAgB3mD,OAAA,IAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,IAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,aAAAzmD,GAA4C,MAAAA,IAAA,SAE5C2mD,WAAgB3mD,OAAA,MAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,MAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,IAAAA,EAAA,eAAAzmD,GAAmE,SAAAA,IAEnE2mD,WAAgB3mD,OAAA,WAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,WAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,YAAAzmD,GAA0C,WAAAA,IAE1C2mD,WAAgB3mD,MAAA,EAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,IAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,aAAAzmD,GAA4C,aAAAA,IAE5C2mD,WAAgB3mD,MAAA,EAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,MAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,IAAAA,EAAA,eAAAzmD,GAAmE,MAAAA,KAAA,IAEnE2mD,WAAgB3mD,MAAA,EAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,WAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,cAAAzmD,GAA8C,QAAAA,IAE9C2mD,WAAgB3mD,MAAA,EAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,EAAA4mD,UAAA,KAGhB3pD,OAAAypD,iBACAD,EAAA,aAAAzmD,GAA4C,MAAA6mD,MAAAC,OAAA9mD,KAE5C2mD,WAAgB3mD,MAAA6mD,KAAAC,QAAA,eAAAF,UAAA,GAChBtuC,WAAgBtY,MAAA6mD,KAAAC,OAAA,eAAAF,UAAA,GAChBG,kBAAuB/mD,OAAA,SAAA4mD,UAAA,GACvBI,kBAAuBhnD,MAAA,SAAA4mD,UAAA,GACvBK,SAAcjnD,MAAA6mD,KAAAC,OAAA,cAAAF,UAAA,KAGd3pD,OAAAypD,iBACAD,EAAA,aAAAzmD,GAA4C,OAAAA,IAE5C2mD,WAAgB3mD,OAAA,uBAAA4mD,UAAA,GAChBtuC,WAAgBtY,MAAA,uBAAA4mD,UAAA,GAChBG,kBAAuB/mD,OAAA,iBAAA4mD,UAAA,GACvBI,kBAAuBhnD,MAAA,iBAAA4mD,UAAA,GACvBK,SAAcjnD,MAAA,sBAAA4mD,UAAA,KAGdH,EAAA,IAAAI,KAAAK,MAEAT,EAAA,IAAAI,KAAAM,IAEAV,EAAA,IAAAI,KAAAzqB,IAEAqqB,EAAA,IAAAI,KAAAO,IAEAX,EAAA,KAAAI,KAAA3T,KAEAuT,EAAA,MAAAI,KAAAQ,MAEAZ,EAAA,gBAAA51C,EAAAC,EAAAV,GACA,MAAAA,GAAAS,EAAAC,GAGA21C,EAAA,KAAAI,KAAAS,KAEAb,EAAA,MAAAI,KAAAU,MAEAd,EAAA,eAAAzmD,GACA,GAAAggD,GAAAhgD,GAAA,WACAyf,GAAA,SAAAzf,IAAA,CAIA,OAHAA,GAAAggD,EAAAvgC,EACAugC,EAAAhgD,GAAA,SACAyf,GAAA,MAAAzf,IAAA,GACAggD,EAAAvgC,GAGAgnC,EAAA,iBAAAzmD,GACA,MAAAA,IAAA,QAAAA,GAAA,iBAAAA,GAUAqmD,EAAA3oD,UAAAT,OAAAgO,OAAA2M,MAAAla,WACA2oD,EAAA3oD,UAAAZ,KAAA,mBACAupD,EAAA3oD,UAAAqf,QAAA,cAEA0pC,EAAA,uBACA,SAAAJ,IAWAG,EAAA9oD,UAAAT,OAAAgO,OAAA2M,MAAAla,WACA8oD,EAAA9oD,UAAAZ,KAAA,iBAEA2pD,EAAA,gBAAAe,EAAAzqC,GACA,GAAAyqC,EAAA,MAAAA,EACA,UAAAhB,GAAAzpC,IAGA0pC,EAAA,oBAAAzmD,GACA,MAAAA,IAGAymD,EAAA,kBAAA/nD,EAAA+oD,GACA,SAAAC,SAAAhpD,MAAAipD,KAGA7nD,OAAA,uBAAAH,GACA,MAAAG,QAAA4jD,aAAAryB,MAAAvxB,OAAAH,IAEAG,OAAA,wBAAAH,GACA,MAAAG,QAAA8nD,cAAAv2B,MAAAvxB,OAAAH,Md+8V6BjD,KAAKd,EAASS,EAAoB,KAIzD,SAAUR,EAAQD,EAASS,IetmWjC,SAAAqwB,GAEA,KAAAm7B,GAAAn7B,EAAAo7B,UAAAzrD,EAAA,GAEA,QAAA0rD,KAAAF,IACAE,EAAA9O,WAAA,cAAA8O,EAAA9O,WAAA,gBACAvsB,EAAAq7B,GAAAF,EAAAE,GAIAr7B,GAAAzuB,gBAAA,SAAAo8B,GACA,MAAAA,GACAwtB,EAAAG,QAAA3tB,GADA,GAIA3N,EAAA9gB,YAAA,SAAA5N,GACAA,GAAA6pD,EAAAI,MAAAjqD,IAGA0uB,EAAAw7B,YAAA,SAAAC,EAAAC,EAAA9qD,GACA,MAAAuqD,GAAAQ,SAAAF,EAAAC,EAAA9qD,IAGAovB,EAAAruB,MAAA,SAAAL,EAAAQ,GACAqpD,EAAAS,OAAAtqD,GAAAQ,GAGAkuB,EAAA1tB,KAAA,SAAAhB,GACA,MAAA6pD,GAAAS,OAAAtqD,GAKA,MAAAqN,GAAAhP,EAAA,GAAAgP,MAEAA,GAAA3N,UAAAia,OAAA,WACA,GAAA4wC,GAAAV,EAAAW,MACAtpD,EAAA,EAIA,OAHA2oD,GAAAW,MAAA,SAAAC,GAAgCvpD,GAAAupD,EAAA,MAChCC,qBAAAxsD,KAAAoP,KACAu8C,EAAAW,MAAAD,EACArpD,GAGAmM,EAAA3N,UAAAma,QAAA,WACA,GAAA0wC,GAAAV,EAAAW,MACAtpD,EAAA,EAIA,OAHA2oD,GAAAW,MAAA,SAAAC,GAAgCvpD,GAAAupD,EAAA,MAChCE,0BAAAzsD,KAAAoP,KACAu8C,EAAAW,MAAAD,EACArpD,Kf2mW6BxC,KAAKd,EAASS,EAAoB,KAIzD,SAAUR,EAAQD,GgBjqWxBC,EAAAD,QAAAO,GhBuqWM,SAAUN,EAAQD,EAASS,GAEjC,YiBhoWA,SAAAwzC,GACE+Y,EACAl8B,EACAsH,GAEA,OAAQtH,EAAO7Z,cAEb,IAAK,MACH,MAAI+1C,GAAS5sB,aAAe1b,EAAAyB,KAAKW,IACxBkmC,EAAS/sD,OAAO+Q,UAAUi8C,MAEjCD,EAAS5sB,YAAc1b,EAAAyB,KAAKY,IACrBimC,EAAS/sD,OAAOiR,UAAU+7C,KAGrC,KAAK,WACH,MAAID,GAAS5sB,aAAe1b,EAAAyB,KAAKW,IACxBkmC,EAAS/sD,OAAO+Q,UAAUk8C,MAEjCF,EAAS5sB,YAAc1b,EAAAyB,KAAKY,IACrBimC,EAAS/sD,OAAOiR,UAAUg8C,KAGrC,KAAK,YAEH,MADAF,GAAS5sB,YAAc4sB,EAAS9mC,QAAQU,UACjComC,EAAS/sD,OAAOoS,gBAAgB,YAAa26C,EAAS5sB,YAAYrG,gBAM7E,MAJAizB,GAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAENyrC,EAAS/sD,OAAOoW,oBAIzB,QAAAi9B,GACE0Z,EACAlrD,EACAuvB,EACAxf,EACA82B,EACAvQ,GAEA,GAEIxV,GACAC,EACAsqC,EACA7pD,EAEA8pD,EACAC,EAEAp7C,EACA1C,EAXAtP,EAAS+sD,EAAS/sD,MAiBtB,QAAQ6B,EAAUmV,cAIhB,IAAK,QAEH,GADA+1C,EAAS5sB,YAAc1b,EAAAyB,KAAKU,KACL,GAAnBhV,EAASvP,OAWX,MAVI+uB,IAAyC,GAAxBA,EAAc/uB,QACjC0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAGzDqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAKhB,MAJA0qD,GAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,QACE6lC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKW,KAC/DxjB,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASo1B,MACjC9+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWgZ,KAErD,MAEF,SACE+vC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKY,KAC/DzjB,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASq1B,MACjC/+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWkZ,KAErD,MAEF,SACEyvC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,MAEF,SACE/S,EAAMrD,EAAOwQ,UAAU,GAK3B,MADAu8C,GAAS5sB,YAAc1b,EAAAyB,KAAKU,KACrBvjB,CAET,KAAK,WAEH,GADA0pD,EAAS5sB,YAAc1b,EAAAyB,KAAKU,KACL,GAAnBhV,EAASvP,OAWX,MAVI+uB,IAAyC,GAAxBA,EAAc/uB,QACjC0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAGzDqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAKhB,MAJA0qD,GAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,QACE6lC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKW,KAC/DxjB,EAAMrD,EAAOuV,aACXvV,EAAOuR,aAAaoT,EAAAjb,SAASo1B,MAC3B9+B,EAAOmR,YAAYwT,EAAAje,QAAQ2mD,OACzBrtD,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,IAE1C3iB,EAAO+Q,UAAUk8C,MAEnBjtD,EAAOwQ,UAAU,GACjBxQ,EAAOuR,aAAaoT,EAAAjb,SAAS+0B,MAC3Bz+B,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWgZ,KACnDpd,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWgZ,MAGvD,MAEF,SACE+vC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKY,KAC/DzjB,EAAMrD,EAAOuV,aACXvV,EAAOuR,aAAaoT,EAAAjb,SAASq1B,MAC3B/+B,EAAOmR,YAAYwT,EAAAje,QAAQ4mD,OACzBttD,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,IAE1C3iB,EAAOiR,UAAUg8C,MAEnBjtD,EAAOwQ,UAAU,GACjBxQ,EAAOuR,aAAaoT,EAAAjb,SAASg1B,MAC3B1+B,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWkZ,KACnDtd,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWkZ,MAGvD,MAEF,SACEyvC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,MAEF,SACE/S,EAAMrD,EAAOwQ,UAAU,GAI3B,MADAu8C,GAAS5sB,YAAc1b,EAAAyB,KAAKU,KACrBvjB,CAET,KAAK,MACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAGzD,QAAQuwC,EAAS5sB,YAAY7Y,MAE3B,QACEjkB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ6mD,OAAQ5qC,EACzC,MAEF,QACE,GAAIoqC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACE/S,EAAMrD,EAAOmR,YACX47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQ8mD,OACR7oC,EAAAje,QAAQ6mD,OACZ5qC,EAEF,MAEF,QACA,OACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ8mD,OAAQ7qC,EACzC,MAEF,SACA,QACA,QACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,MACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAGzD,QAAQuwC,EAAS5sB,YAAY7Y,MAE3B,QACEjkB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ+mD,OAAQ9qC,EACzC,MAEF,QACE,GAAIoqC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACE/S,EAAMrD,EAAOmR,YACX47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQgnD,OACR/oC,EAAAje,QAAQ+mD,OACZ9qC,EAEF,MAEF,QACA,OACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQgnD,OAAQ/qC,EACzC,MAEF,SACA,QACA,QACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,SACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAGzD,QAAQuwC,EAAS5sB,YAAY7Y,MAE3B,QACEjkB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQinD,UAAWhrC,EAC5C,MAEF,QACE,GAAIoqC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACE/S,EAAMrD,EAAOmR,YACX47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQknD,UACRjpC,EAAAje,QAAQinD,UACZhrC,EAEF,MAEF,QACA,OACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQknD,UAAWjrC,EAC5C,MAEF,SACA,QACA,QACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,OACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAIzD,QAFAoG,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS5sB,aAEhD4sB,EAAS5sB,YAAY7Y,MAE3B,OACA,OACA,OACA,OACA,QACEjkB,EAAMgB,EAAA45B,qBACJj+B,EAAOuR,aAAaoT,EAAAjb,SAASmkD,QAASlrC,EAAMC,GAC5CmqC,EAAS5sB,YACTngC,EAGJ,QACA,OACEqD,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASmkD,QAASlrC,EAAMC,EAClD,MAEF,QACE,GAAImqC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACE/S,EAAMrD,EAAOuR,aACXw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASokD,QACTnpC,EAAAjb,SAASmkD,QACblrC,EACAC,EAEF,MAEF,QACA,OACEvf,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASokD,QAASnrC,EAAMC,EAClD,MAEF,SACEmqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,OACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAIzD,QAFAoG,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS5sB,aAEhD4sB,EAAS5sB,YAAY7Y,MAE3B,OACA,OACA,OACA,OACA,QACEjkB,EAAMgB,EAAA45B,qBACJj+B,EAAOuR,aAAaoT,EAAAjb,SAASqkD,QAASprC,EAAMC,GAC5CmqC,EAAS5sB,YACTngC,EAEF,MAEF,QACA,OACEqD,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASqkD,QAASprC,EAAMC,EAClD,MAEF,QACE,GAAImqC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACE/S,EAAMrD,EAAOuR,aACXw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASskD,QACTrpC,EAAAjb,SAASqkD,QACbprC,EACAC,EAEF,MAEF,QACA,OACEvf,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASskD,QAASrrC,EAAMC,EAClD,MAEF,SACEmqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,MACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,OACA,OAGA,OACE6lC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DnZ,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOuR,aAAaoT,EAAAjb,SAASulC,OAC3BjvC,EAAOwQ,UAAU,GACjBxQ,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,MAErD/c,EAAOuR,aAAaoT,EAAAjb,SAASqjC,MAC3B/sC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KACnD/c,EAAOwQ,UAAU,IAGrB,MAEF,QACE28C,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EtjB,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASwlC,OACTvqB,EAAAjb,SAASulC,OACb8d,EAAS9mC,QAAQU,UAAUmc,aAAa9iC,GACxCA,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,iBAE3Dh2C,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASsjC,MACTroB,EAAAjb,SAASqjC,MACb/sC,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBACzD+W,EAAS9mC,QAAQU,UAAUmc,aAAa9iC,IAG5C,MAEF,QACEmtD,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/DhjB,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOuR,aAAaoT,EAAAjb,SAASwlC,OAC3BlvC,EAAO2Q,UAAU,EAAG,GACpB3Q,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,MAErDjd,EAAOuR,aAAaoT,EAAAjb,SAASsjC,MAC3BhtC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KACnDjd,EAAO2Q,UAAU,EAAG,IAGxB,MAEF,QACE,GAAIo8C,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,OACA,OACA,OACA,OACA,QACE/S,EAAMsf,CACN,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ2mD,OAAQ1qC,EACzC,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ4mD,OAAQ3qC,EACzC,MAEF,SACEtf,EAAMrD,EAAOoW,mBACb,MAEF,SACE22C,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,MACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAIzD,QAFAlE,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS5sB,aAEhD4sB,EAAS5sB,YAAY7Y,MAE3B,OACA,OACA,OACE6lC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAK1J,KACxD4wC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DuwC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASqjC,MAC3B/sC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KACnD/c,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW2Y,MAGvD,MAEF,QACA,OACA,OACA,QACEowC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAK1J,KACxD4wC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DuwC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASujC,MAC3BjtC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KACnD/c,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW2Y,MAGvD,MAEF,QACEowC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAKG,KACxD+mC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/D0mC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASsjC,MAC3BhtC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KACnDjd,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW6Y,MAGvD,MAEF,QACEkwC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAKG,KACxD+mC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/D0mC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASwjC,MAC3BltC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KACnDjd,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW6Y,MAGvD,MAEF,QACEkwC,EAAaJ,EAAS7vB,gBAAgBtD,aAAamzB,EAAS9mC,QAAQU,WACpEymC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EomC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASsjC,MACTroB,EAAAjb,SAASqjC,MACb/sC,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBACzDh2C,EAAO8R,eAAes7C,EAAWr7C,MAAOg7C,EAAS9mC,QAAQ+vB,iBAG7D,MAEF,QACE,GAAI+W,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAEF+2C,EAAaJ,EAAS7vB,gBAAgBtD,aAAamzB,EAAS9mC,QAAQU,WACpEymC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EomC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASwjC,MACTvoB,EAAAjb,SAASujC,MACbjtC,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBACzDh2C,EAAO8R,eAAes7C,EAAWr7C,MAAOg7C,EAAS9mC,QAAQ+vB,iBAG7D,MAEF,SACE3yC,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASukD,OAAQtrC,EAAMC,EACjD,MAEF,SACEvf,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASwkD,OAAQvrC,EAAMC,EACjD,MAEF,SACEmqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,MACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAIzD,QAFAlE,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS5sB,aAEhD4sB,EAAS5sB,YAAY7Y,MAE3B,OACA,OACA,OACE6lC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAK1J,KACxD4wC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DuwC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAAS8iC,MAC3BxsC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KACnD/c,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW2Y,MAGvD,MAEF,QACA,OACA,OACA,QACEowC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAK1J,KACxD4wC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DuwC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASgjC,MAC3B1sC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KACnD/c,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW2Y,MAGvD,MAEF,QACEowC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAKG,KACxD+mC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/D0mC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAAS+iC,MAC3BzsC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KACnDjd,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW6Y,MAGvD,MAEF,QACEkwC,EAAaJ,EAAS7vB,gBAAgBtD,aAAanV,EAAAyB,KAAKG,KACxD+mC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/D0mC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aAAaoT,EAAAjb,SAASijC,MAC3B3sC,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KACnDjd,EAAO8R,eAAes7C,EAAWr7C,MAAO4S,EAAAvgB,WAAW6Y,MAGvD,MAEF,QACEkwC,EAAaJ,EAAS7vB,gBAAgBtD,aAAamzB,EAAS9mC,QAAQU,WACpEymC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EomC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAAS+iC,MACT9nB,EAAAjb,SAAS8iC,MACbxsC,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBACzDh2C,EAAO8R,eAAes7C,EAAWr7C,MAAOg7C,EAAS9mC,QAAQ+vB,iBAG7D,MAEF,QACE,GAAI+W,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAEF+2C,EAAaJ,EAAS7vB,gBAAgBtD,aAAamzB,EAAS9mC,QAAQU,WACpEymC,EAAaL,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EomC,EAAS7vB,gBAAgBlD,cAAcmzB,GACvC9pD,EAAMrD,EAAOuV,aACXvV,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOkS,eAAek7C,EAAWr7C,MAAO6Q,GACxC5iB,EAAOuR,aACLw7C,EAAS9mC,QAAQib,SACbvc,EAAAjb,SAASijC,MACThoB,EAAAjb,SAASgjC,MACb1sC,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBACzDh2C,EAAO8R,eAAes7C,EAAWr7C,MAAOg7C,EAAS9mC,QAAQ+vB,iBAG7D,MAEF,SACE3yC,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASykD,OAAQxrC,EAAMC,EACjD,MAEF,SACEvf,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAAS0kD,OAAQzrC,EAAMC,EACjD,MAEF,SACEmqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,OACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,OACE,GAAIylC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,QACE/S,EAAMsf,CACN,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ2nD,QAAS1rC,EAC1C,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ4nD,QAAS3rC,EAC1C,MAEF,SACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,QACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,OACE,GAAIylC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,QACE/S,EAAMsf,CACN,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ6nD,SAAU5rC,EAC3C,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ8nD,SAAU7rC,EAC3C,MAEF,SACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,WACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAIzD,QAFAlE,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS5sB,aAEhD4sB,EAAS5sB,YAAY7Y,MAI3B,QACEjkB,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAAS+kD,YAAa9rC,EAAMC,EACtD,MAEF,SACEvf,EAAMrD,EAAOuR,aAAaoT,EAAAjb,SAASglD,YAAa/rC,EAAMC,EACtD,MAEF,SACEmqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,UACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,OACE,GAAIylC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,QACE/S,EAAMsf,CACN,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQioD,WAAYhsC,EAC7C,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQkoD,WAAYjsC,EAC7C,MAEF,SACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,cACH,GAAuB,GAAnBuO,EAASvP,OAYX,MAXM+uB,IAAyC,GAAxBA,EAAc/uB,SAC/B+uB,GAAiBA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAChF27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,MAG/EqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,KAAMgb,GAAyC,GAAxBA,EAAc/uB,OAMnC,MALI+uB,IAAiBA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAChF27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAEtE1hB,EAAOoW,mBAGhB,QAAQgb,EAAc,GAAG9J,MAEvB,OACA,OACE3E,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKW,KACpDxjB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQmoD,eAAgBlsC,EACjD,MAEF,QACA,OACEA,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,KACpDzjB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQooD,eAAgBnsC,EACjD,MAEF,QACE,GAAIyO,EAAc,GAAGulB,YAMnB,MALAoW,GAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbyrC,EAAS5sB,YAAc/O,EAAc,GAC9BpxB,EAAOoW,mBAGlB,QACEuM,EAAOoqC,EAASvqB,kBACd5wB,EAAS,GACTm7C,EAAS9mC,QAAQib,SACbzc,EAAAyB,KAAKY,IACLrC,EAAAyB,KAAKW,KAEXxjB,EAAMrD,EAAOmR,YACX47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQooD,eACRnqC,EAAAje,QAAQmoD,eACZlsC,EAEF,MAEF,SACEA,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKO,KACpDpjB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQqoD,eAAgBpsC,EACjD,MAEF,SACEA,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKQ,KACpDrjB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQsoD,eAAgBrsC,EACjD,MAEF,SACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAIjB,MADA22C,GAAS5sB,YAAc/O,EAAc,GAC9B/tB,CAET,KAAK,OACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAI3B,QACEjkB,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQuoD,QAAStsC,EAC1C,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQwoD,QAASvsC,EAC1C,MAEF,SAEEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,QACH,GAAuB,GAAnBuO,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,GAAiBA,EAAc/uB,OAAQ,CAEzC,GADA0qD,EAAS5sB,YAAc/O,EAAc,GACT,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,EAGzD,QAAQimC,EAAS5sB,YAAY7Y,MAE3B,OACE,GAAIylC,EAAS5sB,YAAYwW,YAAa,CACpCoW,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,mBACb,OAGJ,QACE/S,EAAMsf,CACN,MAIF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQyoD,SAAUxsC,EAC3C,MAEF,SACEtf,EAAMrD,EAAOmR,YAAYwT,EAAAje,QAAQ0oD,SAAUzsC,EAC3C,MAEF,SACEoqC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAIT,KAAK,OACH,MAAIuO,GAASvP,OAAS,GAAKuP,EAASvP,OAAS,GACrC+uB,GAAyC,GAAxBA,EAAc/uB,QACnC0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAG3E9P,EAASvP,OAAS,EACpB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeqxB,wCACf1b,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAGlDqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAG7C1hB,EAAOoW,qBAEVgb,GAAyC,GAAxBA,EAAc/uB,QAQrCsgB,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChErX,EAA4B,GAAnBsC,EAASvP,OAAcgtD,EAAuBtC,EAAUn7C,EAAS,IAAM,EAC5EtC,EAAS,EACJtP,EAAOoW,oBAETpW,EAAOsS,WACZ8e,EAAc,GAAG8K,SACjB9K,EAAc,GAAGjG,GAAG,GACpBxI,EACAyO,EAAc,GAAGjG,GAAE,IACnBud,EAAevd,GAAE,IACjBud,EAAelK,MAAQpN,EAAc,GAAGoN,MACnCuuB,EAAS5sB,YAAcuI,GAAgB5O,gBACvCizB,EAAS5sB,YAAc/O,EAAc,IAAI0I,eAC9CxqB,KArBI8hB,GAAiBA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAChF27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAEtE1hB,EAAOoW,oBAmBlB,KAAK,QAEH,MADA22C,GAAS5sB,YAAc1b,EAAAyB,KAAKa,KACxBnV,EAASvP,OAAS,GAAKuP,EAASvP,OAAS,GACrC+uB,GAAyC,GAAxBA,EAAc/uB,QACnC0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAG3E9P,EAASvP,OAAS,EACpB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeqxB,wCACf1b,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAGlDqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAG7C1hB,EAAOoW,qBAEVgb,GAAyC,GAAxBA,EAAc/uB,QAOrCsgB,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChE/D,EAAOmqC,EAASvqB,kBACd5wB,EAAS,GACTwf,EAAc,GACdA,EAAc,GAAGjG,GAAE,GAChB,EACA,GAGH4hC,EAAS5sB,YAAYhV,GAAE,IACvBiG,EAAc,GAAGjG,GAAE,IACnBiG,EAAc,GAAGoN,KAAOuuB,EAAS5sB,YAAY3B,MAE7C5b,EAAOmqC,EAASziB,kBACd1nB,EACAmqC,EAAS5sB,YAAa/O,EAAc,GAAE,EAEtCxf,EAAS,IAEXI,EAAOof,EAAc,IAErBpf,EAAO+6C,EAAS5sB,aAElB7wB,EAA4B,GAAnBsC,EAASvP,OAAcgtD,EAAuBtC,EAAUn7C,EAAS,IAAM,GACnE,EACJ5R,EAAOoW,qBAEhB22C,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACrB/mB,EAAO0S,YAAY0e,EAAc,GAAG8K,SAAUvZ,EAAMC,EAAM5Q,EAAK8nB,eAAgBxqB,MAlCpFy9C,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAEtE1hB,EAAOoW,oBAgClB,KAAK,SAEH,MADA22C,GAAS5sB,YAAc4sB,EAAS9mC,QAAQU,UACjB,GAAnB/U,EAASvP,QACL+uB,GAAyC,GAAxBA,EAAc/uB,QACnC0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAG/EqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,qBAEZgb,EAC0B,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,qBAEhB/S,EAAM0pD,EAAS9mC,QAAQib,SACnBlhC,EAAO2Q,UAAUygB,EAAc,GAAG8K,SAAU,GAC5Cl8B,EAAOwQ,UAAU4gB,EAAc,GAAG8K,WAEtC6wB,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK,KAElBthB,EAAOoW,oBAMlB,KAAK,SACH,GAAuB,GAAnBxE,EAASvP,OAcX,MAbI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IACnC,GAAxBA,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAI3DqrC,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAE3C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CACjB,GAA4B,GAAxBA,EAAc/uB,OAMhB,MALI+uB,GAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAC/D27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAMzD,QAJAoG,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAII,EAAO+6C,EAAS5sB,aAC/D+sB,EAAOH,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKU,MACpDmmC,EAAS5sB,YAAcnuB,EAEf+6C,EAAS5sB,YAAY7Y,MAE3B,QACEjkB,EAAMrD,EAAOuV,aAAaoN,EAAMC,EAAMsqC,EACtC,MAEF,SACEH,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMrD,EAAOoW,oBAGjB,MAAO/S,EAET,KAAK,cAaH,MAZuB,IAAnBuO,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAGhD0P,GACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGzBhX,EAAOoW,mBAIhB,KAAK,iBAcH,MAbA22C,GAAS5sB,YAAc1b,EAAAyB,KAAK1J,IACL,GAAnB5K,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAGhD0P,GACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGzBhX,EAAO2R,WAAWgT,EAAApW,OAAOghD,cAElC,KAAK,cAiBH,MAhBAxC,GAAS5sB,YAAc1b,EAAAyB,KAAK1J,IACL,GAAnB5K,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDiB,EAAO3iB,EAAOoW,qBAEduM,EAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,KAElD4U,GACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGzBhX,EAAO2R,WAAWgT,EAAApW,OAAOihD,WAAY,MAAQ7sC,GAGtD,KAAK,cAOH,GANIyO,GACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,OAMX,MALA0qD,GAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACrB/mB,EAAOoW,mBAMhB,MAJAuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChE/D,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChEumC,EAAOH,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChEomC,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACtB,GAAIhL,OAAM,kBAGlB,KAAK,aAOH,GANIqV,GACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,OAMX,MALA0qD,GAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACrB/mB,EAAOoW,mBAMhB,MAJAuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChE/D,EAAOmqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKO,KACpDymC,EAAOH,EAASvqB,kBAAkB5wB,EAAS,GAAIm7C,EAAS9mC,QAAQU,WAChEomC,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACtB,GAAIhL,OAAM,kBAKlB,KAAK,aACH,MAAMqV,IAAyC,GAAxBA,EAAc/uB,OAOL,GAArB+uB,EAAc,GAAG9J,MAC1BylC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbyrC,EAAS5sB,YAAc/O,EAAc,GAC9BpxB,EAAOoW,qBAEO,GAAnBxE,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc/O,EAAc,GAC9BpxB,EAAOoW,sBAEhBuM,EAAOoqC,EAASvqB,kBACd5wB,EAAS,GACTm7C,EAAS9mC,QAAQU,UAAS,GAG5BomC,EAAS5sB,YAAc/O,EAAc,GACR,GAAzB27B,EAAS5sB,YAAY7Y,MACvBylC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAENthB,EAAOoW,qBAITuM,IArCDyO,GAAiBA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,IAChF27B,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAgBA,EAAc/uB,OAAOqf,SAAS,IAAM,KAEtE1hB,EAAOoW,oBAkClB,KAAK,SACH,GAAIxE,EAASvP,OAAS,GAAKuP,EAASvP,OAAS,EAqB3C,MApBI+uB,KACEA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,GAAGkmB,iBACtC,GAAxBlmB,EAAc/uB,QAChB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,MAIvD9P,EAASvP,OAAS,EACpB0qD,EAAS1pC,MACPmB,EAAAhC,eAAeqxB,wCACf1b,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAEzC9P,EAASvP,OAAS,GAC3B0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAG7C1hB,EAAOoW,mBAEhB,IAAIgb,EAAe,CAEjB,GADIA,EAAc/uB,SAAQ0qD,EAAS5sB,YAAc/O,EAAc,GAAGkmB,iBACtC,GAAxBlmB,EAAc/uB,OAKhB,MAJA0qD,GAAS1pC,MACPmB,EAAAhC,eAAeuP,oCACfoG,EAAW7W,MAAO,IAAK8P,EAAc/uB,OAAOqf,SAAS,KAEhD1hB,EAAOoW,mBAEhBuM,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAIwf,EAAc,QAE7DzO,GAAOoqC,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAOzD,IAJAxK,EAAO+6C,EAAS5sB,YAChB4sB,EAAS5sB,YAAcnuB,EAAKslC,gBAGxByV,EAAS9mC,QAAQqZ,SACnB,MAAIoJ,IAAkBjkB,EAAAyB,KAAKa,MACzBgmC,EAAS5sB,YAAc1b,EAAAyB,KAAKa,KACrB/mB,EAAOmV,aAETwN,CAGT,IAAI8sC,GAAQC,EAAa3C,EAA6B,GAAnBn7C,EAASvP,OAAcuP,EAAS,GAAK,KAAMumB,EAI9E,IAFA40B,EAAS5sB,YAAcnuB,EAAKslC,gBAExB5O,GAAkBjkB,EAAAyB,KAAKa,KAAM,CAC/B,OAAQgmC,EAAS5sB,YAAY7Y,MAE3B,QACEjkB,EAAMrD,EAAO+U,SACX/U,EAAOmR,YAAYwT,EAAAje,QAAQ43B,OACzB3b,GAEF8sC,EAEF,MAEF,QACA,OACEpsD,EAAMrD,EAAO+U,SACX/U,EAAOmR,YAAYwT,EAAAje,QAAQ63B,OACzB5b,GAEF8sC,EAEF,MAEF,QACA,OACEpsD,EAAMrD,EAAO+U,SACX/U,EAAOmR,YACL47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQ63B,OACR5Z,EAAAje,QAAQ43B,OACZ3b,GAEF8sC,EAEF,MAIF,SACEpsD,EAAMrD,EAAO+U,SACX/U,EAAOuR,aAAaoT,EAAAjb,SAAS+0B,MAC3B9b,EACA3iB,EAAO+Q,UAAU,IAEnB0+C,EAEF,MAEF,SACEpsD,EAAMrD,EAAO+U,SACX/U,EAAOuR,aAAaoT,EAAAjb,SAASg1B,MAC3B/b,EACA3iB,EAAOiR,UAAU,IAEnBw+C,EAEF,MAEF,SACE1C,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMosD,EAGV1C,EAAS5sB,YAAc1b,EAAAyB,KAAKa,SAE5B,QAAQgmC,EAAS5sB,YAAY7Y,MAE3B,QACE6lC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAK1J,KAC/DnZ,EAAMrD,EAAO+U,SACX/U,EAAOmR,YAAYwT,EAAAje,QAAQ43B,OACzBt+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,IAE1C8sC,EACAzvD,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW2Y,KAErD,MAEF,QACA,OACEowC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKG,KAC/DhjB,EAAMrD,EAAO+U,SACX/U,EAAOmR,YAAYwT,EAAAje,QAAQ63B,OACzBv+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,IAE1C8sC,EACAzvD,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAW6Y,KAErD,MAEF,QACA,OACEkwC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoB8yB,EAAS9mC,QAAQU,WAC3EtjB,EAAMrD,EAAO+U,SACX/U,EAAOmR,YACL47C,EAAS9mC,QAAQib,SACbvc,EAAAje,QAAQ63B,OACR5Z,EAAAje,QAAQ43B,OACZt+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,IAE1C8sC,EACAzvD,EAAO8R,eAAeq7C,EAAWp7C,MAAOg7C,EAAS9mC,QAAQ+vB,gBAE3D,MAEF,SACEmX,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKW,KAC/DxjB,EAAMrD,EAAO+U,SACX/U,EAAOuR,aAAaoT,EAAAjb,SAAS+0B,MAC3Bz+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAO+Q,UAAU,IAEnB0+C,EACAzvD,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWgZ,KAErD,MAEF,SACE+vC,EAAaJ,EAAS7vB,gBAAgBjD,oBAAoBxV,EAAAyB,KAAKY,KAC/DzjB,EAAMrD,EAAO+U,SACX/U,EAAOuR,aAAaoT,EAAAjb,SAASg1B,MAC3B1+B,EAAOkS,eAAei7C,EAAWp7C,MAAO4Q,GACxC3iB,EAAOiR,UAAU,IAEnBw+C,EACAzvD,EAAO8R,eAAeq7C,EAAWp7C,MAAO4S,EAAAvgB,WAAWkZ,KAErD,MAEF,SACEyvC,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAEbje,EAAMosD,EAIZ,MAAOpsD,EAIT,KAAK,KAOH,MANI+tB,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKC,GACrBnmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKC,GAAE,EAExD,KAAK,MAOH,MANIiL,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKE,IACrBpmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKE,IAAG,EAEzD,KAAK,MAOH,MANIgL,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAK1J,IACrBxc,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAK1J,IAAG,EAEzD,KAAK,MAOH,MANI4U,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKG,IACrBrmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKG,IAAG,EAEzD,KAAK,QAOH,MANI+K,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc4sB,EAAS9mC,QAAQib,SACpCzc,EAAAyB,KAAK2Z,QACLpb,EAAAyB,KAAK4Z,QACF9/B,EAAOoW,qBAET22C,EAASvqB,kBACd5wB,EAAS,GACTm7C,EAAS9mC,QAAQib,SACbzc,EAAAyB,KAAK2Z,QACLpb,EAAAyB,KAAK4Z,QAAO,EAIpB,KAAK,KAOH,MANI1O,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKK,GACrBvmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKK,GAAE,EAExD,KAAK,MAOH,MANI6K,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKM,IACrBxmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKM,IAAG,EAEzD,KAAK,MAOH,MANI4K,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKO,IACrBzmB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKO,IAAG,EAEzD,KAAK,MAOH,MANI2K,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKQ,IACrB1mB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKQ,IAAG,EAEzD,KAAK,QAOH,MANI0K,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc4sB,EAAS9mC,QAAQU,UACjC3mB,EAAOoW,qBAET22C,EAASvqB,kBACd5wB,EAAS,GACTm7C,EAAS9mC,QAAQU,UAAS,EAI9B,KAAK,OAOH,MANIyK,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKU,KACrB5mB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKU,KAAI,EAE1D,KAAK,MAOH,MANIwK,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKW,IACrB7mB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKW,IAAG,EAEzD,KAAK,MAOH,MANIuK,IACF27B,EAAS1pC,MACPmB,EAAAhC,eAAe8sC,sBACfn3B,EAAW7W,MAAOzf,EAAUmV,cAGT,GAAnBpF,EAASvP,QACX0qD,EAAS1pC,MACPmB,EAAAhC,eAAemM,+BACfwJ,EAAW7W,MAAO,IAAK1P,EAASvP,OAAOqf,SAAS,KAElDqrC,EAAS5sB,YAAc1b,EAAAyB,KAAKY,IACrB9mB,EAAOoW,qBAET22C,EAASvqB,kBAAkB5wB,EAAS,GAAI6S,EAAAyB,KAAKY,IAAG,GAM3D,MAJAimC,GAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfoK,EAAW7W,OAENthB,EAAOoW,oBAGhB,QAAAi5C,GAAgCtC,EAAoBr4C,GAClD,GAAIrD,GACAlN,CA6BJ,OA5BI4oD,GAAS9mC,QAAQib,UACnB7vB,EAAO07C,EAASxiB,qBAAqB71B,EAAY+P,EAAAyB,KAAKG,MAEpDzJ,yBAAyBvL,IAASsT,EAAA9f,aAAagY,OAC/CC,2BAA2BzL,IAASsT,EAAAvgB,WAAW6Y,KACR,GAAvCE,8BAA8B9L,KAC7BlN,EAAQ+Y,6BAA6B7L,IAAS,KAE/C07C,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfrZ,EAAW4M,OAEbnd,GAAS,KAGXkN,EAAO07C,EAASxiB,qBAAqB71B,EAAY+P,EAAAyB,KAAK1J,MAEpDI,yBAAyBvL,IAASsT,EAAA9f,aAAagY,OAC/CC,2BAA2BzL,IAASsT,EAAAvgB,WAAW2Y,MAC9C5Y,EAAQ6Y,0BAA0B3L,IAAS,KAE5C07C,EAAS1pC,MACPmB,EAAAhC,eAAeuL,wBACfrZ,EAAW4M,OAEbnd,GAAS,IAGNA,EAIT,QAAA2xC,GACEiX,EACA4C,EACAx3B,GAEA,GAAI3D,GAAUm7B,EAAIn7B,QACd3yB,EAAY2yB,EAAQ5O,SAASpkB,IAAIurD,EAAS9mC,QAAQwZ,aACtD,IAAI59B,EACF,GAAIA,EAAUylB,MAAQ2X,EAAAzU,YAAYgJ,mBAAoB,CACpD,GAAIzG,GAA+BlrB,EAAWmrB,SAC9C,IAAID,EACF,IACGA,EAAS5B,GAAG8T,EAAAjU,aAAa+L,UAC1BhK,EAAS/W,YAAc+2C,EAAS9mC,QAAQU,WACxCoG,EAAS6K,YACqB,GAA9B7K,EAAS6K,WAAWv1B,QACpB0qB,EAAS6K,WAAW,GAAG5lB,MAAQ+6C,EAAS9mC,QAAQU,WAEhD,GAAIomC,EAASppB,gBAAgB5W,GAC3B,MAAOggC,GAASpa,SAAS5lB,GACvBggC,EAAS9mC,QAAQib,SACb6rB,EAAS/sD,OAAO2Q,UAAUg/C,EAAIr0B,qBAC9ByxB,EAAS/sD,OAAOwQ,UAAUm/C,EAAIr0B,2BAItC9G,GAAQnR,MACNmB,EAAAhC,eAAeotC,4CACfz3B,EAAW7W,MAAOyrC,EAAS9mC,QAAQwZ,aAAc,4BAKvDjL,GAAQnR,MACNmB,EAAAhC,eAAe2wB,uGACfhb,EAAW7W,MAAOzf,EAAUmV,kBAIhCwd,GAAQnR,MACNmB,EAAAhC,eAAeqH,mBACfsO,EAAW7W,MAAOyrC,EAAS9mC,QAAQwZ,aAGvC,OAAOstB,GAAS/sD,OAAOoW,oBAIzB,QAAAs5C,GACE3C,EACA7rC,EACAiX,GAEA,GAAIn4B,GAAS+sD,EAAS/sD,OAClByvD,EAAuBzvD,EAAOoW,oBAC9By5C,EAAiB9C,EAASv4B,QAAQ5O,SAASpkB,IAAI,SAC/CsuD,EAAa/C,EAASv4B,QAAQ3O,MAAMrkB,IAAI,SAC5C,IACEquD,GACAA,EAAevoC,MAAQ2X,EAAAzU,YAAYgJ,oBACnCs8B,EACA,CACA,GAAIC,GAAoCF,EAAgB7iC,SAEtD+iC,IACAhD,EAASppB,gBAAgBosB,KAEzB3lC,OAAO2lC,EAAcn4B,YAAiD,GAAnCm4B,EAAcn4B,WAAWv1B,QAC5DotD,EAAQzvD,EAAOiU,YAAY,MACzB84C,EAASpa,SAASod,GACL,MAAX7uC,EACI6rC,EAASvqB,kBAAkBthB,EAAS4uC,GACpC/C,EAAS9mC,QAAQU,UAAUmc,aAAa9iC,GAC5C+sD,EAAS5X,oBAAoBhd,EAAW7W,MAAMK,OAAOC,gBACrD5hB,EAAOwQ,UAAU2nB,EAAW7W,MAAMO,MAClC7hB,EAAOwQ,UAAU2nB,EAAW7W,MAAMQ,UAEpC2tC,KAIN,MAAOA,GjB0zRTruD,OAAOC,eAAetB,EAAS,cAAgBoE,OAAO,GiB3qWtD,IAAAE,GAAA7D,EAAA,GAOAgkB,EAAAhkB,EAAA,GASAikB,EAAAjkB,EAAA,GAMAmkB,EAAAnkB,EAAA,GASAy+B,EAAAz+B,EAAA,EAUAT,GAAAi0C,qBAmCAj0C,EAAAszC,cAotEAtzC,EAAA+1C,kBAgDA/1C,EAAA2vD,gBjB+0UM,SAAU1vD,EAAQD,EAASS,IkB/pZjC,SAAAqwB,GAAA,KAAAm/B,GAAAn/B,EAAAm/B,MAAAxvD,EAAA,GAEAqwB,GAAAiF,QAAA,SAAAH,EAAAC,GACA,MAAAo6B,GAAAC,SAAAt6B,EAAAC,IAGA/E,EAAAvX,QAAA,SAAAnV,GACA,MAAAA,GAAA+rD,KAGAr/B,EAAAtX,SAAA,SAAApV,GACA,MAAAA,GAAAgsD,MAGAt/B,EAAAwU,QAAA,SAAA7zB,EAAAC,GACA,MAAAD,GAAA0e,IAAAze,IAGAof,EAAA0jB,QAAA,SAAA/iC,EAAAC,GACA,MAAAD,GAAA4+C,IAAA3+C,IAGAof,EAAA83B,QAAA,SAAAn3C,EAAAC,GACA,MAAAD,GAAA6+C,IAAA5+C,IAGAof,EAAAy/B,QAAA,SAAA9+C,EAAAC,GACA,MAAAD,GAAA++C,IAAA9+C,IAGAof,EAAA2/B,UAAA,SAAAh/C,EAAAC,GACA,MAAAD,GAAAi/C,aAAAF,IAAA9+C,EAAAg/C,cAAAC,YAGA7/B,EAAA8/B,QAAA,SAAAn/C,EAAAC,GACA,MAAAD,GAAAm5B,IAAAl5B,IAGAof,EAAA+/B,UAAA,SAAAp/C,EAAAC,GACA,MAAAD,GAAAi/C,aAAA9lB,IAAAl5B,EAAAg/C,cAAAC,YAGA7/B,EAAAggC,QAAA,SAAAr/C,EAAAC,GACA,MAAAD,GAAAs/C,IAAAr/C,IAGAof,EAAAkgC,OAAA,SAAAv/C,EAAAC,GACA,MAAAD,GAAAw/C,GAAAv/C,IAGAof,EAAAogC,QAAA,SAAAz/C,EAAAC,GACA,MAAAD,GAAA0/C,IAAAz/C,IAGAof,EAAAsgC,QAAA,SAAA3/C,EAAAC,GACA,MAAAD,GAAA4/C,IAAA3/C,IAGAof,EAAAwgC,QAAA,SAAA7/C,EAAAC,GACA,MAAAD,GAAA8/C,IAAA7/C,IAGAof,EAAAuQ,UAAA,SAAA5vB,EAAAC,GACA,MAAAD,GAAA+/C,KAAA9/C,IAGAof,EAAA2gC,QAAA,SAAArtD,GACA,MAAAA,GAAAstD,OAGA5gC,EAAAoQ,UAAA,SAAA98B,EAAAihC,GACAhb,OAAAgb,GAAA,IAAAA,IAAA,GACA,IAAAyD,GAAAmnB,EAAA0B,QAAAtsB,EAAA,EACA,OAAAjhC,GAAA+rB,IAAA2Y,GAAAioB,IAAAjoB,EAAA4oB,QAGA5gC,EAAA2jB,UAAA,SAAArwC,GACA,WAAAA,EAAAgsD,MAAAhsD,EAAA+rD,KAAA,GAAA/rD,EAAA+rD,KAAA/pC,GAAA1J,YACA,IAAAtY,EAAAgsD,MAAAhsD,EAAA+rD,KAAA/pC,GAAA2kC,WAAA3mD,EAAA+rD,IAAA,GAGAr/B,EAAA4jB,WAAA,SAAAtwC,GACA,WAAAA,EAAAgsD,MAAAhsD,EAAA+rD,KAAA,GAAA/rD,EAAA+rD,KAAA9pC,IAAA3J,YACA,IAAAtY,EAAAgsD,MAAAhsD,EAAA+rD,KAAA9pC,IAAA0kC,WAAA3mD,EAAA+rD,IAAA,GAGAr/B,EAAA6jB,WAAA,SAAAvwC,GACA,WAAAA,EAAAgsD,MAAAhsD,EAAA+rD,KAAA,IACA,IAAA/rD,EAAAgsD,MAAAhsD,EAAA+rD,IAAA,GAGAr/B,EAAA8jB,UAAA,SAAAxwC,GACA,WAAAA,EAAAgsD,MAAAhsD,EAAA+rD,KAAA,GAAA/rD,EAAA+rD,KAAA3pC,GAAA9J,WAGAoU,EAAA+jB,WAAA,SAAAzwC,GACA,WAAAA,EAAAgsD,MAAAhsD,EAAA+rD,KAAA,GAAA/rD,EAAA+rD,KAAA1pC,IAAA/J,WAGAoU,EAAAgkB,WAAA,SAAA1wC,GACA,WAAAA,EAAAgsD,MAGAt/B,EAAAikB,YAAA,SAAA3wC,GACA,WAAAA,EAAAgsD,OAAA,IAAAhsD,EAAA+rD,KAAA,IAAA/rD,EAAA+rD,KAGA,MAAAyB,GAAA3B,EAAA4B,WAAA/qC,IAAAqkC,kBACA2G,EAAA7B,EAAA4B,WAAA/qC,IAAAskC,iBAEAt6B,GAAAkkB,WAAA,SAAA5wC,GACA,MAAAA,GAAA2tD,IAAAH,IAAAxtD,EAAA4tD,IAAAF,GAGA,MAAAG,GAAAhC,EAAA4B,WAAA9qC,IAAAokC,kBACA+G,EAAAjC,EAAA4B,WAAA9qC,IAAAqkC,iBAEAt6B,GAAAokB,WAAA,SAAA9wC,GACA,MAAAA,GAAA2tD,IAAAE,IAAA7tD,EAAA4tD,IAAAE,IAGAphC,EAAAmkB,WAAA,SAAA7wC,GACA,MAAA0sB,GAAAm6B,KAAAC,OAAA9mD,EAAA+tD,aAGArhC,EAAAqkB,WAAA,SAAA/wC,GACA,MAAAA,GAAA+tD,YAGArhC,EAAAshC,cAAA,SAAAhuD,EAAAiuD,GACA,OAAAA,EAAAjuD,EAAAssD,aAAAtsD,GAAAud,SAAA,OlBoqZ6B7gB,KAAKd,EAASS,EAAoB,KAIzD,SAAUR,EAAQD,GmBjxZxB,QAAAiwD,GAAAE,EAAAC,EAAAiC,GAMA/xD,KAAA6vD,IAAA,EAAAA,EAMA7vD,KAAA8vD,KAAA,EAAAA,EAMA9vD,KAAA+xD,aAoCA,QAAAC,GAAAC,GACA,YAAAA,KAAA,YA+BA,QAAAZ,GAAAvtD,EAAAiuD,GACA,GAAAE,GAAAC,EAAAC,CACA,OAAAJ,IACAjuD,KAAA,GACAquD,EAAA,GAAAruD,KAAA,OACAouD,EAAAE,EAAAtuD,IAEAouD,GAEAD,EAAArC,EAAA9rD,GAAA,EAAAA,GAAA,WACAquD,IACAC,EAAAtuD,GAAAmuD,GACAA,KAEAnuD,GAAA,GACAquD,GAAA,KAAAruD,KAAA,OACAouD,EAAAG,EAAAvuD,IAEAouD,GAEAD,EAAArC,EAAA9rD,IAAA,WACAquD,IACAE,EAAAvuD,GAAAmuD,GACAA,IAmBA,QAAAV,GAAAztD,EAAAiuD,GACA,GAAAO,MAAAxuD,GACA,MAAAiuD,GAAAQ,EAAAC,CACA,IAAAT,EAAA,CACA,GAAAjuD,EAAA,EACA,MAAAyuD,EACA,IAAAzuD,GAAA2uD,EACA,MAAAC,OACK,CACL,GAAA5uD,IAAA6uD,EACA,MAAAlI,EACA,IAAA3mD,EAAA,GAAA6uD,EACA,MAAAv2C,GAEA,MAAAtY,GAAA,EACAytD,GAAAztD,EAAAiuD,GAAAa,MACAhD,EAAA9rD,EAAA+uD,EAAA,EAAA/uD,EAAA+uD,EAAA,EAAAd,GAmBA,QAAAnC,GAAAkD,EAAAC,EAAAhB,GACA,UAAApC,GAAAmD,EAAAC,EAAAhB,GA8BA,QAAAiB,GAAAxwD,EAAAuvD,EAAAxG,GACA,OAAA/oD,EAAAR,OACA,KAAA0Z,OAAA,eACA,YAAAlZ,GAAA,aAAAA,GAAA,cAAAA,GAAA,cAAAA,EACA,MAAAgwD,EASA,IARA,gBAAAT,IAEAxG,EAAAwG,EACAA,GAAA,GAEAA,OAEAxG,KAAA,IACA,MAAAA,EACA,KAAA0H,YAAA,QAEA,IAAAvxD,EACA,KAAAA,EAAAc,EAAA0wD,QAAA,QACA,KAAAx3C,OAAA,kBACA,QAAAha,EACA,MAAAsxD,GAAAxwD,EAAAwf,UAAA,GAAA+vC,EAAAxG,GAAAqH,KAQA,QAHAO,GAAA5B,EAAA6B,EAAA7H,EAAA,IAEA17C,EAAA2iD,EACAlyD,EAAA,EAAmBA,EAAAkC,EAAAR,OAAgB1B,GAAA,GACnC,GAAA69B,GAAAwsB,KAAAO,IAAA,EAAA1oD,EAAAR,OAAA1B,GACAwD,EAAA0nD,SAAAhpD,EAAAwf,UAAA1hB,IAAA69B,GAAAotB,EACA,IAAAptB,EAAA,GACA,GAAAk1B,GAAA9B,EAAA6B,EAAA7H,EAAAptB,GACAtuB,KAAAmgD,IAAAqD,GAAAxjC,IAAA0hC,EAAAztD,QAEA+L,KAAAmgD,IAAAmD,GACAtjD,IAAAggB,IAAA0hC,EAAAztD,IAIA,MADA+L,GAAAkiD,WACAliD,EAoBA,QAAAyjD,GAAAhxD,EAAAyvD,GACA,sBAAAzvD,GACAivD,EAAAjvD,EAAAyvD,GACA,gBAAAzvD,GACA0wD,EAAA1wD,EAAAyvD,GAEAnC,EAAAttD,EAAAutD,IAAAvtD,EAAAwtD,KAAA,iBAAAiC,KAAAzvD,EAAAyvD,UA7RApyD,EAAAD,QAAAiwD,CAKA,IAAA4D,GAAA,IAEA,KACAA,EAAA,GAAAC,aAAAC,SAAA,GAAAD,aAAArkD,OAAA,GAAAlM,aACA,u2BACSvD,QACR,MAAAukB,IA0DD0rC,EAAAnuD,UAAAkyD,WAEA3yD,OAAAC,eAAA2uD,EAAAnuD,UAAA,cAAqDsC,OAAA,IAkBrD6rD,EAAAqC,QAOA,IAAAK,MAOAD,IA0CAzC,GAAA0B,UAkCA1B,EAAA4B,aAsBA5B,EAAAC,UASA,IAAAwD,GAAAzI,KAAAgJ,GA4DAhE,GAAAqD,aAyBArD,EAAA2D,WAUA,IAcAT,GAAAe,WAOAnB,EAAAI,IAOAF,EAAAF,EAAA,EAOAoB,EAAAxC,EA5BA,OAkCAmB,EAAAnB,EAAA,EAMA1B,GAAA6C,MAMA,IAAAD,GAAAlB,EAAA,KAMA1B,GAAA4C,OAMA,IAAAuB,GAAAzC,EAAA,EAMA1B,GAAAmE,KAMA,IAAAC,GAAA1C,EAAA,KAMA1B,GAAAoE,MAMA,IAAAC,GAAA3C,GAAA,EAMA1B,GAAAqE,SAMA,IAAA53C,GAAAwzC,GAAA,gBAMAD,GAAAvzC,WAMA,IAAAs2C,GAAA9C,GAAA,QAMAD,GAAA+C,oBAMA,IAAAjI,GAAAmF,EAAA,iBAMAD,GAAAlF,WAMA,IAAAwJ,GAAAtE,EAAAnuD,SAMAyyD,GAAAC,MAAA,WACA,MAAAl0D,MAAA+xD,SAAA/xD,KAAA6vD,MAAA,EAAA7vD,KAAA6vD,KAOAoE,EAAApC,SAAA,WACA,MAAA7xD,MAAA+xD,UACA/xD,KAAA8vD,OAAA,GAAA+C,GAAA7yD,KAAA6vD,MAAA,GACA7vD,KAAA8vD,KAAA+C,GAAA7yD,KAAA6vD,MAAA,IAUAoE,EAAA5yC,SAAA,SAAAkqC,GAEA,IADAA,KAAA,IACA,MAAAA,EACA,KAAA0H,YAAA,QACA,IAAAjzD,KAAAm0D,SACA,SACA,IAAAn0D,KAAAo0D,aAAA,CACA,GAAAp0D,KAAAq0D,GAAA5J,GAAA,CAGA,GAAA6J,GAAA/C,EAAAhG,GACA2E,EAAAlwD,KAAAkwD,IAAAoE,GACAC,EAAArE,EAAAF,IAAAsE,GAAAvE,IAAA/vD,KACA,OAAAkwD,GAAA7uC,SAAAkqC,GAAAgJ,EAAAL,QAAA7yC,SAAAkqC,GAEA,UAAAvrD,KAAA4yD,MAAAvxC,SAAAkqC,GAQA,IAHA,GAAA4H,GAAA5B,EAAA6B,EAAA7H,EAAA,GAAAvrD,KAAA+xD,UACAyC,EAAAx0D,KACA6P,EAAA,KACA,CACA,GAAA4kD,GAAAD,EAAAtE,IAAAiD,GACAuB,EAAAF,EAAAzE,IAAA0E,EAAAzE,IAAAmD,IAAAe,UAAA,EACAS,EAAAD,EAAArzC,SAAAkqC,EAEA,IADAiJ,EAAAC,EACAD,EAAAL,SACA,MAAAQ,GAAA9kD,CAEA,MAAA8kD,EAAA3yD,OAAA,GACA2yD,EAAA,IAAAA,CACA9kD,GAAA,GAAA8kD,EAAA9kD,IASAokD,EAAAW,YAAA,WACA,MAAA50D,MAAA8vD,MAOAmE,EAAAY,oBAAA,WACA,MAAA70D,MAAA8vD,OAAA,GAOAmE,EAAAa,WAAA,WACA,MAAA90D,MAAA6vD,KAOAoE,EAAAc,mBAAA,WACA,MAAA/0D,MAAA6vD,MAAA,GAOAoE,EAAAe,cAAA,WACA,GAAAh1D,KAAAo0D,aACA,MAAAp0D,MAAAq0D,GAAA5J,GAAA,GAAAzqD,KAAA4yD,MAAAoC,eAEA,QADA1yD,GAAA,GAAAtC,KAAA8vD,KAAA9vD,KAAA8vD,KAAA9vD,KAAA6vD,IACAoF,EAAA,GAAsBA,EAAA,GACtB,IAAA3yD,EAAA,GAAA2yD,GAD+BA,KAG/B,UAAAj1D,KAAA8vD,KAAAmF,EAAA,GAAAA,EAAA,GAOAhB,EAAAE,OAAA,WACA,WAAAn0D,KAAA8vD,MAAA,IAAA9vD,KAAA6vD,KAOAoE,EAAAiB,IAAAjB,EAAAE,OAMAF,EAAAG,WAAA,WACA,OAAAp0D,KAAA+xD,UAAA/xD,KAAA8vD,KAAA,GAOAmE,EAAAkB,WAAA,WACA,MAAAn1D,MAAA+xD,UAAA/xD,KAAA8vD,MAAA,GAOAmE,EAAAmB,MAAA,WACA,aAAAp1D,KAAA6vD,MAOAoE,EAAAoB,OAAA,WACA,aAAAr1D,KAAA6vD,MAQAoE,EAAAqB,OAAA,SAAAC,GAGA,MAFAvD,GAAAuD,KACAA,EAAAjC,EAAAiC,KACAv1D,KAAA+xD,WAAAwD,EAAAxD,UAAA/xD,KAAA8vD,OAAA,OAAAyF,EAAAzF,OAAA,SAEA9vD,KAAA8vD,OAAAyF,EAAAzF,MAAA9vD,KAAA6vD,MAAA0F,EAAA1F,MASAoE,EAAAI,GAAAJ,EAAAqB,OAOArB,EAAAuB,UAAA,SAAAD,GACA,OAAAv1D,KAAAq0D,GAAAkB,IASAtB,EAAAwB,IAAAxB,EAAAuB,UAQAvB,EAAAyB,GAAAzB,EAAAuB,UAOAvB,EAAA0B,SAAA,SAAAJ,GACA,MAAAv1D,MAAA41D,KAAAL,GAAA,GASAtB,EAAA4B,GAAA5B,EAAA0B,SAOA1B,EAAA6B,gBAAA,SAAAP,GACA,MAAAv1D,MAAA41D,KAAAL,IAAA,GASAtB,EAAAvC,IAAAuC,EAAA6B,gBAQA7B,EAAA8B,GAAA9B,EAAA6B,gBAOA7B,EAAA+B,YAAA,SAAAT,GACA,MAAAv1D,MAAA41D,KAAAL,GAAA,GASAtB,EAAAgC,GAAAhC,EAAA+B,YAOA/B,EAAAiC,mBAAA,SAAAX,GACA,MAAAv1D,MAAA41D,KAAAL,IAAA,GASAtB,EAAAxC,IAAAwC,EAAAiC,mBAQAjC,EAAAkC,GAAAlC,EAAAiC,mBAQAjC,EAAAmC,QAAA,SAAAb,GAGA,GAFAvD,EAAAuD,KACAA,EAAAjC,EAAAiC,IACAv1D,KAAAq0D,GAAAkB,GACA,QACA,IAAAc,GAAAr2D,KAAAo0D,aACAkC,EAAAf,EAAAnB,YACA,OAAAiC,KAAAC,GACA,GACAD,GAAAC,EACA,EAEAt2D,KAAA+xD,SAGAwD,EAAAzF,OAAA,EAAA9vD,KAAA8vD,OAAA,GAAAyF,EAAAzF,OAAA9vD,KAAA8vD,MAAAyF,EAAA1F,MAAA,EAAA7vD,KAAA6vD,MAAA,OAFA7vD,KAAA+vD,IAAAwF,GAAAnB,cAAA,KAYAH,EAAA2B,KAAA3B,EAAAmC,QAMAnC,EAAAsC,OAAA,WACA,OAAAv2D,KAAA+xD,UAAA/xD,KAAAq0D,GAAA5J,GACAA,EACAzqD,KAAAoxD,MAAAvhC,IAAAikC,IAQAG,EAAArB,IAAAqB,EAAAsC,OAOAtC,EAAApkC,IAAA,SAAA2mC,GACAxE,EAAAwE,KACAA,EAAAlD,EAAAkD,GAIA,IAAAC,GAAAz2D,KAAA8vD,OAAA,GACA4G,EAAA,MAAA12D,KAAA8vD,KACA6G,EAAA32D,KAAA6vD,MAAA,GACA+G,EAAA,MAAA52D,KAAA6vD,IAEAgH,EAAAL,EAAA1G,OAAA,GACAgH,EAAA,MAAAN,EAAA1G,KACAiH,EAAAP,EAAA3G,MAAA,GACAmH,EAAA,MAAAR,EAAA3G,IAEAoH,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,CAYA,OAXAA,IAAAR,EAAAI,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAI,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAI,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAI,EACAI,GAAA,MACArH,EAAAuH,GAAA,GAAAC,EAAAH,GAAA,GAAAC,EAAAl3D,KAAA+xD,WAQAkC,EAAAoD,SAAA,SAAAC,GAGA,MAFAtF,GAAAsF,KACAA,EAAAhE,EAAAgE,IACAt3D,KAAA6vB,IAAAynC,EAAA1E,QASAqB,EAAAlE,IAAAkE,EAAAoD,SAOApD,EAAAsD,SAAA,SAAAC,GACA,GAAAx3D,KAAAm0D,SACA,MAAA3B,EAKA,IAJAR,EAAAwF,KACAA,EAAAlE,EAAAkE,IAGAjE,EAAA,CAKA,MAAA3D,GAJA2D,EAAAvD,IAAAhwD,KAAA6vD,IACA7vD,KAAA8vD,KACA0H,EAAA3H,IACA2H,EAAA1H,MACAyD,EAAAkE,WAAAz3D,KAAA+xD,UAGA,GAAAyF,EAAArD,SACA,MAAA3B,EACA,IAAAxyD,KAAAq0D,GAAA5J,GACA,MAAA+M,GAAApC,QAAA3K,EAAA+H,CACA,IAAAgF,EAAAnD,GAAA5J,GACA,MAAAzqD,MAAAo1D,QAAA3K,EAAA+H,CAEA,IAAAxyD,KAAAo0D,aACA,MAAAoD,GAAApD,aACAp0D,KAAA4yD,MAAA5C,IAAAwH,EAAA5E,OAEA5yD,KAAA4yD,MAAA5C,IAAAwH,GAAA5E,KACK,IAAA4E,EAAApD,aACL,MAAAp0D,MAAAgwD,IAAAwH,EAAA5E,YAGA,IAAA5yD,KAAA61D,GAAAhC,IAAA2D,EAAA3B,GAAAhC,GACA,MAAAtC,GAAAvxD,KAAA6xD,WAAA2F,EAAA3F,WAAA7xD,KAAA+xD,SAKA,IAAA0E,GAAAz2D,KAAA8vD,OAAA,GACA4G,EAAA,MAAA12D,KAAA8vD,KACA6G,EAAA32D,KAAA6vD,MAAA,GACA+G,EAAA,MAAA52D,KAAA6vD,IAEAgH,EAAAW,EAAA1H,OAAA,GACAgH,EAAA,MAAAU,EAAA1H,KACAiH,EAAAS,EAAA3H,MAAA,GACAmH,EAAA,MAAAQ,EAAA3H,IAEAoH,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,CAqBA,OApBAA,IAAAR,EAAAI,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAK,EACAE,GAAAC,IAAA,GACAA,GAAA,MACAA,GAAAP,EAAAG,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAM,EACAC,GAAAC,IAAA,GACAA,GAAA,MACAA,GAAAP,EAAAI,EACAE,GAAAC,IAAA,GACAA,GAAA,MACAA,GAAAN,EAAAE,EACAG,GAAAC,IAAA,GACAA,GAAA,MACAD,GAAAR,EAAAO,EAAAN,EAAAK,EAAAJ,EAAAG,EAAAF,EAAAC,EACAI,GAAA,MACArH,EAAAuH,GAAA,GAAAC,EAAAH,GAAA,GAAAC,EAAAl3D,KAAA+xD,WASAkC,EAAAjE,IAAAiE,EAAAsD,SAQAtD,EAAAyD,OAAA,SAAAC,GAGA,GAFA3F,EAAA2F,KACAA,EAAArE,EAAAqE,IACAA,EAAAxD,SACA,KAAAz4C,OAAA,mBAGA,IAAA63C,EAAA,CAIA,IAAAvzD,KAAA+xD,WACA,aAAA/xD,KAAA8vD,OACA,IAAA6H,EAAA9H,MAAA,IAAA8H,EAAA7H,KAEA,MAAA9vD,KAQA,OAAA4vD,IANA5vD,KAAA+xD,SAAAwB,EAAAqE,MAAArE,EAAAsE,OACA73D,KAAA6vD,IACA7vD,KAAA8vD,KACA6H,EAAA9H,IACA8H,EAAA7H,MAEAyD,EAAAkE,WAAAz3D,KAAA+xD,UAGA,GAAA/xD,KAAAm0D,SACA,MAAAn0D,MAAA+xD,SAAAQ,EAAAC,CACA,IAAAsF,GAAAtD,EAAAuD,CACA,IAAA/3D,KAAA+xD,SA6BK,CAKL,GAFA4F,EAAA5F,WACA4F,IAAAvH,cACAuH,EAAA1B,GAAAj2D,MACA,MAAAuyD,EACA,IAAAoF,EAAA1B,GAAAj2D,KAAAkxD,KAAA,IACA,MAAA6C,EACAgE,GAAAxF,MAtCA,CAGA,GAAAvyD,KAAAq0D,GAAA5J,GAAA,CACA,GAAAkN,EAAAtD,GAAAP,IAAA6D,EAAAtD,GAAAL,GACA,MAAAvJ,EACA,IAAAkN,EAAAtD,GAAA5J,GACA,MAAAqJ,EAKA,OADAgE,GADA93D,KAAAixD,IAAA,GACAf,IAAAyH,GAAA5G,IAAA,GACA+G,EAAAzD,GAAA7B,GACAmF,EAAAvD,aAAAN,EAAAE,GAEAQ,EAAAx0D,KAAA+vD,IAAA4H,EAAA3H,IAAA8H,IACAC,EAAAD,EAAAjoC,IAAA2kC,EAAAtE,IAAAyH,KAIS,GAAAA,EAAAtD,GAAA5J,GACT,MAAAzqD,MAAA+xD,SAAAQ,EAAAC,CACA,IAAAxyD,KAAAo0D,aACA,MAAAuD,GAAAvD,aACAp0D,KAAA4yD,MAAA1C,IAAAyH,EAAA/E,OACA5yD,KAAA4yD,MAAA1C,IAAAyH,GAAA/E,KACS,IAAA+E,EAAAvD,aACT,MAAAp0D,MAAAkwD,IAAAyH,EAAA/E,YACAmF,GAAAvF,EAmBA,IADAgC,EAAAx0D,KACAw0D,EAAA/C,IAAAkG,IAAA,CAGAG,EAAAnN,KAAAzqB,IAAA,EAAAyqB,KAAAQ,MAAAqJ,EAAA3C,WAAA8F,EAAA9F,YAWA,KAPA,GAAAmG,GAAArN,KAAA3T,KAAA2T,KAAAsN,IAAAH,GAAAnN,KAAAuN,KACAC,EAAAH,GAAA,KAAA5E,EAAA,EAAA4E,EAAA,IAIAI,EAAA7G,EAAAuG,GACAO,EAAAD,EAAApI,IAAA2H,GACAU,EAAAjE,cAAAiE,EAAApC,GAAAzB,IACAsD,GAAAK,EACAC,EAAA7G,EAAAuG,EAAA93D,KAAA+xD,UACAsG,EAAAD,EAAApI,IAAA2H,EAKAS,GAAAjE,WACAiE,EAAAtE,GAEAiE,IAAAloC,IAAAuoC,GACA5D,IAAAzE,IAAAsI,GAEA,MAAAN,IASA9D,EAAA/D,IAAA+D,EAAAyD,OAOAzD,EAAAqE,OAAA,SAAAX,GAKA,GAJA3F,EAAA2F,KACAA,EAAArE,EAAAqE,IAGApE,EAAA,CAOA,MAAA3D,IANA5vD,KAAA+xD,SAAAwB,EAAAgF,MAAAhF,EAAAiF,OACAx4D,KAAA6vD,IACA7vD,KAAA8vD,KACA6H,EAAA9H,IACA8H,EAAA7H,MAEAyD,EAAAkE,WAAAz3D,KAAA+xD,UAGA,MAAA/xD,MAAA+vD,IAAA/vD,KAAAkwD,IAAAyH,GAAA3H,IAAA2H,KASA1D,EAAA3pB,IAAA2pB,EAAAqE,OAQArE,EAAAO,IAAAP,EAAAqE,OAMArE,EAAA7C,IAAA,WACA,MAAAxB,IAAA5vD,KAAA6vD,KAAA7vD,KAAA8vD,KAAA9vD,KAAA+xD,WAQAkC,EAAAxD,IAAA,SAAA8E,GAGA,MAFAvD,GAAAuD,KACAA,EAAAjC,EAAAiC,IACA3F,EAAA5vD,KAAA6vD,IAAA0F,EAAA1F,IAAA7vD,KAAA8vD,KAAAyF,EAAAzF,KAAA9vD,KAAA+xD,WAQAkC,EAAAtD,GAAA,SAAA4E,GAGA,MAFAvD,GAAAuD,KACAA,EAAAjC,EAAAiC,IACA3F,EAAA5vD,KAAA6vD,IAAA0F,EAAA1F,IAAA7vD,KAAA8vD,KAAAyF,EAAAzF,KAAA9vD,KAAA+xD,WAQAkC,EAAApD,IAAA,SAAA0E,GAGA,MAFAvD,GAAAuD,KACAA,EAAAjC,EAAAiC,IACA3F,EAAA5vD,KAAA6vD,IAAA0F,EAAA1F,IAAA7vD,KAAA8vD,KAAAyF,EAAAzF,KAAA9vD,KAAA+xD,WAQAkC,EAAAwE,UAAA,SAAAC,GAGA,MAFA1G,GAAA0G,KACAA,IAAAxE,SACA,IAAAwE,GAAA,IACA14D,KACA04D,EAAA,GACA9I,EAAA5vD,KAAA6vD,KAAA6I,EAAA14D,KAAA8vD,MAAA4I,EAAA14D,KAAA6vD,MAAA,GAAA6I,EAAA14D,KAAA+xD,UAEAnC,EAAA,EAAA5vD,KAAA6vD,KAAA6I,EAAA,GAAA14D,KAAA+xD,WASAkC,EAAAlD,IAAAkD,EAAAwE,UAOAxE,EAAA0E,WAAA,SAAAD,GAGA,MAFA1G,GAAA0G,KACAA,IAAAxE,SACA,IAAAwE,GAAA,IACA14D,KACA04D,EAAA,GACA9I,EAAA5vD,KAAA6vD,MAAA6I,EAAA14D,KAAA8vD,MAAA,GAAA4I,EAAA14D,KAAA8vD,MAAA4I,EAAA14D,KAAA+xD,UAEAnC,EAAA5vD,KAAA8vD,MAAA4I,EAAA,GAAA14D,KAAA8vD,MAAA,OAAA9vD,KAAA+xD,WASAkC,EAAAhD,IAAAgD,EAAA0E,WAOA1E,EAAA2E,mBAAA,SAAAF,GAIA,GAHA1G,EAAA0G,KACAA,IAAAxE,SAEA,KADAwE,GAAA,IAEA,MAAA14D,KAEA,IAAA8vD,GAAA9vD,KAAA8vD,IACA,IAAA4I,EAAA,IAEA,MAAA9I,GADA5vD,KAAA6vD,MACA6I,EAAA5I,GAAA,GAAA4I,EAAA5I,IAAA4I,EAAA14D,KAAA+xD,UACS,YAAA2G,EACT9I,EAAAE,EAAA,EAAA9vD,KAAA+xD,UAEAnC,EAAAE,IAAA4I,EAAA,KAAA14D,KAAA+xD,WAUAkC,EAAA/C,KAAA+C,EAAA2E,mBAQA3E,EAAA4E,MAAA5E,EAAA2E,mBAMA3E,EAAA5D,SAAA,WACA,MAAArwD,MAAA+xD,SAEAnC,EAAA5vD,KAAA6vD,IAAA7vD,KAAA8vD,MAAA,GADA9vD,MAQAi0D,EAAA7D,WAAA,WACA,MAAApwD,MAAA+xD,SACA/xD,KACA4vD,EAAA5vD,KAAA6vD,IAAA7vD,KAAA8vD,MAAA,IAQAmE,EAAA6E,QAAA,SAAA/C,GACA,MAAAA,GAAA/1D,KAAA+4D,YAAA/4D,KAAAg5D,aAOA/E,EAAA8E,UAAA,WACA,GAAAxjC,GAAAv1B,KAAA8vD,KACAx6B,EAAAt1B,KAAA6vD,GACA,QACA,IAAAv6B,EACAA,IAAA,MACAA,IAAA,OACAA,IAAA,GACA,IAAAC,EACAA,IAAA,MACAA,IAAA,OACAA,IAAA,KAQA0+B,EAAA+E,UAAA,WACA,GAAAzjC,GAAAv1B,KAAA8vD,KACAx6B,EAAAt1B,KAAA6vD,GACA,QACAt6B,IAAA,GACAA,IAAA,OACAA,IAAA,MACA,IAAAA,EACAD,IAAA,GACAA,IAAA,OACAA,IAAA,MACA,IAAAA,IAWAq6B,EAAAsJ,UAAA,SAAA/mD,EAAA6/C,EAAAgE,GACA,MAAAA,GAAApG,EAAAuJ,YAAAhnD,EAAA6/C,GAAApC,EAAAwJ,YAAAjnD,EAAA6/C,IASApC,EAAAuJ,YAAA,SAAAhnD,EAAA6/C,GACA,UAAApC,GACAz9C,EAAA,GACAA,EAAA,MACAA,EAAA,OACAA,EAAA,OACAA,EAAA,GACAA,EAAA,MACAA,EAAA,OACAA,EAAA,OACA6/C,IAUApC,EAAAwJ,YAAA,SAAAjnD,EAAA6/C,GACA,UAAApC,GACAz9C,EAAA,OACAA,EAAA,OACAA,EAAA,MACAA,EAAA,GACAA,EAAA,OACAA,EAAA,OACAA,EAAA,MACAA,EAAA,GACA6/C,KnBmzZM,SAAUpyD,EAAQD,EAASS,GAEjC,YoBlkcA,SAAAi5D,GAA0Bz3C,EAAcoH,EAAcyX,EACpD64B,GAOA,WARoD,KAAA74B,OAAA,OACpD,KAAA64B,MAAA,MAEKA,IACHA,EAAS,GAAIC,GAAAC,OACb/4B,GAAU,GAEZ64B,EAAOD,UAAUz3C,EAAMoH,EAAMyX,GACtB64B,EAIT,QAAAG,GAAyBH,GACvB,MAAOA,GAAOG,WAIhB,QAAAC,GAA+BJ,GAC7B,GAAIllC,GAAUklC,EAAOllC,OACrB,OAAOA,GAAQ7O,kBAAoB6O,EAAQrR,YAAY9gB,OACnDmyB,EAAQrR,YAAYqR,EAAQ7O,qBAC5B,KAON,QAAAo0C,GAAuB74C,GACrB,MAAOA,GAAQV,UAAYgE,EAAA/D,mBAAmBC,KAIhD,QAAAs5C,GAA0B94C,GACxB,MAAOA,GAAQV,UAAYgE,EAAA/D,mBAAmBE,QAIhD,QAAAs5C,GAAwB/4C,GACtB,MAAOA,GAAQV,UAAYgE,EAAA/D,mBAAmBG,MAIhD,QAAAs5C,KACE,MAAO,IAAI71D,GAAA86B,QAIb,QAAAg7B,GAA0Bl0C,EAAkBlQ,GAC1CkQ,EAAQlQ,OAASA,EAInB,QAAAqkD,GAAiCn0C,EAAkBoZ,GACjDpZ,EAAQoZ,cAAgBA,EAI1B,QAAAg7B,GAA4Bp0C,EAAkBqZ,GAC5CrZ,EAAQqZ,SAAWA,EAIrB,QAAAg7B,GAA4Br0C,EAAkBsZ,GAC5CtZ,EAAQsZ,SAAWA,EAIrB,QAAAg7B,GAA6Bt0C,EAAkBpK,GAC7CoK,EAAQpK,UAAYA,EAItB,QAAA2+C,GAA8Bv0C,EAAkBuZ,GAC9CvZ,EAAQuZ,WAAaA,EAIvB,QAAAgB,GAAwBk5B,EAAgBzzC,OAAA,KAAAA,MAAA,KACtC,IAAIuO,GAAUklC,EAAO/P,QAErB,OADe,IAAItlD,GAAA27B,SAASxL,EAASvO,GACrBua,UAIlB,QAAAi6B,GAA0Bz6D,GACxB,GAAI06D,GAAa,GAAIC,GAAAC,UAErB,OADAF,GAAWD,UAAUz6D,GACd06D,EAAW/Q,SpB6+bpBvoD,OAAOC,eAAetB,EAAS,cAAgBoE,OAAO,GoB9lctD,IAAAE,GAAA7D,EAAA,GAMAm6D,EAAAn6D,EAAA,IAIAgkB,EAAAhkB,EAAA,EAwCoCT,GAAA86D,iBArClCr2C,EAAAvD,uBAOF,IAAA04C,GAAAn5D,EAAA,GAKAT,GAAA05D,YAYA15D,EAAA85D,WAKA95D,EAAA+5D,iBAWA/5D,EAAAg6D,SAKAh6D,EAAAi6D,YAKAj6D,EAAAk6D,UAKAl6D,EAAAm6D,gBAKAn6D,EAAAo6D,YAKAp6D,EAAAq6D,mBAKAr6D,EAAAs6D,cAKAt6D,EAAAu6D,cAKAv6D,EAAAw6D,eAKAx6D,EAAAy6D,gBAKAz6D,EAAAygC,UAOAzgC,EAAA06D,WAOA,IAAAx7B,GAAAz+B,EAAA,EAAST,GAAAolB,eAAA8Z,EAAA9Z,gBpBglcH,SAAUnlB,EAAQD,EAASS,GAEjC,YqBv4aA,SAAAs6D,GAA0B9oD,GACxB,OAAQA,GACN,IAAK2S,GAAAvgB,WAAWgQ,KAAM,MAAO,MAC7B,KAAKuQ,GAAAvgB,WAAW2Y,IAAK,MAAO,KAC5B,KAAK4H,GAAAvgB,WAAW6Y,IAAK,MAAO,KAC5B,KAAK0H,GAAAvgB,WAAWgZ,IAAK,MAAO,KAC5B,KAAKuH,GAAAvgB,WAAWkZ,IAAK,MAAO,KAC5B,KAAKqH,GAAAvgB,WAAW22D,YAAa,KAAM,IAAIh/C,OAAM,mBAC7C,KAAK4I,GAAAvgB,WAAW42D,KAAM,KAAM,IAAIj/C,OAAM,YACtC,SAAS,KAAM,IAAIA,OAAM,oBrBg4a7B3a,OAAOC,eAAetB,EAAS,cAAgBoE,OAAO,GqB3sctD,IAAAwgB,GAAAnkB,EAAA,GAeAo6D,EAAA,WAWE,QAAAA,KAHAv6D,KAAA2hB,QACA3hB,KAAA46D,WAAkB,EAwyBpB,MA/yBSL,GAAAH,UAAP,SAAiBz6D,GACf,GAAI06D,GAAa,GAAIE,EAErB,OADAF,GAAWD,UAAUz6D,GACd06D,EAAW/Q,UASpBiR,EAAA/4D,UAAA44D,UAAA,SAAUz6D,GACR,KAAM,IAAI+b,OAAM,oBAGlB6+C,EAAA/4D,UAAAq5D,kBAAA,SAAkBlhD,GAChB,GAAI/Y,GAAO0jB,EAAAphB,WAAW43D,yBAAyBnhD,KAAU,IAAM3Z,KAAK46D,WAAWv5C,SAAS,IACpF7M,EAAO41B,yBAAyBzwB,EACpC3Z,MAAK2D,KAAK,aACV3D,KAAK2D,KAAK/C,GACVZ,KAAK2D,KAAK,IACT,KAAK,GAAIrD,GAAW,EAAG4B,EAAW64D,8BAA8BphD,GAAOrZ,EAAI4B,IAAK5B,EAC3EA,EAAI,GAAGN,KAAK2D,KAAK,MACrB3D,KAAK2D,KAAK,KACV3D,KAAK2D,KAAKrD,EAAE+gB,SAAS,KACrBrhB,KAAK2D,KAAK,MACV3D,KAAK2D,KAAK82D,EAAiBO,0BAA0BrhD,EAAMrZ,IAE7DN,MAAK2D,KAAK,OACV3D,KAAK2D,KAAK82D,EAAiBQ,2BAA2BthD,KACtD3Z,KAAK2D,KAAK,KACN4Y,yBAAyB/H,IAAS8P,EAAA9f,aAAa02D,OACjDl7D,KAAK2D,KAAK,OAEZ3D,KAAKm7D,oBAAoB3mD,GACrB+H,yBAAyB/H,IAAS8P,EAAA9f,aAAa02D,OACjDl7D,KAAK2D,KAAK,WAEV3D,KAAK46D,YAGTL,EAAA/4D,UAAA25D,oBAAA,SAAoBnqD,GAClB,GAGIoqD,GACAC,EACA/6D,EAAU4B,EALV43B,EAAKvd,yBAAyBvL,GAC9BW,EAAO8K,2BAA2BzL,EAMtC,QAAQ8oB,GAEN,IAAKxV,GAAA9f,aAAa02D,MAOhB,IAN0D,OAArDG,EAAS/2C,EAAAphB,WAAWo4D,sBAAsBtqD,OAC7ChR,KAAK2D,KAAK03D,GACVr7D,KAAK2D,KAAK,OAEZ3D,KAAK2D,KAAK,OACVzB,EAAIq5D,6BAA6BvqD,GAC5B1Q,EAAI,EAAGA,EAAI4B,IAAK5B,EACnBN,KAAKm7D,oBAAoBK,uBAAuBxqD,EAAM1Q,GAGxD,YADAN,MAAK2D,KAAK,MAGZ,KAAK2gB,GAAA9f,aAAai3D,GAiBhB,YAhBI9pD,GAAQ2S,EAAAvgB,WAAWgQ,MACrB/T,KAAK2D,KAAK,QACV3D,KAAKm7D,oBAAoBO,wBAAwB1qD,IACjDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBQ,qBAAqB3qD,KAC1CoqD,EAASQ,sBAAsB5qD,MACjChR,KAAK2D,KAAK,UACV3D,KAAKm7D,oBAAoBC,MAG3Bp7D,KAAKm7D,oBAAoBO,wBAAwB1qD,IACjDhR,KAAK2D,KAAK,OACV3D,KAAKm7D,oBAAoBQ,qBAAqB3qD,IAC9ChR,KAAK2D,KAAK,OACV3D,KAAKm7D,oBAAoBS,sBAAsB5qD,KAInD,KAAKsT,GAAA9f,aAAaq3D,KACyC,OAApDR,EAAS/2C,EAAAphB,WAAW44D,qBAAqB9qD,OAC5ChR,KAAK2D,KAAK03D,GACVr7D,KAAK2D,KAAK,OAEZ3D,KAAK2D,KAAK,OACV3D,KAAKm7D,oBAAoBY,qBAAqB/qD,IAC9ChR,KAAK2D,KAAK,eAEZ,KAAK2gB,GAAA9f,aAAaw3D,MAahB,OAZIZ,EAASa,2BAA2BjrD,MACtChR,KAAK2D,KAAK,QACV3D,KAAKm7D,oBAAoBC,GACzBp7D,KAAK2D,KAAK,YAE8C,OAArD03D,EAAS/2C,EAAAphB,WAAWg5D,sBAAsBlrD,MAC7ChR,KAAK2D,KAAK,UACV3D,KAAK2D,KAAK03D,GACVr7D,KAAK2D,KAAK,QAEV3D,KAAK2D,KAAK,YAId,KAAK2gB,GAAA9f,aAAa23D,OAElB,IAAK73C,GAAA9f,aAAa43D,KAElB,IAAK93C,GAAA9f,aAAa63D,WAElB,IAAK/3C,GAAA9f,aAAa83D,aAElB,IAAKh4C,GAAA9f,aAAa2Y,SAGhB,MAFAnd,MAAK2D,KAAK,SACV3D,MAAK2D,KAAKyZ,0BAA0BpM,GAAMqQ,SAAS,IAGrD,KAAKiD,GAAA9f,aAAa+3D,SAKhB,MAJAv8D,MAAK2D,KAAK,KACV3D,KAAK2D,KAAK64D,0BAA0BxrD,GAAMqQ,SAAS,KACnDrhB,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBsB,0BAA0BzrD,GAGrD,KAAKsT,GAAA9f,aAAa6Y,UAElB,IAAKiH,GAAA9f,aAAak4D,UAElB,IAAKp4C,GAAA9f,aAAagZ,KAQhB,MAPAxd,MAAK2D,KAAK,SACV3D,KAAK2D,KAAK82D,EAAiB9oD,IAC3B3R,KAAK2D,KAAK,MACV3D,KAAK2D,KAAKia,uBAAuB5M,GAAMqQ,SAAS,KAChDrhB,KAAK2D,KAAK,OACV3D,KAAKm7D,oBAAoB19C,oBAAoBzM,QAC7ChR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAA9f,aAAam4D,MAUhB,MATA38D,MAAK2D,KAAK,UACV3D,KAAK2D,KAAK82D,EAAiB9oD,IAC3B3R,KAAK2D,KAAK,MACV3D,KAAK2D,KAAKi5D,wBAAwB5rD,GAAMqQ,SAAS,KACjDrhB,KAAK2D,KAAK,OACV3D,KAAKm7D,oBAAoB0B,qBAAqB7rD,IAC9ChR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoB2B,uBAAuB9rD,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAA9f,aAAagY,MAChB,OAAQ7K,GAEN,IAAK2S,GAAAvgB,WAAW2Y,IAEd,WADA1c,MAAK2D,KAAKgZ,0BAA0B3L,GAAMqQ,SAAS,IAGrD,KAAKiD,GAAAvgB,WAAW6Y,IASd,WARA5c,MAAK2D,KACHmuD,cACEr8B,QACE5Y,6BAA6B7L,GAC7B8L,8BAA8B9L,KAMtC,KAAKsT,GAAAvgB,WAAWgZ,IAEd,WADA/c,MAAK2D,KAAKqZ,0BAA0BhM,GAAMqQ,SAAS,IAGrD,KAAKiD,GAAAvgB,WAAWkZ,IAEd,WADAjd,MAAK2D,KAAKuZ,0BAA0BlM,GAAMqQ,SAAS,KAGvD,KAEF,KAAKiD,GAAA9f,aAAauZ,MAChB,OAAQE,oBAAoBjN,IAE1B,IAAKsT,GAAAje,QAAQ6mD,OAIX,MAHAltD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ+mD,OAIX,MAHAptD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQinD,UAIX,MAHAttD,MAAK2D,KAAK,gBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQkwC,OACb,IAAKjyB,GAAAje,QAAQmwC,OAGX,MAFAx2C,MAAK2D,KAAK,SACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ2mD,OAIX,MAHAhtD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ2nD,QAIX,MAHAhuD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ6nD,SAIX,MAHAluD,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQyoD,SAIX,MAHA9uD,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQioD,WAIX,MAHAtuD,MAAK2D,KAAK,iBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQuoD,QAIX,MAHA5uD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ43B,OACb,IAAK3Z,GAAAje,QAAQ63B,OAGX,MAFAl+B,MAAK2D,KAAK,SACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ8mD,OAIX,MAHAntD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQgnD,OAIX,MAHArtD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQknD,UAIX,MAHAvtD,MAAK2D,KAAK,gBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ4mD,OAIX,MAHAjtD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ4nD,QAIX,MAHAjuD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ8nD,SAIX,MAHAnuD,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ0oD,SAIX,MAHA/uD,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQkoD,WAIX,MAHAvuD,MAAK2D,KAAK,iBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQwoD,QAIX,MAHA7uD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQslC,UAGX,MAFA3rC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQulC,UAGX,MAFA5rC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQqlC,QAKb,IAAKpnB,GAAAje,QAAQskC,cAGX,MAFA3qC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQqkC,cAGX,MAFA1qC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQwkC,cAGX,MAFA7qC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQukC,cAGX,MAFA5qC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ0kC,cAGX,MAFA/qC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQykC,cAGX,MAFA9qC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ4kC,cAGX,MAFAjrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ2kC,cAGX,MAFAhrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQmoD,eAIX,MAHAxuD,MAAK2D,KAAK,yBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQooD,eAIX,MAHAzuD,MAAK2D,KAAK,yBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQ+kC,gBAGX,MAFAprC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQmlC,gBAGX,MAFAxrC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQglC,gBAGX,MAFArrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQolC,gBAGX,MAFAzrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ6kC,gBAGX,MAFAlrC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQilC,gBAGX,MAFAtrC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQ8kC,gBAGX,MAFAnrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQklC,gBAGX,MAFAvrC,MAAK2D,KAAK,kBACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQmkC,WAGX,MAFAxqC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQokC,UAGX,MAFAzqC,MAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBn9C,uBAAuBhN,GAGlD,KAAKsT,GAAAje,QAAQqoD,eAIX,MAHA1uD,MAAK2D,KAAK,yBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAje,QAAQsoD,eAIX,MAHA3uD,MAAK2D,KAAK,yBACV3D,KAAKm7D,oBAAoBn9C,uBAAuBhN,QAChDhR,MAAK2D,KAAK,KAGd,KAEF,KAAK2gB,GAAA9f,aAAa8W,OAChB,OAAQ8C,qBAAqBpN,IAE3B,IAAKsT,GAAAjb,SAAS85B,OACd,IAAK7e,GAAAjb,SAASklC,OACd,IAAKjqB,GAAAjb,SAASmlC,OACd,IAAKlqB,GAAAjb,SAASolC,OAIZ,MAHAzuC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASulC,OACd,IAAKtqB,GAAAjb,SAASwlC,OACd,IAAKvqB,GAAAjb,SAASylC,OACd,IAAKxqB,GAAAjb,SAAS0lC,OAIZ,MAHA/uC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS6lC,OACd,IAAK5qB,GAAAjb,SAAS8lC,OACd,IAAK7qB,GAAAjb,SAAS+lC,OACd,IAAK9qB,GAAAjb,SAASgmC,OAIZ,MAHArvC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASmmC,OACd,IAAKlrB,GAAAjb,SAASomC,OACd,IAAKnrB,GAAAjb,SAASumC,OACd,IAAKtrB,GAAAjb,SAASwmC,OAIZ,MAHA7vC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASqmC,OAMZ,MALA1vC,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAAS2mC,OACd,IAAK1rB,GAAAjb,SAAS4mC,OAIZ,MAHAjwC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS6mC,OAMZ,MALAlwC,MAAK2D,KAAK,eACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAAS00B,OACd,IAAKzZ,GAAAjb,SAAS2nC,OAIZ,MAHAhxC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS8nC,MACd,IAAK7sB,GAAAjb,SAAS+nC,MAIZ,MAHApxC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASkoC,OACd,IAAKjtB,GAAAjb,SAASmoC,OAIZ,MAHAxxC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASy0B,OACd,IAAKxZ,GAAAjb,SAASinC,OAIZ,MAHAtwC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASqnC,OACd,IAAKpsB,GAAAjb,SAASsnC,OAIZ,MAHA3wC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,aACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASw0B,OACd,IAAKvZ,GAAAjb,SAASonC,OAIZ,MAHAzwC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASmkD,QAMZ,MALAxtD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASqkD,QAMZ,MALA1tD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASu+B,MACd,IAAKtjB,GAAAjb,SAAS2kC,MACd,IAAK1pB,GAAAjb,SAAS+0B,MACd,IAAK9Z,GAAAjb,SAASg1B,MAIZ,MAHAr+B,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASk1B,MACd,IAAKja,GAAAjb,SAASm1B,MACd,IAAKla,GAAAjb,SAASo1B,MACd,IAAKna,GAAAjb,SAASq1B,MAIZ,MAHA1+B,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS8iC,MACd,IAAK7nB,GAAAjb,SAAS+iC,MACd,IAAK9nB,GAAAjb,SAASkjC,MACd,IAAKjoB,GAAAjb,SAASmjC,MAIZ,MAHAxsC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASgjC,MAKZ,MAJArsC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS4jC,MACd,IAAK3oB,GAAAjb,SAAS6jC,MACd,IAAK5oB,GAAAjb,SAASgkC,MACd,IAAK/oB,GAAAjb,SAASikC,MAIZ,MAHAttC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS8jC,MAKZ,MAJAntC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,iBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASqjC,MACd,IAAKpoB,GAAAjb,SAASsjC,MACd,IAAKroB,GAAAjb,SAASyjC,MACd,IAAKxoB,GAAAjb,SAAS0jC,MAIZ,MAHA/sC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,WACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASujC,MAKZ,MAJA5sC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASmkC,MACd,IAAKlpB,GAAAjb,SAASokC,MACd,IAAKnpB,GAAAjb,SAASukC,MACd,IAAKtpB,GAAAjb,SAASwkC,MAIZ,MAHA7tC,MAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,YACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASqkC,MAKZ,MAJA1tC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,iBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASsmC,OAKZ,MAJA3vC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS8mC,OAKZ,MAJAnwC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGlD,KAAKsT,GAAAjb,SAASokD,QAMb,MALAztD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASskD,QAMZ,MALA3tD,MAAK2D,KAAK,cACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASijC,MAKZ,MAJAtsC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS+jC,MAKZ,MAJAptC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,iBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASwjC,MAKZ,MAJA7sC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,gBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAASskC,MAKZ,MAJA3tC,MAAK2D,KAAK,SACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,iBACV3D,MAAKm7D,oBAAoBh9C,wBAAwBnN,GAGnD,KAAKsT,GAAAjb,SAAS+kD,YAMZ,MALApuD,MAAK2D,KAAK,kBACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASykD,OAMZ,MALA9tD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASukD,OAMZ,MALA5tD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGV,KAAK2gB,GAAAjb,SAASglD,YAMd,MALAruD,MAAK2D,KAAK,kBACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAAS0kD,OAMZ,MALA/tD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAAjb,SAASwkD,OAMZ,MALA7tD,MAAK2D,KAAK,aACV3D,KAAKm7D,oBAAoBj9C,uBAAuBlN,IAChDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoBh9C,wBAAwBnN,QACjDhR,MAAK2D,KAAK,KAGd,MAEF,KAAK2gB,GAAA9f,aAAau4D,OAUhB,MATA/8D,MAAK2D,KAAK,WACV3D,KAAK2D,KAAK82D,EAAiB9oD,IAC3B3R,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoB6B,yBAAyBhsD,IAClDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoB8B,0BAA0BjsD,IACnDhR,KAAK2D,KAAK,MACV3D,KAAKm7D,oBAAoB+B,4BAA4BlsD,QACrDhR,MAAK2D,KAAK,IAGZ,KAAK2gB,GAAA9f,aAAa24D,KAGhB,MAFAn9D,MAAKm7D,oBAAoBiC,sBAAsBpsD,QAC/ChR,MAAK2D,KAAK,MAGZ,KAAK2gB,GAAA9f,aAAa64D,OAQhB,aAPIjC,EAASkC,wBAAwBtsD,KACnChR,KAAK2D,KAAK,WACV3D,KAAKm7D,oBAAoBC,GACzBp7D,KAAK2D,KAAK,QAEV3D,KAAK2D,KAAK,aAId,KAAK2gB,GAAA9f,aAAa+4D,KAChB,OAAQC,mBAAmBxsD,IACzB,IAAKsT,GAAApW,OAAOghD,cAEV,WADAlvD,MAAK2D,KAAK,mBAEZ,KAAK2gB,GAAApW,OAAOihD,WAIV,MAHAnvD,MAAK2D,KAAK,gBACV3D,KAAKm7D,oBAAoBsC,wBAAwBzsD,EAAM,QACvDhR,MAAK2D,KAAK,KAGd,KAEF,KAAK2gB,GAAA9f,aAAak5D,IAEhB,WADA19D,MAAK2D,KAAK,MAGZ,KAAK2gB,GAAA9f,aAAak2D,YAEhB,WADA16D,MAAK2D,KAAK,gBAGZ,KAAK2gB,GAAA9f,aAAam5D,cAElB,IAAKr5C,GAAA9f,aAAao5D,UAElB,IAAKt5C,GAAA9f,aAAaq5D,WAElB,IAAKv5C,GAAA9f,aAAas5D,YAEpB,KAAM,IAAIpiD,OAAM,oBAGV6+C,EAAA/4D,UAAAmC,KAAR,SAAage,GAEX3hB,KAAK2hB,KAAKhe,KAAKge,IAGjB44C,EAAA/4D,UAAA8nD,OAAA,WACE,GAAItmD,GAAMhD,KAAK2hB,KAAKD,KAAK,GAEzB,OADA1hB,MAAK2hB,QACE3e,GAEXu3D,IAjzBa76D,GAAA66D,crBo4dP,SAAU56D,EAAQD,EAASS,GAEjC,YsB35YA,SAAA49D,GAAkC92C,GAChC,OAAQA,GAEN,IAAK4X,GAAAoN,MAAMgZ,YACT,MAAM,EAER,KAAKpmB,GAAAoN,MAAMyX,MACT,MAAM,EAER,KAAK7kB,GAAAoN,MAAMwK,YACX,IAAK5X,GAAAoN,MAAMyK,MACX,IAAK7X,GAAAoN,MAAMqC,KACX,IAAKzP,GAAAoN,MAAM0C,MACX,IAAK9P,GAAAoN,MAAMiK,UACX,IAAKrX,GAAAoN,MAAMmK,YACX,IAAKvX,GAAAoN,MAAM2K,OACX,IAAK/X,GAAAoN,MAAMuX,KACX,IAAK3kB,GAAAoN,MAAMyW,OACT,MAAM,GAER,KAAK7jB,GAAAoN,MAAM1C,IACT,MAAM,GAER,SACE,OAAM,GAKZ,QAAAy0B,GAA6B/2C,GAC3B,OAAQA,GAEN,IAAK4X,GAAAoN,MAAMlD,MACT,MAAM,EAER,KAAKlK,GAAAoN,MAAMkC,OACX,IAAKtP,GAAAoN,MAAMoC,YACX,IAAKxP,GAAAoN,MAAMyC,aACX,IAAK7P,GAAAoN,MAAM4Y,yBACX,IAAKhmB,GAAAoN,MAAM+C,gBACX,IAAKnQ,GAAAoN,MAAMqD,aACX,IAAKzQ,GAAAoN,MAAM6D,eACX,IAAKjR,GAAAoN,MAAMmE,yBACX,IAAKvR,GAAAoN,MAAMsE,+BACX,IAAK1R,GAAAoN,MAAM2E,2CACX,IAAK/R,GAAAoN,MAAM6E,iBACX,IAAKjS,GAAAoN,MAAMoF,aACX,IAAKxS,GAAAoN,MAAMgF,WACT,MAAM,EAER,KAAKpS,GAAAoN,MAAMyZ,SACT,MAAM,EAER,KAAK7mB,GAAAoN,MAAMyF,QACT,MAAM,EAER,KAAK7S,GAAAoN,MAAMwF,oBACT,MAAM,EAER,KAAK5S,GAAAoN,MAAMiF,IACT,MAAM,EAER,KAAKrS,GAAAoN,MAAMqF,MACT,MAAM,EAER,KAAKzS,GAAAoN,MAAM8E,UACT,MAAM,EAER,KAAKlS,GAAAoN,MAAM8B,cACX,IAAKlP,GAAAoN,MAAMiC,mBACX,IAAKrP,GAAAoN,MAAM6B,qBACX,IAAKjP,GAAAoN,MAAMgC,0BACT,MAAM,GAER,KAAKpP,GAAAoN,MAAMkW,GACX,IAAKtjB,GAAAoN,MAAM+W,GACX,IAAKnkB,GAAAoN,MAAMgX,WACX,IAAKpkB,GAAAoN,MAAMC,SACX,IAAKrN,GAAAoN,MAAMQ,YACX,IAAK5N,GAAAoN,MAAMe,gBACX,IAAKnO,GAAAoN,MAAMsB,mBACT,MAAM,GAER,KAAK1O,GAAAoN,MAAMoE,kBACX,IAAKxR,GAAAoN,MAAMuE,wBACX,IAAK3R,GAAAoN,MAAM4E,oCACT,MAAM,GAER,KAAKhS,GAAAoN,MAAMqC,KACX,IAAKzP,GAAAoN,MAAM0C,MACT,MAAM,GAER,KAAK9P,GAAAoN,MAAMgD,SACX,IAAKpQ,GAAAoN,MAAMsD,MACX,IAAK1Q,GAAAoN,MAAM8D,QACT,MAAM,GAER,KAAKlR,GAAAoN,MAAM6Y,kBACT,MAAM,GAER,KAAKjmB,GAAAoN,MAAMiK,UACX,IAAKrX,GAAAoN,MAAMmK,YACT,MAAM,GAER,KAAKvX,GAAAoN,MAAMiZ,IACX,IAAKrmB,GAAAoN,MAAM1C,IACX,IAAK1K,GAAAoN,MAAM0Z,YACT,MAAM,GAER,SACE,OAAM,GAKZ,QAAAsY,GAA4Bh3C,GAC1B,OAAQA,GAEN,IAAK4X,GAAAoN,MAAMkC,OACX,IAAKtP,GAAAoN,MAAMoC,YACX,IAAKxP,GAAAoN,MAAMyC,aACX,IAAK7P,GAAAoN,MAAM4Y,yBACX,IAAKhmB,GAAAoN,MAAM+C,gBACX,IAAKnQ,GAAAoN,MAAMqD,aACX,IAAKzQ,GAAAoN,MAAM6D,eACX,IAAKjR,GAAAoN,MAAMmE,yBACX,IAAKvR,GAAAoN,MAAMsE,+BACX,IAAK1R,GAAAoN,MAAM2E,2CACX,IAAK/R,GAAAoN,MAAM6E,iBACX,IAAKjS,GAAAoN,MAAMoF,aACX,IAAKxS,GAAAoN,MAAMgF,WACX,IAAKpS,GAAAoN,MAAMyZ,SACX,IAAK7mB,GAAAoN,MAAM6Y,kBACT,OAAO,CAET,SACE,OAAO,GtB4xYb,GAAI3hC,GAAanjB,MAAQA,KAAKmjB,WAAc,WACxC,GAAIC,GAAgBriB,OAAOsiB,iBACpBC,uBAA2B5f,QAAS,SAAU/C,EAAG4iB,GAAK5iB,EAAE2iB,UAAYC,IACvE,SAAU5iB,EAAG4iB,GAAK,IAAK,GAAI7hB,KAAK6hB,GAAOA,EAAE9hB,eAAeC,KAAIf,EAAEe,GAAK6hB,EAAE7hB,IACzE,OAAO,UAAUf,EAAG4iB,GAEhB,QAASC,KAAOxjB,KAAKyjB,YAAc9iB,EADnCyiB,EAAcziB,EAAG4iB,GAEjB5iB,EAAEa,UAAkB,OAAN+hB,EAAaxiB,OAAOgO,OAAOwU,IAAMC,EAAGhiB,UAAY+hB,EAAE/hB,UAAW,GAAIgiB,OAGvFziB,QAAOC,eAAetB,EAAS,cAAgBoE,OAAO,GsBh6dtD,IAAA86B,GAAAz+B,EAAA,GAMA0+B,EAAA1+B,EAAA,GAMAgkB,EAAAhkB,EAAA,GAKAg4C,EAAAh4C,EAAA,IAIAkkB,EAAAlkB,EAAA,GAyDAo5D,EAAA,SAAAn0C,GAUE,QAAAm0C,KAAA,GAAAl0C,GACED,EAAA5kB,KAAAR,OAAOA,ItBw1dH,OsB91dNqlB,GAAA64C,QAAoB,GAAIx6D,OAExB2hB,EAAA84C,QAAuB,GAAIvuC,KAKzBvK,EAAK8O,QAAU,GAAIyK,GAAAzZ,QAAQE,EAAKvC,atBu1drBuC,EsB59Yf,MAv4E4BlC,GAAAo2C,EAAAn0C,GAgB1Bm0C,EAAA/3D,UAAA43D,UAAA,SACEz3C,EACAoH,EACAyX,GAKA,IAAK,GADDjf,GAAiB42B,EAAA2E,UAAc/zB,GAC1BzoB,EAAI,EAAG4B,EAAIlC,KAAKm0B,QAAQzO,QAAQ1jB,OAAQ1B,EAAI4B,IAAK5B,EACxD,GAAIN,KAAKm0B,QAAQzO,QAAQplB,GAAGihB,gBAAkBA,EAAgB,MAEhEvhB,MAAKm+D,QAAQtuC,IAAItO,EAGjB,IAAID,GAAS,GAAI+C,GAAA08B,OACfx/B,EACAI,EACA6e,EACInc,EAAAy8B,WAAWI,MACXn4B,EAAKg0B,WAAWne,EAAA9Z,iBAAmBiE,EAAKmqC,QAAQt0B,EAAAra,eAAgBqa,EAAA9Z,eAAe9iB,QAAU,EACvFqiB,EAAAy8B,WAAWK,QACX98B,EAAAy8B,WAAW2B,QAEnBziD,MAAKm0B,QAAQzO,QAAQ/hB,KAAK2d,EAG1B,IAAI88C,GAAK,GAAIv/B,GAAAmlB,UAAU1iC,EAAQthB,KAAKm0B,QAAQrR,YAE5C,KADAxB,EAAO0/B,UAAYod,GACXA,EAAGtX,KAAKjoB,EAAAoN,MAAMua,YAAY,CAChC,GAAIx/B,GAAYhnB,KAAKq+D,uBAAuBD,EACxCp3C,KACFA,EAAU8B,OAASxH,EACnBA,EAAOwF,WAAWnjB,KAAKqjB,IAG3Bo3C,EAAG9U,UAILiQ,EAAA/3D,UAAA68D,uBAAA,SACED,EACAE,OAAA,KAAAA,OAAA,EAKA,KADA,GAAI5zC,GAAiC,KAC9B0zC,EAAGtX,KAAKjoB,EAAAoN,MAAM8Z,KAAK,CACxB,GAAIv4B,GAAYxtB,KAAKu+D,eAAeH,EACpC,KAAK5wC,EAAW,KACX9C,KAAYA,MACjBA,EAAW/mB,KAAK6pB,GAIlB,GAAIlB,GAA+B,IAC/B8xC,GAAGtX,KAAKjoB,EAAAoN,MAAM1kB,UAChB+E,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAa7E,OAAQ62C,EAAGn9C,SAAUqL,IAE5E8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMvX,WAChBpI,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAasI,QAAS0pC,EAAGn9C,SAAUqL,GAC/E8xC,EAAG3X,MAAK,GACJ2X,EAAG9Z,oBACLtkD,KAAKgjB,MACHmB,EAAAhC,eAAeq8C,8BACfJ,EAAGn9C,MAAMm9C,EAAGra,OAMlBqa,EAAGrX,MAGH,IACItP,GADAzwB,EAA8B,IAIlC,QAAQo3C,EAAGv6C,QAET,IAAKgb,GAAAoN,MAAMpX,MAET,GADAvI,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAayI,MAAOupC,EAAGn9C,SAAUqL,GACzE8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMrX,MAAO,CACvB5N,EAAYhnB,KAAKy+D,UAAUL,EAAI9xC,EAAW5B,EAC1C,OAEF1D,EAAYhnB,KAAK0+D,cAAcN,EAAI9xC,EAAW5B,GAC9CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAMpW,IACTvJ,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAayJ,IAAKuoC,EAAGn9C,SAAUqL,EAG7E,KAAKuS,GAAAoN,MAAMsX,IACTv8B,EAAYhnB,KAAK0+D,cAAcN,EAAI9xC,EAAW5B,GAC9CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAMrX,KACT5N,EAAYhnB,KAAKy+D,UAAUL,EAAI9xC,EAAW5B,GAC1CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAM/T,SACTlR,EAAYhnB,KAAK2+D,cAAcP,EAAI9xC,EAAW5B,GAC9CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAMxV,SACT,IAAK2nC,EAAGtX,KAAKjoB,EAAAoN,MAAMrZ,OAAQ,CACzB5yB,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,MAAMm9C,EAAGra,KAAM,QAEpB,OAEFz3B,EAAYjI,EAAAmzB,YACVnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAaqK,SAAU2nC,EAAGn9C,SAAUqL,EAI5D,KAAKuS,GAAAoN,MAAMrZ,MACT5L,EAAYhnB,KAAK4+D,WAAWR,EAAI9xC,EAAW5B,GAC3CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAM1X,UACTvN,EAAYhnB,KAAK6+D,eAAeT,EAAI9xC,EAAW5B,GAC/CA,EAAa,IACb,MAEF,KAAKmU,GAAAoN,MAAMtkB,OAEPX,GADEywB,EAAWpzB,EAAAqzB,YAAYrzB,EAAA+H,aAAa7E,OAAQ+E,IAClCtsB,KAAK8+D,kBAAkBV,EAAI3mB,EAASx2B,OAEpCjhB,KAAK++D,YAAYX,GAE3B9xC,GAAWjI,EAAAgzB,qBAAqB/qB,EACpC,MAEF,KAAKuS,GAAAoN,MAAMqU,KACTt5B,EAAYhnB,KAAKg/D,qBAAqBZ,EAAI9xC,EAAW5B,GACrDA,EAAa,IACb,MAEF,SAGMrG,EAAA8H,YAAY9H,EAAA+H,aAAa7E,OAAQ+E,IACnC8xC,EAAGpX,QACHhgC,EAAYhnB,KAAKi/D,YAAYb,EAAI9xC,KAI7BA,KACEmrB,EAAWpzB,EAAAqzB,YAAYrzB,EAAA+H,aAAasI,QAASpI,KAC/CtsB,KAAKgjB,MACHmB,EAAAhC,eAAe+8C,gCACfznB,EAASx2B,MAAO,WAGpBoD,EAAAgzB,qBAAqB/qB,IAEvB8xC,EAAGpX,QACEsX,IACHt3C,EAAYhnB,KAAKm/D,eAAef,GAAI,KAO5C,GAAI1zC,EACF,IAAK,GAAIpqB,GAAI,EAAG4B,EAAIwoB,EAAW1oB,OAAQ1B,EAAI4B,IAAK5B,EAC9CN,KAAKgjB,MACHmB,EAAAhC,eAAei9C,8BACf10C,EAAWpqB,GAAG2gB,MAIpB,OAAO+F,IAITuyC,EAAA/3D,UAAAg4D,SAAA,WACE,MAAOx5D,MAAKk+D,QAAQl8D,OAAShC,KAAKk+D,QAAQ51B,QAAU,MAItDixB,EAAA/3D,UAAA8nD,OAAA,WACE,GAAItpD,KAAKk+D,QAAQl8D,OAAQ,KAAM,IAAI0Z,OAAM,uBAGzC,OAFA1b,MAAKk+D,WACLl+D,KAAKm+D,QAAQkB,QACNr/D,KAAKm0B,SAIdolC,EAAA/3D,UAAA89D,UAAA,SACElB,EACAmB,EACAC,OADA,KAAAD,OAAA,OACA,KAAAC,OAAA,EAIA,IAAI3b,GAAQua,EAAGv6C,OACX47C,EAAWrB,EAAGna,QAGlB,IAAIJ,GAAShlB,EAAAoN,MAAMuX,KACjB,MAAOn/B,GAAA+zB,KAAKC,WACVh0B,EAAA+zB,KAAKI,2BAA2B,OAAQ4lB,EAAGn9C,aAAc,EAAOm9C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAI1F,IAAIpyC,EAGJ,IAAI4tD,GAAuB1b,GAAShlB,EAAAoN,MAAM0Y,UAAW,CACnD,GAAI+a,GAAY1/D,KAAKs/D,UAAUlB,GAAI,EAAOoB,EAC1C,KAAKE,EAAW,MAAO,KACvB,KAAKtB,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAOjB,MANK4a,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,MAAMm9C,EAAGra,KAAM,KAGf,IAETpyC,GAAO+tD,EACP/tD,EAAKsP,MAAMW,MAAQ69C,EACnB9tD,EAAKsP,MAAMY,IAAMu8C,EAAGra,QAGf,IAAIF,GAAShlB,EAAAoN,MAAMxY,KACxB9hB,EAAO0S,EAAA+zB,KAAKC,WACVh0B,EAAA+zB,KAAK8C,qBAAqBkjB,EAAGn9C,aAAc,EAAOm9C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,UAIrE,IAAIF,GAAShlB,EAAAoN,MAAM7C,MAAQya,GAAShlB,EAAAoN,MAAM/C,MAC/Cv3B,EAAO0S,EAAA+zB,KAAKC,WACVh0B,EAAA+zB,KAAKI,2BAA2B,OAAQ4lB,EAAGn9C,aAAc,EAAOm9C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,UAInF,IAAIF,GAAShlB,EAAAoN,MAAMyY,cACxB0Z,EAAGl7D,aACHyO,EAAO0S,EAAA+zB,KAAKC,WACVh0B,EAAA+zB,KAAKI,2BAA2B,SAAU4lB,EAAGn9C,aAAc,EAAOm9C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,UAIrF,IAAIF,GAAShlB,EAAAoN,MAAMnY,WA6CxB,MANK0rC,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAGA,IA5CP,IAAIwO,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEsW,EAAa,GAAI7zB,OACjBk8D,GAAW,CAGf,IAAIxB,EAAGtX,KAAKjoB,EAAAoN,MAAMC,UAAW,CAC3B,EAAG,CACD,GAAIhT,GAAYl5B,KAAKs/D,UAAUlB,GAAI,EAAMoB,EACzC,KAAKtmC,EAAW,MAAO,KACvB3B,GAAW5zB,KAAeu1B,SACnBklC,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAMQ,aAOjB,MANK+yB,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,MAAMm9C,EAAGra,KAAM,KAGf,KAIX,GAAIqa,EAAGtX,KAAKjoB,EAAAoN,MAAMiF,KAAM,CACtB,IAAIktB,EAAGtX,KAAKjoB,EAAAoN,MAAM9C,MAShB,MANKq2B,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,MAAMm9C,EAAGra,KAAM,QAGf,IARP6b,IAAW,EAWfjuD,EAAO0S,EAAA+zB,KAAKC,WAAW5oB,EAAY8H,EAAYqoC,EAAUxB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAYjF,KAAOqa,EAAGtX,KAAKjoB,EAAAoN,MAAM0Z,cAAc,CACjC,GAAIka,GAAezB,EAAGna,QACtB,KAAKma,EAAGtX,KAAKjoB,EAAAoN,MAAM2Z,cAOjB,MANK4Z,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAGT,IAET,IAAI6+C,GAAe1B,EAAGn9C,MAAM4+C,EAAczB,EAAGra,IAI7C,IADA6b,GAAW,EACPxB,EAAGtX,KAAKjoB,EAAAoN,MAAMiF,KAAM,CACtB,IAAIktB,EAAGtX,KAAKjoB,EAAAoN,MAAM9C,MAShB,MANKq2B,IACHx/D,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,QAGT,IARP2+C,IAAW,EAiBf,GANAjuD,EAAO0S,EAAA+zB,KAAKC,WACVh0B,EAAA+zB,KAAKI,2BAA2B,QAASsnB,IACvCnuD,GACFiuD,EACAxB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAEpB6b,EAAU,MAGhB,MAAOjuD,IAKT4nD,EAAA/3D,UAAA+8D,eAAA,SACEH,GAKA,GAAIqB,GAAWrB,EAAGna,QAClB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAG7B,IAFA,GAAIlzB,GAAOw9D,EAAGnX,iBACV5yC,EAAyBgQ,EAAA+zB,KAAKI,2BAA2B53C,EAAMw9D,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAClFqa,EAAGtX,KAAKjoB,EAAAoN,MAAMiZ,MAAM,CACzB,IAAIkZ,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAYhB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IAXPrgB,GAAOw9D,EAAGnX,iBACV5yC,EAAagQ,EAAA+zB,KAAKkC,+BAChBjmC,EACAgQ,EAAA+zB,KAAKI,2BAA2B53C,EAAMw9D,EAAGn9C,SACzCm9C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAU5B,GAAI3Q,EACJ,KAAIgrB,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAMhB,MAAOtgC,GAAA+zB,KAAK8D,gBAAgB7nC,EAAY,KAAM+pD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAJpE,IADA3Q,EAAOpzC,KAAK+/D,eAAe3B,GAEzB,MAAO/5C,GAAA+zB,KAAK8D,gBAAgB7nC,EAAY++B,EAAMgrB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,UAMxE/jD,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAAk9D,cAAA,SACEN,EACA9xC,EACA5B,GAKA,GAAI+0C,GAAWnzC,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MAAQw8C,EAAGna,SACzEt4B,EAAU,GAAIjoB,OACds8D,EAAY37C,EAAA8H,YAAY9H,EAAA+H,aAAasI,QAASpI,EAClD,GAAG,CACD,GAAIhD,GAAStpB,KAAKigE,yBAAyB7B,EAAI4B,EAAW1zC,EAAW5B,EACrE,KAAKpB,EAAQ,MAAO,KACpBqC,GAAQhoB,KAA0B2lB,SAC3B80C,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OAEvB,IAAI/lC,GAAMqhB,EAAA+zB,KAAK4H,wBAAwBr0B,EAASW,EAAW5B,EAAY0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAE7F,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAy+D,yBAAA,SACE7B,EACA4B,EACAE,EACAC,GAKA,OAPA,KAAAH,OAAA,IAOK5B,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAKjB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IAET,IAAIwO,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAErEtP,EAAwB,IACxBysD,GAAGtX,KAAKjoB,EAAAoN,MAAMsZ,SAChB5zC,EAAO3R,KAAKs/D,UAAUlB,GAGxB,IAAIjoD,GAAiC,IACrC,IAAIioD,EAAGtX,KAAKjoB,EAAAoN,MAAMkC,SAQhB,GAPI6xB,GACFhgE,KAAKgjB,MACHmB,EAAAhC,eAAei+C,iDACfhC,EAAGn9C,WAGP9K,EAAcnW,KAAKqgE,gBAAgBjC,EAAI,IACrB,MAAO,UAErB/5C,GAAA8H,YAAY9H,EAAA+H,aAAayI,MAAOqrC,GAC7B77C,EAAA8H,YAAY9H,EAAA+H,aAAasI,QAASwrC,IACrClgE,KAAKgjB,MACHmB,EAAAhC,eAAegmB,wCACf1Y,EAAWxO,OAGLtP,GACV3R,KAAKgjB,MACHmB,EAAAhC,eAAe+f,cACfk8B,EAAGn9C,MAAMm9C,EAAGra,KAIlB,OAAO1/B,GAAA+zB,KAAK8H,0BACVzwB,EACA9d,EACAwE,EACA+pD,EACAC,EACAthC,EAAAnT,MAAMhK,KAAK+N,EAAWxO,MAAOm9C,EAAGn9C,WAIpCs4C,EAAA/3D,UAAAi9D,UAAA,SACEL,EACA9xC,EACA5B,GAKA,GAAI+0C,GAAWnzC,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MAAQw8C,EAAGna,QAC7E,IAAIma,EAAGv6C,QAAUgb,EAAAoN,MAAMnY,WAKrB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IAET,IAAIwO,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,QACzE,IAAIm9C,EAAGv6C,QAAUgb,EAAAoN,MAAM4Z,UAKrB,MAJA7lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAET,IAAI0K,GAAU,GAAIjoB,MAClB,KAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAAa,CAC9B,EAAG,CACD,GAAIx8B,GAAStpB,KAAKsgE,eAAelC,EACjC,KAAK90C,EAAQ,MAAO,KACpBqC,GAAQhoB,KAA2B2lB,SAC5B80C,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAKjB,MAJA9lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAGX,GAAIje,GAAMqhB,EAAA+zB,KAAKoE,sBACb/sB,EACA9D,EACAW,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAA8+D,eAAA,SACElC,GAKA,IAAKA,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAKjB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IAET,IAAIwO,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEnd,EAA2B,IAC/B,OAAIs6D,GAAGtX,KAAKjoB,EAAAoN,MAAMkC,WAChBrqC,EAAQ9D,KAAKqgE,gBAAgBjC,EAAI,IACd,KAEd/5C,EAAA+zB,KAAKsE,2BACVjtB,EACA3rB,EACA+6B,EAAAnT,MAAMhK,KAAK+N,EAAWxO,MAAOm9C,EAAGn9C,WAIpCs4C,EAAA/3D,UAAA++D,YAAA,SACEnC,GAKA,GAAIptD,GAA0B,IAC9B,IACEotD,EAAG3X,MAAK,IAAS5nB,EAAAoN,MAAMuZ,WACvB4Y,EAAG/Z,WAAaxlB,EAAAoN,MAAM6Z,aACrBsY,EAAG9Z,sBAEEtzC,EAAOhR,KAAKqgE,gBAAgBjC,IAAM,MAAO,KAGjD,IAAIp7D,GAAMqhB,EAAA+zB,KAAK6G,sBAAsBjuC,EAAMotD,EAAGn9C,QAE9C,OADAm9C,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAg/D,oBAAA,SACEpC,GAKA,GAAI/sC,GAAiB,GAAI3tB,MACzB,IAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAMQ,aAcjBzsC,KAAKgjB,MACHmB,EAAAhC,eAAes+C,oCACfrC,EAAGn9C,aAhB0B,CAC/B,EAAG,CACD,GAAIy/C,GAAgB1gE,KAAK2gE,mBAAmBvC,EAC5C,KAAKsC,EAAe,MAAO,KAC3BrvC,GAAe1tB,KAAoB+8D,SAC5BtC,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAMQ,aAKjB,MAJAzsC,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAQX,MAAOoQ,IAGTkoC,EAAA/3D,UAAAm/D,mBAAA,SACEvC,GAKA,GAAIA,EAAGv6C,QAAUgb,EAAAoN,MAAMnY,WAAY,CACjC,GAAIrE,GAAapL,EAAA+zB,KAAKI,2BACpB4lB,EAAGnX,iBACHmX,EAAGn9C,SAED+I,EAA+B,IACnC,OAAIo0C,GAAGtX,KAAKjoB,EAAAoN,MAAM2W,YACV54B,EAAchqB,KAAKs/D,UAAUlB,IAAa,KAE3C/5C,EAAA+zB,KAAKiG,oBACV5uB,EACAzF,EACA6U,EAAAnT,MAAMhK,KAAK+N,EAAWxO,MAAOm9C,EAAGn9C,UAQpC,MALEjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAGA,MAGTs4C,EAAA/3D,UAAAo/D,gBAAA,SACExC,GAKA,GAAI7mC,GAAa,GAAI7zB,OACjBm9D,EAA6B,KAC7BC,GAAe,EACfC,GAAe,CAEnB,IAAI3C,EAAG3X,QAAU5nB,EAAAoN,MAAM2Y,WACrB,EAAG,CACD,GAAIoc,GAAQhhE,KAAKihE,eAAe7C,EAChC,KAAK4C,EAAO,MAAO,KAQnB,QAPIH,IAAaE,IACf/gE,KAAKgjB,MACHmB,EAAAhC,eAAe++C,kDACfL,EAASjgE,KAAKqgB,OAEhB8/C,GAAe,GAETC,EAAMxiB,eAEZ,QACMsiB,GACF9gE,KAAKgjB,MACHmB,EAAAhC,eAAeg/C,yDACfH,EAAMpgE,KAAKqgB,MAGf,MAEF,KAAKoD,GAAAy9B,cAAcsf,SACjBN,GAAe,CACf,MAEF,KAAKz8C,GAAAy9B,cAAcuf,KACjBR,EAAWG,EAGfzpC,EAAW5zB,KAAKq9D,SACT5C,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OAEzB,OAAKq1B,GAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAOZrtB,GANLv3B,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,OAKXs4C,EAAA/3D,UAAAy/D,eAAA,SACE7C,GAKA,GAAIkD,IAAS,EACTC,GAAa,EACbC,EAA2B,IAK/B,IAJIpD,EAAGtX,KAAKjoB,EAAAoN,MAAMgZ,eAChBqc,GAAS,EACTE,EAAapD,EAAGn9C,SAEdm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CACxBwtC,IAAQE,EAAapD,EAAGn9C,QAC7B,IAAIwO,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEtP,EAAwB,IAS5B,KARI4vD,EAAanD,EAAGtX,KAAKjoB,EAAAoN,MAAMyZ,YACzB4b,GACFthE,KAAKgjB,MACHmB,EAAAhC,eAAes/C,oCACfhyC,EAAWxO,OAIbm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,UAChB5zC,EAAO3R,KAAKs/D,UAAUlB,IACX,MAAO,KAEpB,IAAIjoD,GAAiC,IACrC,QAAIioD,EAAGtX,KAAKjoB,EAAAoN,MAAMkC,UACZmzB,GACFthE,KAAKgjB,MACHmB,EAAAhC,eAAeu/C,4CACfjyC,EAAWxO,OAGXsgD,EACFvhE,KAAKgjB,MACHmB,EAAAhC,eAAew/C,oDACflyC,EAAWxO,OAGbsgD,GAAa,EAEfprD,EAAcnW,KAAKqgE,gBAAgBjC,EAAI,IAGlC/5C,EAAA+zB,KAAKmG,gBACV9uB,EACA9d,EACAwE,EACAmrD,EACIj9C,EAAAy9B,cAAcuf,KACdE,EACEl9C,EAAAy9B,cAAcsf,SACd/8C,EAAAy9B,cAAcW,QACpB5jB,EAAAnT,MAAMhK,KAAY8/C,EAAYpD,EAAGn9C,UAXR,KAmB7B,MALEjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAGA,MAGTs4C,EAAA/3D,UAAAm9D,cAAA,SACEP,EACA9xC,EACA5B,GAUA,GAAI+0C,GAAWnzC,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MAAQw8C,EAAGna,QAE7E,KAAKma,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAKjB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,MAAMm9C,EAAGra,MAEP,IAGT,IAAIt0B,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAErEoQ,EAAyC,IAC7C,IAAI+sC,EAAGtX,KAAKjoB,EAAAoN,MAAMC,WAEhB,KADA7a,EAAiBrxB,KAAKwgE,oBAAoBpC,IACrB,MAAO,UAE5B/sC,KAGF,KAAK+sC,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAKjB,MAJA3kD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,MAAMm9C,EAAGra,KAAM,KAEb,IAGT,IAAIxsB,GAAav3B,KAAK4gE,gBAAgBxC,EACtC,KAAK7mC,EAAY,MAAO,KAExB,IAAIqqC,GAAWv9C,EAAA8H,YAAY9H,EAAA+H,aAAaG,IAAKD,EACzCs1C,KAEuB,GAArBrqC,EAAWv1B,QACbhC,KAAKgjB,MACHmB,EAAAhC,eAAe0/C,+CACfpyC,EAAWxO,OAIXsW,EAAWv1B,QAAUu1B,EAAW,GAAGphB,aACrCnW,KAAKgjB,MACHmB,EAAAhC,eAAe2/C,oDACfryC,EAAWxO,QAKFoD,EAAA8H,YAAY9H,EAAA+H,aAAaC,IAAKC,IAC7BiL,EAAWv1B,QACzBhC,KAAKgjB,MACHmB,EAAAhC,eAAe4/C,sCACftyC,EAAWxO,MAIf,IAAItL,GAA8B,IAClC,IAAIyoD,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,QAEhB,KADA5vC,EAAa3V,KAAKs/D,UAAUlB,EAAIwD,IACf,MAAO,UAEdA,IACV5hE,KAAKgjB,MACHmB,EAAAhC,eAAe+f,cACfk8B,EAAGn9C,MAAMm9C,EAAGra,KAIhB,IAAIic,GAAY37C,EAAA8H,YAAY9H,EAAA+H,aAAasI,QAASpI,GAE9CxF,EAAiC,IACrC,IAAIs3C,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAUhB,IATA/+B,EAAa,GAAIpjB,OAEbs8D,GACFhgE,KAAKgjB,MACHmB,EAAAhC,eAAeohB,yDACf66B,EAAGn9C,UAICm9C,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CACjC,GAAI9+B,GAAYhnB,KAAKm/D,eAAef,EACpC,KAAKp3C,EAAW,MAAO,KACvBF,GAAWnjB,KAAgBqjB,OAGnBg5C,IACVhgE,KAAKgjB,MACHmB,EAAAhC,eAAeqhB,gFACf46B,EAAGn9C,MAAMm9C,EAAGra,KAIhB,IAAI/gD,GAAMqhB,EAAA+zB,KAAKqG,0BACbhvB,EACA4B,EACakG,EACb5hB,EACAmR,EACAwF,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAo9D,WAAA,SACER,EACA9xC,EACA5B,GAUA,GAAI+0C,GAAW/0C,GAAcA,EAAW1oB,OACpC0oB,EAAW,GAAGzJ,MAAMW,MACpB0K,GAAaA,EAAUtqB,OACvBsqB,EAAU,GAAGrL,MAAMW,MACnBw8C,EAAGna,QAEP,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAE7B,GAKIzC,GALA5B,EAAapL,EAAA+zB,KAAKI,2BACpB4lB,EAAGnX,iBACHmX,EAAGn9C,QAIL,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMC,WAEhB,KADA7a,EAAiBrxB,KAAKwgE,oBAAoBpC,IACrB,MAAO,UAE5B/sC,KAGF,IAAIrH,GAA+B,IACnC,IAAIo0C,EAAGtX,KAAKjoB,EAAAoN,MAAM2W,YAChB54B,EAAchqB,KAAKs/D,UAAUlB,IACX,MAAO,KAG3B,IAAI5yC,GAAkB,GAAI9nB,MAC1B,IAAI06D,EAAGtX,KAAKjoB,EAAAoN,MAAM8W,YAChB,EAAG,CACD,GAAIpxC,GAAO3R,KAAKs/D,UAAUlB,EAC1B,KAAKzsD,EAAM,MAAO,KAClB6Z,GAAgB7nB,KAAegO,SACxBysD,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OAGzB,IAAIq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAAY,CAE5B,GAAIl6B,GAAU,GAAIjoB,MAClB,KAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAAa,CAC9B,GAAIka,GAAY37C,EAAA8H,YAAY9H,EAAA+H,aAAasI,QAASpI,EAClD,GAAG,CACD,GAAIhD,GAAStpB,KAAKgiE,iBAAiB5D,EAAI4B,EACvC,KAAK12C,EAAQ,MAAO,KACpBqC,GAAQhoB,KAA2B2lB,UAC3B80C,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAE1B,MAAOzhC,GAAA+zB,KAAK0D,uBACVrsB,EACA4B,EACArH,EACAwB,EACAG,EACAW,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAIxB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAAwgE,iBAAA,SACE5D,EACA6D,GAYA,IAHA,GAAIxC,GAAWrB,EAAGra,IAEdr5B,EAAa,GAAIhnB,OACd06D,EAAGtX,KAAKjoB,EAAAoN,MAAM8Z,KAAK,CACxB,GAAIv4B,GAAYxtB,KAAKu+D,eAAeH,EACpC,KAAK5wC,EAAW,KAChB9C,GAAW/mB,KAAgB6pB,GAG7B,GAAIlB,GAA+B,IAE/B8xC,GAAGtX,KAAKjoB,EAAAoN,MAAMjW,QAChB1J,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAa4J,OAAQooC,EAAGn9C,SAAUqL,GACrE8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMhW,SACvB3J,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAa6J,QAASmoC,EAAGn9C,SAAUqL,GACtE8xC,EAAGtX,KAAKjoB,EAAAoN,MAAM/V,aACvB5J,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAa8J,UAAWkoC,EAAGn9C,SAAUqL,IAG/E8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMpf,QAChBP,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAaS,OAAQuxC,EAAGn9C,SAAUqL,GACrE8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMxV,YACvBnK,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAaqK,SAAU2nC,EAAGn9C,SAAUqL,IAG9E8xC,EAAGtX,KAAKjoB,EAAAoN,MAAMlW,YAChBzJ,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAa2J,SAAUqoC,EAAGn9C,SAAUqL,IAIlF8xC,EAAGrX,MAEH,IAAI76B,IAAW,EACX01C,GAAW,GAEX11C,EAAWkyC,EAAGtX,KAAKjoB,EAAAoN,MAAM5f,MACvB+xC,EAAG3X,MAAK,GAAM,IAAS5nB,EAAAoN,MAAMnY,YAAesqC,EAAG9Z,oBAGjD8Z,EAAGpX,QACH96B,GAAW,GAHXI,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAaC,IAAK+xC,EAAGn9C,SAAUqL,IAMpEs1C,EAAWxD,EAAGtX,KAAKjoB,EAAAoN,MAAM1f,QAC9B6xC,EAAG3X,MAAK,GAAM,IAAS5nB,EAAAoN,MAAMnY,YAAesqC,EAAG9Z,oBAGjD8Z,EAAGpX,QACH4a,GAAW,GAHXt1C,EAAYjI,EAAAmzB,YAAYnzB,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAaG,IAAK6xC,EAAGn9C,SAAUqL,GAO/E,IAAI41C,GAAgB9D,EAAGtX,KAAKjoB,EAAAoN,MAAM9e,YAClC,IAAI+0C,GAAiB9D,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAE9C,GAIIzC,GAJA5B,EAAayyC,EACb79C,EAAA+zB,KAAKkB,4BAA4B8kB,EAAGn9C,SACpCoD,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,QAG5D,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMC,WAQhB,GAPIg2B,GACFliE,KAAKgjB,MACHmB,EAAAhC,eAAeggD,2DACf/D,EAAGn9C,WAGPoQ,EAAiBrxB,KAAKwgE,oBAAoBpC,IACrB,MAAO,UAE5B/sC,KAIF,IAAI+sC,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC5B,GAAIptB,GAAav3B,KAAK4gE,gBAAgBxC,EACtC,KAAK7mC,EAAY,MAAO,KAEpBrL,IAAYqL,EAAWv1B,QACzBhC,KAAKgjB,MACHmB,EAAAhC,eAAe4/C,sCACftyC,EAAWxO,OAIX2gD,IACuB,GAArBrqC,EAAWv1B,QACbhC,KAAKgjB,MACHmB,EAAAhC,eAAe0/C,+CACfpyC,EAAWxO,OAGXsW,EAAWv1B,QAAUu1B,EAAW,GAAGphB,aACrCnW,KAAKgjB,MACHmB,EAAAhC,eAAe2/C,oDACfryC,EAAWxO,OAKjB,IAAItL,GAA8B,IAClC,IAAIyoD,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,QAahB,GAZI91B,EAAWxI,MAAQ5C,EAAA6C,SAASiG,YAC9BntB,KAAKgjB,MACHmB,EAAAhC,eAAeigD,2DACfhE,EAAGn9C,SAEI2gD,GACT5hE,KAAKgjB,MACHmB,EAAAhC,eAAekgD,oDACfjE,EAAGn9C,WAGPtL,EAAa3V,KAAKs/D,UAAUlB,EAAI3uC,EAAWxI,MAAQ5C,EAAA6C,SAASiG,aAAey0C,IAC1D,MAAO,UACdA,IAAYnyC,EAAWxI,MAAQ5C,EAAA6C,SAASiG,aAClDntB,KAAKgjB,MACHmB,EAAAhC,eAAe+f,cACfk8B,EAAGn9C,QAIP,IAAI6F,GAAiC,IACrC,IAAIs3C,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAQhB,IAPIoc,GACFjiE,KAAKgjB,MACHmB,EAAAhC,eAAeohB,yDACf66B,EAAGn9C,SAGP6F,EAAa,GAAIpjB,QACT06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CACjC,GAAI9+B,GAAYhnB,KAAKm/D,eAAef,EACpC,KAAKp3C,EAAW,MAAO,KACvBF,GAAWnjB,KAAgBqjB,OAEnBi7C,IACVjiE,KAAKgjB,MACHmB,EAAAhC,eAAeqhB,gFACf46B,EAAGn9C,QAIP,IAAIqhD,GAAYj+C,EAAA+zB,KAAKuG,wBACnBlvB,EACA4B,EACAkG,EACA5hB,EACAmR,EACAwF,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACP8c,EAEF,GAAIJ,EACTliE,KAAKgjB,MACHmB,EAAAhC,eAAeogD,sCACf9yC,EAAWxO,WAGR,KAAIiL,IAAY01C,EAOhB,CACL,GAAInqB,IAEAA,EAAWpzB,EAAAqzB,YAAYrzB,EAAA+H,aAAaqK,SAAUnK,KAChDtsB,KAAKgjB,MACHmB,EAAAhC,eAAe+8C,gCACfznB,EAASx2B,MAAO,aAIhBw2B,EAAWpzB,EAAAqzB,YAAYrzB,EAAA+H,aAAaC,IAAKC,KAC3CtsB,KAAKgjB,MACHmB,EAAAhC,eAAe+8C,gCACfznB,EAASx2B,MAAO,QAIhBw2B,EAAWpzB,EAAAqzB,YAAYrzB,EAAA+H,aAAaG,IAAKD,KAC3CtsB,KAAKgjB,MACHmB,EAAAhC,eAAe+8C,gCACfznB,EAASx2B,MAAO,MAIpB,IAAItP,GAAwB,IAC5B,IAAIysD,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,QAEhB,KADA5zC,EAAO3R,KAAKs/D,UAAUlB,IACX,MAAO,UAElBp+D,MAAKgjB,MACHmB,EAAAhC,eAAe+f,cACfk8B,EAAGn9C,QAGP,IAAI9K,GAAiC,IACrC,IAAIioD,EAAGtX,KAAKjoB,EAAAoN,MAAMkC,WAChBh4B,EAAcnW,KAAKqgE,gBAAgBjC,IACjB,MAAO,KAE3B,IAAIoE,GAAWn+C,EAAA+zB,KAAK6F,uBAClBxuB,EACA9d,EACAwE,EACAmW,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPgd,EAtDPxiE,KAAKgjB,MACHmB,EAAAhC,eAAeqhB,gFACf/T,EAAWxO,YAuDfjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAAq9D,eAAA,SACET,EACA9xC,EACA5B,GAKA,GAAI+0C,GAAWnzC,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MAAQw8C,EAAGna,QAC7E,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAIrE,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,QACzE,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAAY,CAE5B,IADA,GAAIl6B,GAAU,GAAIjoB,QACV06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CACjC,GAAIx8B,GAAStpB,KAAKq+D,uBAAuBD,GAAI,EAC7C,KAAK90C,EAAQ,MAAO,KACpBqC,GAAQhoB,KAAK2lB,GAEf,GAAItmB,GAAMqhB,EAAA+zB,KAAK2G,2BACbtvB,EACA9D,EACAW,EACA5B,EACA0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAAy9D,YAAA,SACEb,EACA9xC,GAKA,GAAImzC,GAAWnzC,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MAAQw8C,EAAGna,QAE7E,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAAY,CAC5B,GAAIl6B,GAAU,GAAIjoB,MAClB,KAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAAa,CAC9B,EAAG,CACD,GAAIx8B,GAAStpB,KAAKyiE,kBAAkBrE,EACpC,KAAK90C,EAAQ,MAAO,KACpBqC,GAAQhoB,KAAK2lB,SACN80C,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAKjB,MAJA9lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAGX,GAAI8H,GAAuC,IAC3C,IAAIq1C,EAAGtX,KAAKjoB,EAAAoN,MAAM6W,MAAO,CACvB,IAAIsb,EAAGtX,KAAKjoB,EAAAoN,MAAMyY,eAOhB,MAJA1kD,MAAKgjB,MACHmB,EAAAhC,eAAekM,wBACf+vC,EAAGn9C,SAEE,IANP8H,GAAO1E,EAAA+zB,KAAK0C,8BAA8BsjB,EAAGl7D,aAAck7D,EAAGn9C,SASlE,GAAIje,GAAMqhB,EAAA+zB,KAAKwE,sBAAsBjxB,EAAS5C,EAAMuD,EAAW8xC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAMrF,OALI/gD,GAAIue,iBAAmBvhB,KAAKm+D,QAAQjzC,IAAYloB,EAAIue,kBACtDvhB,KAAKk+D,QAAQv6D,KAAaX,EAAIue,gBAC9BvhB,KAAKm+D,QAAQtuC,IAAY7sB,EAAIue,iBAE/B68C,EAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAOT,MALEhD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAGT,MAGTs4C,EAAA/3D,UAAAihE,kBAAA,SACErE,GAKA,GAAIA,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAIrE,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEyhD,EAA4C,IAChD,IAAItE,EAAGtX,KAAKjoB,EAAAoN,MAAMkW,IAAK,CACrB,IAAIic,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAOhB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IANPyhD,GAAer+C,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAS3E,MAAOoD,GAAA+zB,KAAK8E,mBACVztB,EACAizC,EACAA,EACI7jC,EAAAnT,MAAMhK,KAAK+N,EAAWxO,MAAOyhD,EAAazhD,OAC1CwO,EAAWxO,OAQnB,MALEjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAGA,MAGTs4C,EAAA/3D,UAAAu9D,YAAA,SACEX,GAOA,GAAIqB,GAAWrB,EAAGna,SACdt4B,EAAsC,KACtCqE,EAA6C,KAC7C2yC,GAAW,CACf,IAAIvE,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,YAEhB,GADAl6B,EAAU,GAAIjoB,QACT06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAAa,CAC9B,EAAG,CACD,GAAIx8B,GAAStpB,KAAK4iE,uBAAuBxE,EACzC,KAAK90C,EAAQ,MAAO,KACpBqC,GAAQhoB,KAAK2lB,SACN80C,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,YAKjB,MAJA9lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,UAGN,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMgD,UAAW,CAClC,IAAImvB,EAAGtX,KAAKjoB,EAAAoN,MAAMkW,IAehB,MAJAniD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,MAEP,IAdP,KAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAOhB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IANP+O,GAAgB3L,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,aAgB5E0hD,IAAW,CAGb,IAAIA,GAAYvE,EAAGtX,KAAKjoB,EAAAoN,MAAM6W,MAAO,CACnC,GAAIsb,EAAGtX,KAAKjoB,EAAAoN,MAAMyY,eAAgB,CAChC,GACI1hD,GADA+lB,EAAO1E,EAAA+zB,KAAK0C,8BAA8BsjB,EAAGl7D,aAAck7D,EAAGn9C,QAalE,OAXI+O,IACFjG,QAAQ4B,GACR3oB,EAAMqhB,EAAA+zB,KAAKwF,kCAAkC5tB,EAAejH,EAAMq1C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,OAExF/gD,EAAMqhB,EAAA+zB,KAAKqF,sBAAsB9xB,EAAS5C,EAAMq1C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAEnE/jD,KAAKm+D,QAAQjzC,IAAIloB,EAAIue,kBACxBvhB,KAAKk+D,QAAQv6D,KAAKX,EAAIue,gBACtBvhB,KAAKm+D,QAAQtuC,IAAI7sB,EAAIue,iBAEvB68C,EAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAekM,wBACf+vC,EAAGn9C,aAIPjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,OAGhB,OAAO,OAGTs4C,EAAA/3D,UAAAohE,uBAAA,SACExE,GAKA,GAAIA,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAIrE,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEyhD,EAA4C,IAChD,IAAItE,EAAGtX,KAAKjoB,EAAAoN,MAAMkW,IAAK,CACrB,IAAIic,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAOhB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IANPyhD,GAAer+C,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAS3E,MAAOoD,GAAA+zB,KAAKyF,wBACVpuB,EACAizC,EACAA,EACI7jC,EAAAnT,MAAMhK,KAAK+N,EAAWxO,MAAOyhD,EAAazhD,OAC1CwO,EAAWxO,OAQnB,MALEjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAGA,MAGTs4C,EAAA/3D,UAAAs9D,kBAAA,SACEV,EACAoD,GAKA,GAAIpD,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAI4uC,GAAer+C,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,QAC3E,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMkC,QAAS,CACzB,GAAIiwB,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAIrE,GAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SACrEje,EAAMqhB,EAAA+zB,KAAK4E,4BAA4BvtB,EAAYizC,EAAc7jC,EAAAnT,MAAMhK,KAAK8/C,EAAYpD,EAAGn9C,SAE/F,OADAm9C,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,aAIPjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAA29D,eAAA,SACEf,EACAyE,GAOA,WAPA,KAAAA,OAAA,GAKAzE,EAAGrX,OACSqX,EAAGv6C,QAGb,IAAKgb,GAAAoN,MAAM9G,MACT,MAAOnlC,MAAK8iE,WAAW1E,EAEzB,KAAKv/B,GAAAoN,MAAMpX,MACT,MAAO70B,MAAK0+D,cAAcN,GACxB/5C,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAayI,MAAOupC,EAAGn9C,UAC1C,KAEL,KAAK4d,GAAAoN,MAAM5G,SACT,MAAOrlC,MAAK+iE,cAAc3E,EAE5B,KAAKv/B,GAAAoN,MAAM1G,GACT,MAAOvlC,MAAKgjE,iBAAiB5E,EAE/B,KAAKv/B,GAAAoN,MAAMpG,IACT,MAAO7lC,MAAKijE,kBAAkB7E,EAEhC,KAAKv/B,GAAAoN,MAAMlG,GACT,MAAO/lC,MAAKkjE,iBAAiB9E,EAE/B,KAAKv/B,GAAAoN,MAAMpW,IACT,MAAO71B,MAAK0+D,cAAcN,GACxB/5C,EAAA+zB,KAAKyG,eAAex6B,EAAA+H,aAAayJ,IAAKuoC,EAAGn9C,UACxC,KAEL,KAAK4d,GAAAoN,MAAMsX,IACT,MAAOvjD,MAAK0+D,cAAcN,EAAI,KAAM,KAEtC,KAAKv/B,GAAAoN,MAAM4Z,UACT,MAAO7lD,MAAKmjE,oBAAoB/E,EAAIyE,EAEtC,KAAKhkC,GAAAoN,MAAMhG,OAOT,MANI48B,IACF7iE,KAAKgjB,MACHmB,EAAAhC,eAAeihD,2DACfhF,EAAGn9C,SAGAjhB,KAAKugE,YAAYnC,EAE1B,KAAKv/B,GAAAoN,MAAMuZ,UACT,MAAOnhC,GAAA+zB,KAAKkE,qBAAqB8hB,EAAGn9C,MAAMm9C,EAAGna,UAE/C,KAAKplB,GAAAoN,MAAM9F,OACT,MAAOnmC,MAAKqjE,qBAAqBjF,EAEnC,KAAKv/B,GAAAoN,MAAM5F,MACT,MAAOrmC,MAAKsjE,oBAAoBlF,EAElC,KAAKv/B,GAAAoN,MAAM1F,IACT,MAAOvmC,MAAKujE,kBAAkBnF,EAEhC,KAAKv/B,GAAAoN,MAAMqU,KACT,MAAOtgD,MAAKg/D,qBAAqBZ,EAAI,KAEvC,KAAKv/B,GAAAoN,MAAMxF,MACT,MAAOzmC,MAAKwjE,oBAAoBpF,EAElC,SAEE,MADAA,GAAGpX,QACIhnD,KAAKyjE,yBAAyBrF,KAI3C7E,EAAA/3D,UAAA2hE,oBAAA,SACE/E,EACAyE,GAOA,IAFA,GAAIpD,GAAWrB,EAAGna,SACdn9B,EAAa,GAAIpjB,QACb06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CACjC,GAAI9+B,GAAYhnB,KAAKm/D,eAAef,EAAIyE,EACxC,KAAK77C,EAAW,MAAO,KACvBF,GAAWnjB,KAAKqjB,GAElB,GAAIhkB,GAAMqhB,EAAA+zB,KAAKsD,qBAAqB50B,EAAYs3C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEtE,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAshE,WAAA,SACE1E,GAKA,GAAI3uC,GAA0C,IAC1C2uC,GAAG3X,MAAK,IAAS5nB,EAAAoN,MAAMnY,YAAesqC,EAAG9Z,qBAC3C8Z,EAAGv6C,MAAK,GACR4L,EAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAEvE,IAAIje,GAAMqhB,EAAA+zB,KAAKwD,qBAAqBnsB,EAAY2uC,EAAGn9C,QAEnD,OADAm9C,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAuhE,cAAA,SACE3E,GAKA,GAAI3uC,GAA0C,IAC1C2uC,GAAG3X,MAAK,IAAS5nB,EAAAoN,MAAMnY,YAAesqC,EAAG9Z,qBAC3C8Z,EAAGv6C,MAAK,GACR4L,EAAapL,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,SAEvE,IAAIje,GAAMqhB,EAAA+zB,KAAK4D,wBAAwBvsB,EAAY2uC,EAAGn9C,QAEtD,OADAm9C,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAwhE,iBAAA,SACE5E,GAKA,GAAIqB,GAAWrB,EAAGna,SACdj9B,EAAYhnB,KAAKm/D,eAAef,EACpC,KAAKp3C,EAAW,MAAO,KAEvB,IAAIo3C,EAAGtX,KAAKjoB,EAAAoN,MAAMxF,OAEhB,GAAI23B,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC5B,GAAIzwC,GAAYlU,KAAKqgE,gBAAgBjC,EACrC,KAAKlqD,EAAW,MAAO,KAEvB,IAAIkqD,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAC7B,GAAI5hD,GAAMqhB,EAAA+zB,KAAKgE,kBAA6Bp1B,EAAuB9S,EAAWkqD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEpG,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,QAGhB,OAAO,OAGTs4C,EAAA/3D,UAAAiiE,yBAAA,SACErF,GAKA,GAAIptD,GAAOhR,KAAKqgE,gBAAgBjC,EAChC,KAAKptD,EAAM,MAAO,KAElB,IAAIhO,GAAMqhB,EAAA+zB,KAAKiF,0BAA0BrsC,EAEzC,OADAotD,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAAyhE,kBAAA,SACE7E,GAKA,GAAIqB,GAAWrB,EAAGna,QAElB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAE5B,GAAIxuC,GAAgC,IAEpC,IAAIioD,EAAGtX,KAAKjoB,EAAAoN,MAAMpW,MAAQuoC,EAAGtX,KAAKjoB,EAAAoN,MAAMpX,QAAUupC,EAAGtX,KAAKjoB,EAAAoN,MAAMsX,KAC9DptC,EAAcnW,KAAK0+D,cAAcN,EAAI,KAAM,UAEtC,KAAKA,EAAGtX,KAAKjoB,EAAAoN,MAAMuZ,cACxBrvC,EAAcnW,KAAKyjE,yBAAyBrF,IAC1B,MAAO,KAG3B,IAAIA,EAAGva,OAAShlB,EAAAoN,MAAMuZ,UAAW,CAC/B,GAAItxC,GAAwC,IAC5C,KAAKkqD,EAAGtX,KAAKjoB,EAAAoN,MAAMuZ,cACjBtxC,EAAYlU,KAAKyjE,yBAAyBrF,IAC1B,MAAO,KAGzB,IAAIA,EAAGva,OAAShlB,EAAAoN,MAAMuZ,UAAW,CAC/B,GAAIte,GAAiC,IACrC,KAAKk3B,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAE9B,KADA1d,EAAclnC,KAAKqgE,gBAAgBjC,IACjB,MAAO,KAEzB,KAAKA,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAKjB,MAJA5kD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAIX,GAAI+F,GAAYhnB,KAAKm/D,eAAef,EACpC,OAAKp3C,GAEE3C,EAAA+zB,KAAK+F,mBACVhoC,EACAjC,EACIA,EAAUG,WACV,KACJ6yB,EACAlgB,EACAo3C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MATD,KAavB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,IAGhB,OAAO,OAGTs4C,EAAA/3D,UAAA0hE,iBAAA,SACE9E,GAKA,GAAIqB,GAAWrB,EAAGna,QAClB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC5B,GAAIzwC,GAAYlU,KAAKqgE,gBAAgBjC,EACrC,KAAKlqD,EAAW,MAAO,KACvB,IAAIkqD,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAC7B,GAAI59B,GAAYhnB,KAAKm/D,eAAef,EACpC,KAAKp3C,EAAW,MAAO,KACvB,IAAI08C,GAAkC,IACtC,OAAItF,GAAGtX,KAAKjoB,EAAAoN,MAAM0W,SAChB+gB,EAAgB1jE,KAAKm/D,eAAef,IACT,KAEtB/5C,EAAA+zB,KAAKmF,kBACVrpC,EACA8S,EACA08C,EACAtF,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAGxB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,IAGhB,OAAO,OAGTs4C,EAAA/3D,UAAA6hE,qBAAA,SACEjF,GAKA,GAAIqB,GAAWrB,EAAGna,QAClB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC5B,GAAIzwC,GAAYlU,KAAKqgE,gBAAgBjC,EACrC,KAAKlqD,EAAW,MAAO,KACvB,IAAIkqD,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAC7B,GAAIwZ,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAAY,CAE5B,IADA,GAAIte,GAAQ,GAAI7jC,QACR06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CACjC,GAAIne,GAAQ3nC,KAAK2jE,gBAAgBvF,EACjC,KAAKz2B,EAAO,MAAO,KACnBJ,GAAM5jC,KAAiBgkC,GAEzB,GAAI3kC,GAAMqhB,EAAA+zB,KAAK+G,sBAAsBjrC,EAAWqzB,EAAO62B,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAE7E,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,IAGhB,OAAO,OAGTs4C,EAAA/3D,UAAAmiE,gBAAA,SACEvF,GAGA,GACIt3C,GACAE,EAFAy4C,EAAWrB,EAAGna,QAMlB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAMqW,MAAO,CACvB,GAAIzuC,GAAQ7T,KAAKqgE,gBAAgBjC,EACjC,KAAKvqD,EAAO,MAAO,KACnB,IAAIuqD,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,OAAQ,CAExB,IADAz+B,EAAa,GAAIpjB,OACV06D,EAAG3X,QAAU5nB,EAAAoN,MAAMqW,MAAQ8b,EAAG/Z,WAAaxlB,EAAAoN,MAAMwW,SAAW2b,EAAG/Z,WAAaxlB,EAAAoN,MAAM6Z,YAAY,CAEnG,KADA9+B,EAAYhnB,KAAKm/D,eAAef,IAChB,MAAO,KACvBt3C,GAAWnjB,KAAKqjB,GAElB,MAAO3C,GAAA+zB,KAAKiH,iBAAiBxrC,EAAOiT,EAAYs3C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAEtE/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAMX,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMwW,SAAU,CACjC,GAAI2b,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,OAAQ,CAExB,IADAz+B,EAAa,GAAIpjB,OACV06D,EAAG3X,QAAU5nB,EAAAoN,MAAMqW,MAAQ8b,EAAG/Z,WAAaxlB,EAAAoN,MAAMwW,SAAW2b,EAAG/Z,WAAaxlB,EAAAoN,MAAM6Z,YAAY,CAEnG,KADA9+B,EAAYhnB,KAAKm/D,eAAef,IAChB,MAAO,KACvBt3C,GAAWnjB,KAAKqjB,GAElB,MAAO3C,GAAA+zB,KAAKiH,iBAAiB,KAAMv4B,EAAYs3C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAErE/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeyhD,0BACfxF,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAA8hE,oBAAA,SACElF,GAKA,GAAIqB,GAAWrB,EAAGna,SACd5vC,EAAarU,KAAKqgE,gBAAgBjC,EACtC,KAAK/pD,EAAY,MAAO,KACxB,IAAIrR,GAAMqhB,EAAA+zB,KAAKmH,qBAAiClrC,EAAY+pD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAElF,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,GAGTu2D,EAAA/3D,UAAA+hE,kBAAA,SACEnF,GAQA,GACIx3B,GADA64B,EAAWrB,EAAGna,QAElB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAAY,CAE5B,IADA,GAAI/+B,GAAa,GAAIpjB,QACb06D,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CAEjC,KADAlf,EAAO5mC,KAAKm/D,eAAef,IAChB,MAAO,KAClBt3C,GAAWnjB,KAAgBijC,GAE7B,GAAI8Y,GAA6C,KAC7CC,EAAsC,KACtCC,EAAwC,IAC5C,IAAIwe,EAAGtX,KAAKjoB,EAAAoN,MAAMsW,OAAQ,CACxB,IAAK6b,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAKjB,MAJA3kD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAET,KAAKm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAKjB,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,SAEE,IAGT,IADAy+B,EAAgBr7B,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,UACnEm9C,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAKjB,MAJA5kD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAET,KAAKm9C,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAKjB,MAJA7lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAGT,KADA0+B,MACQye,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CAEjC,KADAlf,EAAO5mC,KAAKm/D,eAAef,IAChB,MAAO,KAClBze,GAAgBh8C,KAAgBijC,IAGpC,GAAIw3B,EAAGtX,KAAKjoB,EAAAoN,MAAM4W,SAAU,CAC1B,IAAKub,EAAGtX,KAAKjoB,EAAAoN,MAAM4Z,WAKjB,MAJA7lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAGT,KADA2+B,MACQwe,EAAGtX,KAAKjoB,EAAAoN,MAAM6Z,aAAa,CAEjC,KADAlf,EAAO5mC,KAAKm/D,eAAef,IAChB,MAAO,KAClBxe,GAAkBj8C,KAAgBijC,IAGtC,IAAM+Y,IAAmBC,EAKvB,MAJA5/C,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAEP,IAET,IAAIje,GAAMqhB,EAAA+zB,KAAKqH,mBACb34B,EACA44B,EACAC,EACAC,EACAwe,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGxB,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAOT,MALEhD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAGT,MAGTs4C,EAAA/3D,UAAAw9D,qBAAA,SACEZ,EACA9xC,EACA5B,OADA,KAAA4B,MAAA,UACA,KAAA5B,MAAA,KAKA,IAAI+0C,GAAW/0C,GAAcA,EAAW1oB,OAAS0oB,EAAW,GAAGzJ,MAAMW,MACtD0K,GAAaA,EAAUtqB,OAASsqB,EAAU,GAAGrL,MAAMW,MACnDw8C,EAAGna,QAClB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAMnY,YAAa,CAC7B,GAAIlzB,GAAOyjB,EAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,QACnE,IAAIm9C,EAAGtX,KAAKjoB,EAAAoN,MAAMkC,QAAS,CACzB,GAAIx8B,GAAO3R,KAAKs/D,UAAUlB,EAC1B,KAAKzsD,EAAM,MAAO,KAClB,IAAI3O,GAAMqhB,EAAA+zB,KAAK0H,sBAAsBl/C,EAAM+Q,EAAM2a,EAAW5B,EAAY0zC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAE9F,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACfvB,EAAGn9C,QAGP,OAAO,OAGTs4C,EAAA/3D,UAAAgiE,oBAAA,SACEpF,GAKA,GAAIqB,GAAWrB,EAAGna,QAClB,IAAIma,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC5B,GAAItwC,GAAarU,KAAKqgE,gBAAgBjC,EACtC,KAAK/pD,EAAY,MAAO,KACxB,IAAI+pD,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAC7B,GAAI59B,GAAYhnB,KAAKm/D,eAAef,EACpC,KAAKp3C,EAAW,MAAO,KACvB,IAAIhkB,GAAMqhB,EAAA+zB,KAAKgI,qBAAiC/rC,EAAuB2S,EAAWo3C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAExG,OADAqa,GAAGtX,KAAKjoB,EAAAoN,MAAMuZ,WACPxiD,EAEPhD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,SAIhBjhB,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,IAGhB,OAAO,OAMTs4C,EAAA/3D,UAAAqiE,qBAAA,SACEzF,GAGA,GAAIva,GAAQua,EAAGv6C,MAAK,GAChB47C,EAAWrB,EAAGna,SACdjzC,EAA0B,IAE9B,IAAI6yC,GAAShlB,EAAAoN,MAAM9C,KACjB,MAAO9kB,GAAA+zB,KAAK8B,qBAAqBkkB,EAAGn9C,QAEtC,IAAI4iC,GAAShlB,EAAAoN,MAAM7C,KACjB,MAAO/kB,GAAA+zB,KAAKgD,qBAAqBgjB,EAAGn9C,QAEtC,IAAI4iC,GAAShlB,EAAAoN,MAAM/C,MACjB,MAAO7kB,GAAA+zB,KAAKsB,sBAAsB0kB,EAAGn9C,QAGvC,IAAIvf,GAAIq8D,EAAyBla,EACjC,KAAK,GAADniD,EAAyB,CAC3B,GAAIu0C,EAKJ,OAAI4N,IAAShlB,EAAAoN,MAAM1C,KACjB0M,EAAUj2C,KAAKqgE,gBAAgBjC,EAAE,KAE7BnoB,EAAQhvB,MAAQ5C,EAAA6C,SAAS+M,KACpB5P,EAAA+zB,KAAK4B,oBACO/D,EAAS5hC,WACT4hC,EAASllB,cACTklB,EAASroB,UAC1BwwC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,OAGxB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeuL,wBACf0wC,EAAGn9C,SAGA,MAdc,MAgBrBg1B,EAAUj2C,KAAKqgE,gBAAgBjC,EAAI18D,KAKjCmiD,GAAShlB,EAAAoN,MAAMiK,WAAa2N,GAAShlB,EAAAoN,MAAMmK,aAE3CH,EAAQhvB,MAAQ5C,EAAA6C,SAAS4M,YACzBmiB,EAAQhvB,MAAQ5C,EAAA6C,SAAS8M,eACzBiiB,EAAQhvB,MAAQ5C,EAAA6C,SAAS6M,gBAEzB/zB,KAAKgjB,MACHmB,EAAAhC,eAAe2hD,0FACf7tB,EAAQh1B,OAIPoD,EAAA+zB,KAAKoD,4BAA4BqI,EAAO5N,EAASmoB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,OAhBvD,KAmBzB,OAAQF,GAGN,IAAKhlB,GAAAoN,MAAM0Y,UAET,MADA3zC,GAAOhR,KAAKqgE,gBAAgBjC,GACvBptD,EACAotD,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAOZvgC,EAAA+zB,KAAKgC,8BAA8BppC,EAAMotD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,OANpE/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,MANS,IAWpB,KAAK4d,GAAAoN,MAAM0Z,YACT,GAAI5R,GAAqB,GAAIrwC,MAE7B,KAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAM2Z,cAAe,CAChC,EAAG,CACD,GAAIwY,EAAG3X,QAAU5nB,EAAAoN,MAAMlD,MACrB/3B,EAAO,SAGP,MADAA,EAAOhR,KAAKqgE,gBAAgBjC,EAAI,IACrB,MAAO,KAGpB,IADArqB,EAAmBpwC,KAAKqN,GACpBotD,EAAG3X,QAAU5nB,EAAAoN,MAAM2Z,aAAc,YAC9BwY,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM2Z,cAKjB,MAJA5lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAGX,MAAOoD,GAAA+zB,KAAKM,6BAA6B3E,EAAoBqqB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAGrF,KAAKllB,GAAAoN,MAAMC,SACT,GAAI3Y,GAASvzB,KAAKs/D,UAAUlB,EAC5B,OAAK7qC,GACA6qC,EAAGtX,KAAKjoB,EAAAoN,MAAMQ,cAOnBz7B,EAAOhR,KAAKqgE,gBAAgBjC,EAAE,IACzBptD,EACEqT,EAAA+zB,KAAKQ,0BAAyB,EAEnC5nC,EACAuiB,EACA6qC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MALN,OAPhB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,MANW,IAiBtB,KAAK4d,GAAAoN,MAAMnY,WACT,MAAOzP,GAAA+zB,KAAKI,2BAA2B4lB,EAAGnX,iBAAkBmX,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEpF,KAAKllB,GAAAoN,MAAMxY,KACT,MAAOpP,GAAA+zB,KAAK8C,qBAAqBkjB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEzD,KAAKllB,GAAAoN,MAAM9e,YACT,MAAO9I,GAAA+zB,KAAKkB,4BAA4B8kB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEhE,KAAKllB,GAAAoN,MAAMrY,MACT,MAAOvP,GAAA+zB,KAAK4C,sBAAsBojB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAE1D,KAAKllB,GAAAoN,MAAMyY,cACT,MAAOrgC,GAAA+zB,KAAK0C,8BAA8BsjB,EAAGl7D,aAAck7D,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEnF,KAAKllB,GAAAoN,MAAMqZ,eACT,MAAOjhC,GAAA+zB,KAAK0B,+BAA+BskB,EAAGtW,cAAesW,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAEnF,KAAKllB,GAAAoN,MAAM+Y,aACX,MAAO3gC,GAAA+zB,KAAKwB,6BAA6BwkB,EAAGrV,YAAaqV,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAIjF,KAAKllB,GAAAoN,MAAMsD,MACT,GAAIw0B,GAAgB3F,EAAG3W,mBACvB,OAAK2W,GAAGtX,KAAKjoB,EAAAoN,MAAMsD,OAOZlrB,EAAA+zB,KAAKoC,8BACVupB,EACA3F,EAAGxW,kBACHwW,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,OATtB/jD,KAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAQX,SAKE,MAJAjhB,MAAKgjB,MACHmB,EAAAhC,eAAe6hD,oBACf5F,EAAGn9C,SAEE,OAIbs4C,EAAA/3D,UAAAyiE,qCAAA,SACE7F,GAMA,GADAA,EAAGrX,QACEqX,EAAGtX,KAAKjoB,EAAAoN,MAAMC,UAAW,MAAO,KACrC,IAAInb,GAAgB,GAAIrtB,MACxB,GAAG,CACD,GAAIiO,GAAO3R,KAAKs/D,UAAUlB,GAAI,GAAM,EACpC,KAAKzsD,EAEH,MADAysD,GAAGpX,QACI,IAETj2B,GAAcptB,KAAKgO,SACZysD,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,OAAIq1B,GAAGtX,KAAKjoB,EAAAoN,MAAMQ,cAAgB2xB,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WACvC5zB,GAETqtC,EAAGpX,QACI,OAGTuS,EAAA/3D,UAAAu+D,eAAA,SACE3B,GAKA,GAAIhrB,GAAO,GAAI1vC,MACf,KAAK06D,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAAa,CAC9B,EAAG,CACD,GAAI5zC,GAAOhR,KAAKqgE,gBAAgBjC,EAAI,EACpC,KAAKptD,EAAM,MAAO,KAClBoiC,GAAKzvC,KAAKqN,SACHotD,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB,KAAKq1B,EAAGtX,KAAKjoB,EAAAoN,MAAM2Y,YAKjB,MAJA5kD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,KAGX,MAAOmyB,IAGTmmB,EAAA/3D,UAAA6+D,gBAAA,SACEjC,EACA8F,OAAA,KAAAA,MAAA,EAGA,IAAIlzD,GAAOhR,KAAK6jE,qBAAqBzF,EACrC,KAAKptD,EAAM,MAAO,KAClB,IAAIyuD,GAAWzuD,EAAKiQ,MAAMW,MAGtBmP,EAAgB/wB,KAAKikE,qCAAqC7F,EAE9D,IAAIrtC,GAAiBqtC,EAAGtX,KAAKjoB,EAAAoN,MAAM0Y,WAAY,CAC7C,GAAIvR,GAAOpzC,KAAK+/D,eAAe3B,EAC/B,KAAKhrB,EAAM,MAAO,KAClBpiC,GAAOqT,EAAA+zB,KAAKa,qBAAqBjoC,EAAM+f,EAAeqiB,EAAMgrB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAMpF,IAHA,GAAIF,GAEAsgB,EADAtgD,EAA0B,MAG3BsgD,EAAiBnG,EAAoBna,EAAQua,EAAG3X,UAAYyd,GAI7D,OAFA9F,EAAGv6C,OAEKggC,GAGN,IAAKhlB,GAAAoN,MAAMkW,GACT,GAAI5uB,GAASvzB,KAAKs/D,UAAUlB,EAC5B,KAAK7qC,EAAQ,MAAO,KACpBviB,GAAOqT,EAAA+zB,KAAKQ,0BAAyB,EAEnC5nC,EACAuiB,EACA6qC,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAExB,MAGF,KAAKllB,GAAAoN,MAAM0Z,YAET,KADA9hC,EAAO7jB,KAAKqgE,gBAAgBjC,IACjB,MAAO,KAClB,KAAKA,EAAGtX,KAAKjoB,EAAAoN,MAAM2Z,cAKjB,MAJA5lD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAETjQ,GAAOqT,EAAA+zB,KAAKoB,8BACVxoC,EACA6S,EACAu6C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAExB,MAGF,KAAKllB,GAAAoN,MAAMiK,UACX,IAAKrX,GAAAoN,MAAMmK,YAEPplC,EAAKiW,MAAQ5C,EAAA6C,SAAS4M,YACtB9iB,EAAKiW,MAAQ5C,EAAA6C,SAAS8M,eACtBhjB,EAAKiW,MAAQ5C,EAAA6C,SAAS6M,gBAEtB/zB,KAAKgjB,MACHmB,EAAAhC,eAAe2hD,0FACf9yD,EAAKiQ,OAGTjQ,EAAOqT,EAAA+zB,KAAKkD,6BACVuI,EACA7yC,EACAotD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAExB,MAGF,KAAKllB,GAAAoN,MAAMyZ,SACT,GAAI7P,GAAS71C,KAAKqgE,gBAAgBjC,EAClC,KAAKvoB,EAAQ,MAAO,KACpB,KAAKuoB,EAAGtX,KAAKjoB,EAAAoN,MAAMsZ,OAKjB,MAJAvlD,MAAKgjB,MACHmB,EAAAhC,eAAeijC,YACfgZ,EAAGn9C,QAAS,KAEP,IAET,IAAI60B,GAAS91C,KAAKqgE,gBAAgBjC,EAClC,KAAKtoB,EAAQ,MAAO,KACpB9kC,GAAOqT,EAAA+zB,KAAKwC,wBACV5pC,EACA6kC,EACAC,EACAsoB,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KAExB,MAGF,KAAKllB,GAAAoN,MAAMlD,MACT,GAAIq7B,IAA6BpzD,EACjC,GAAG,CAED,KADAA,EAAOhR,KAAKqgE,gBAAgBjC,EAAI,IACrB,MAAO,KAClBgG,GAAWzgE,KAAKqN,SACTotD,EAAGtX,KAAKjoB,EAAAoN,MAAMlD,OACvB/3B,GAAOqT,EAAA+zB,KAAKgB,sBAAsBgrB,EAAYhG,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,KACpE,MAEF,SAME,KALAlgC,EAAO7jB,KAAKqgE,gBAAgBjC,EAC1BH,EAAmBpa,GACfsgB,EACAA,EAAiB,IAEZ,MAAO,KAGlB,IAAItgB,GAAShlB,EAAAoN,MAAMiZ,IACjB,GAAIrhC,EAAKoD,MAAQ5C,EAAA6C,SAAS4M,WACxB9iB,EAAOqT,EAAA+zB,KAAKkC,+BACVtpC,EACsB6S,EACtBu6C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,UAEnB,IAAIlgC,EAAKoD,MAAQ5C,EAAA6C,SAAS+M,KAqB/B,MAJAj0B,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACf97C,EAAK5C,OAEA,IApBP,IAAIojD,GAA+BxgD,CACnC,IAAIwgD,EAAahwD,WAAW4S,MAAQ5C,EAAA6C,SAAS4M,WAW3C,MAJA9zB,MAAKgjB,MACHmB,EAAAhC,eAAew9C,oBACf0E,EAAahwD,WAAW4M,OAEnB,IAVPojD,GAAahwD,WAAagQ,EAAA+zB,KAAKkC,+BAC7BtpC,EACsBqzD,EAAahwD,WACnC+pD,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAS1B/yC,EAAOqzD,MAWTrzD,GAAOqT,EAAA+zB,KAAKW,uBAAuB8K,EAAO7yC,EAAM6S,EAAMu6C,EAAGn9C,MAAMw+C,EAAUrB,EAAGra,MAKpF,MAAO/yC,IAEXuoD,GAv4E4Bp1C,EAAAtB,kBAAfnjB,GAAA65D,UA04Eb,SAAkB+K,GAChBA,IAAA,iBACAA,IAAA,mBACAA,IAAA,iBACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,6BACAA,IAAA,wBACAA,IAAA,4BACAA,IAAA,kBACAA,IAAA,wBACAA,IAAA,oCACAA,IAAA,kCACAA,IAAA,gCACAA,IAAA,kCACAA,IAAA,gBACAA,IAAA,gCACAA,IAAA,wBACAA,IAAA,uBAtBgB5kE,EAAA4kE,aAAA5kE,EAAA4kE","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_15__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_15__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 11);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar NativeType;\r\n(function (NativeType) {\r\n NativeType[NativeType[\"None\"] = _BinaryenTypeNone()] = \"None\";\r\n NativeType[NativeType[\"I32\"] = _BinaryenTypeInt32()] = \"I32\";\r\n NativeType[NativeType[\"I64\"] = _BinaryenTypeInt64()] = \"I64\";\r\n NativeType[NativeType[\"F32\"] = _BinaryenTypeFloat32()] = \"F32\";\r\n NativeType[NativeType[\"F64\"] = _BinaryenTypeFloat64()] = \"F64\";\r\n NativeType[NativeType[\"Unreachable\"] = _BinaryenTypeUnreachable()] = \"Unreachable\";\r\n NativeType[NativeType[\"Auto\"] = _BinaryenTypeAuto()] = \"Auto\";\r\n})(NativeType = exports.NativeType || (exports.NativeType = {}));\r\nvar ExpressionId;\r\n(function (ExpressionId) {\r\n ExpressionId[ExpressionId[\"Invalid\"] = _BinaryenInvalidId()] = \"Invalid\";\r\n ExpressionId[ExpressionId[\"Block\"] = _BinaryenBlockId()] = \"Block\";\r\n ExpressionId[ExpressionId[\"If\"] = _BinaryenIfId()] = \"If\";\r\n ExpressionId[ExpressionId[\"Loop\"] = _BinaryenLoopId()] = \"Loop\";\r\n ExpressionId[ExpressionId[\"Break\"] = _BinaryenBreakId()] = \"Break\";\r\n ExpressionId[ExpressionId[\"Switch\"] = _BinaryenSwitchId()] = \"Switch\";\r\n ExpressionId[ExpressionId[\"Call\"] = _BinaryenCallId()] = \"Call\";\r\n ExpressionId[ExpressionId[\"CallImport\"] = _BinaryenCallImportId()] = \"CallImport\";\r\n ExpressionId[ExpressionId[\"CallIndirect\"] = _BinaryenCallIndirectId()] = \"CallIndirect\";\r\n ExpressionId[ExpressionId[\"GetLocal\"] = _BinaryenGetLocalId()] = \"GetLocal\";\r\n ExpressionId[ExpressionId[\"SetLocal\"] = _BinaryenSetLocalId()] = \"SetLocal\";\r\n ExpressionId[ExpressionId[\"GetGlobal\"] = _BinaryenGetGlobalId()] = \"GetGlobal\";\r\n ExpressionId[ExpressionId[\"SetGlobal\"] = _BinaryenSetGlobalId()] = \"SetGlobal\";\r\n ExpressionId[ExpressionId[\"Load\"] = _BinaryenLoadId()] = \"Load\";\r\n ExpressionId[ExpressionId[\"Store\"] = _BinaryenStoreId()] = \"Store\";\r\n ExpressionId[ExpressionId[\"Const\"] = _BinaryenConstId()] = \"Const\";\r\n ExpressionId[ExpressionId[\"Unary\"] = _BinaryenUnaryId()] = \"Unary\";\r\n ExpressionId[ExpressionId[\"Binary\"] = _BinaryenBinaryId()] = \"Binary\";\r\n ExpressionId[ExpressionId[\"Select\"] = _BinaryenSelectId()] = \"Select\";\r\n ExpressionId[ExpressionId[\"Drop\"] = _BinaryenDropId()] = \"Drop\";\r\n ExpressionId[ExpressionId[\"Return\"] = _BinaryenReturnId()] = \"Return\";\r\n ExpressionId[ExpressionId[\"Host\"] = _BinaryenHostId()] = \"Host\";\r\n ExpressionId[ExpressionId[\"Nop\"] = _BinaryenNopId()] = \"Nop\";\r\n ExpressionId[ExpressionId[\"Unreachable\"] = _BinaryenUnreachableId()] = \"Unreachable\";\r\n ExpressionId[ExpressionId[\"AtomicCmpxchg\"] = _BinaryenAtomicCmpxchgId()] = \"AtomicCmpxchg\";\r\n ExpressionId[ExpressionId[\"AtomicRMW\"] = _BinaryenAtomicRMWId()] = \"AtomicRMW\";\r\n ExpressionId[ExpressionId[\"AtomicWait\"] = _BinaryenAtomicWaitId()] = \"AtomicWait\";\r\n ExpressionId[ExpressionId[\"AtomicWake\"] = _BinaryenAtomicWakeId()] = \"AtomicWake\";\r\n})(ExpressionId = exports.ExpressionId || (exports.ExpressionId = {}));\r\nvar UnaryOp;\r\n(function (UnaryOp) {\r\n UnaryOp[UnaryOp[\"ClzI32\"] = _BinaryenClzInt32()] = \"ClzI32\";\r\n UnaryOp[UnaryOp[\"CtzI32\"] = _BinaryenCtzInt32()] = \"CtzI32\";\r\n UnaryOp[UnaryOp[\"PopcntI32\"] = _BinaryenPopcntInt32()] = \"PopcntI32\";\r\n UnaryOp[UnaryOp[\"NegF32\"] = _BinaryenNegFloat32()] = \"NegF32\";\r\n UnaryOp[UnaryOp[\"AbsF32\"] = _BinaryenAbsFloat32()] = \"AbsF32\";\r\n UnaryOp[UnaryOp[\"CeilF32\"] = _BinaryenCeilFloat32()] = \"CeilF32\";\r\n UnaryOp[UnaryOp[\"FloorF32\"] = _BinaryenFloorFloat32()] = \"FloorF32\";\r\n UnaryOp[UnaryOp[\"TruncF32\"] = _BinaryenTruncFloat32()] = \"TruncF32\";\r\n UnaryOp[UnaryOp[\"NearestF32\"] = _BinaryenNearestFloat32()] = \"NearestF32\";\r\n UnaryOp[UnaryOp[\"SqrtF32\"] = _BinaryenSqrtFloat32()] = \"SqrtF32\";\r\n UnaryOp[UnaryOp[\"EqzI32\"] = _BinaryenEqZInt32()] = \"EqzI32\";\r\n UnaryOp[UnaryOp[\"ClzI64\"] = _BinaryenClzInt64()] = \"ClzI64\";\r\n UnaryOp[UnaryOp[\"CtzI64\"] = _BinaryenCtzInt64()] = \"CtzI64\";\r\n UnaryOp[UnaryOp[\"PopcntI64\"] = _BinaryenPopcntInt64()] = \"PopcntI64\";\r\n UnaryOp[UnaryOp[\"NegF64\"] = _BinaryenNegFloat64()] = \"NegF64\";\r\n UnaryOp[UnaryOp[\"AbsF64\"] = _BinaryenAbsFloat64()] = \"AbsF64\";\r\n UnaryOp[UnaryOp[\"CeilF64\"] = _BinaryenCeilFloat64()] = \"CeilF64\";\r\n UnaryOp[UnaryOp[\"FloorF64\"] = _BinaryenFloorFloat64()] = \"FloorF64\";\r\n UnaryOp[UnaryOp[\"TruncF64\"] = _BinaryenTruncFloat64()] = \"TruncF64\";\r\n UnaryOp[UnaryOp[\"NearestF64\"] = _BinaryenNearestFloat64()] = \"NearestF64\";\r\n UnaryOp[UnaryOp[\"SqrtF64\"] = _BinaryenSqrtFloat64()] = \"SqrtF64\";\r\n UnaryOp[UnaryOp[\"EqzI64\"] = _BinaryenEqZInt64()] = \"EqzI64\";\r\n UnaryOp[UnaryOp[\"ExtendI32\"] = _BinaryenExtendSInt32()] = \"ExtendI32\";\r\n UnaryOp[UnaryOp[\"ExtendU32\"] = _BinaryenExtendUInt32()] = \"ExtendU32\";\r\n UnaryOp[UnaryOp[\"WrapI64\"] = _BinaryenWrapInt64()] = \"WrapI64\";\r\n UnaryOp[UnaryOp[\"TruncF32ToI32\"] = _BinaryenTruncSFloat32ToInt32()] = \"TruncF32ToI32\";\r\n UnaryOp[UnaryOp[\"TruncF32ToI64\"] = _BinaryenTruncSFloat32ToInt64()] = \"TruncF32ToI64\";\r\n UnaryOp[UnaryOp[\"TruncF32ToU32\"] = _BinaryenTruncUFloat32ToInt32()] = \"TruncF32ToU32\";\r\n UnaryOp[UnaryOp[\"TruncF32ToU64\"] = _BinaryenTruncUFloat32ToInt64()] = \"TruncF32ToU64\";\r\n UnaryOp[UnaryOp[\"TruncF64ToI32\"] = _BinaryenTruncSFloat64ToInt32()] = \"TruncF64ToI32\";\r\n UnaryOp[UnaryOp[\"TruncF64ToI64\"] = _BinaryenTruncSFloat64ToInt64()] = \"TruncF64ToI64\";\r\n UnaryOp[UnaryOp[\"TruncF64ToU32\"] = _BinaryenTruncUFloat64ToInt32()] = \"TruncF64ToU32\";\r\n UnaryOp[UnaryOp[\"TruncF64ToU64\"] = _BinaryenTruncUFloat64ToInt64()] = \"TruncF64ToU64\";\r\n UnaryOp[UnaryOp[\"ReinterpretF32\"] = _BinaryenReinterpretFloat32()] = \"ReinterpretF32\";\r\n UnaryOp[UnaryOp[\"ReinterpretF64\"] = _BinaryenReinterpretFloat64()] = \"ReinterpretF64\";\r\n UnaryOp[UnaryOp[\"ConvertI32ToF32\"] = _BinaryenConvertSInt32ToFloat32()] = \"ConvertI32ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertI32ToF64\"] = _BinaryenConvertSInt32ToFloat64()] = \"ConvertI32ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertU32ToF32\"] = _BinaryenConvertUInt32ToFloat32()] = \"ConvertU32ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertU32ToF64\"] = _BinaryenConvertUInt32ToFloat64()] = \"ConvertU32ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertI64ToF32\"] = _BinaryenConvertSInt64ToFloat32()] = \"ConvertI64ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertI64ToF64\"] = _BinaryenConvertSInt64ToFloat64()] = \"ConvertI64ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertU64ToF32\"] = _BinaryenConvertUInt64ToFloat32()] = \"ConvertU64ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertU64ToF64\"] = _BinaryenConvertUInt64ToFloat64()] = \"ConvertU64ToF64\";\r\n UnaryOp[UnaryOp[\"PromoteF32\"] = _BinaryenPromoteFloat32()] = \"PromoteF32\";\r\n UnaryOp[UnaryOp[\"DemoteF64\"] = _BinaryenDemoteFloat64()] = \"DemoteF64\";\r\n UnaryOp[UnaryOp[\"ReinterpretI32\"] = _BinaryenReinterpretInt32()] = \"ReinterpretI32\";\r\n UnaryOp[UnaryOp[\"ReinterpretI64\"] = _BinaryenReinterpretInt64()] = \"ReinterpretI64\";\r\n // see: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#new-sign-extending-operators\r\n // ExtendI8ToI32 =_BinaryenExtendS8Int32()\r\n // ExtendI16ToI32 = _BinaryenExtendS16Int32()\r\n // ExtendI8ToI64 = _BinaryenExtendS8Int64() // operand is I64\r\n // ExtendI16ToI64 = _BinaryenExtendS16Int64()\r\n // ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n})(UnaryOp = exports.UnaryOp || (exports.UnaryOp = {}));\r\nvar BinaryOp;\r\n(function (BinaryOp) {\r\n BinaryOp[BinaryOp[\"AddI32\"] = _BinaryenAddInt32()] = \"AddI32\";\r\n BinaryOp[BinaryOp[\"SubI32\"] = _BinaryenSubInt32()] = \"SubI32\";\r\n BinaryOp[BinaryOp[\"MulI32\"] = _BinaryenMulInt32()] = \"MulI32\";\r\n BinaryOp[BinaryOp[\"DivI32\"] = _BinaryenDivSInt32()] = \"DivI32\";\r\n BinaryOp[BinaryOp[\"DivU32\"] = _BinaryenDivUInt32()] = \"DivU32\";\r\n BinaryOp[BinaryOp[\"RemI32\"] = _BinaryenRemSInt32()] = \"RemI32\";\r\n BinaryOp[BinaryOp[\"RemU32\"] = _BinaryenRemUInt32()] = \"RemU32\";\r\n BinaryOp[BinaryOp[\"AndI32\"] = _BinaryenAndInt32()] = \"AndI32\";\r\n BinaryOp[BinaryOp[\"OrI32\"] = _BinaryenOrInt32()] = \"OrI32\";\r\n BinaryOp[BinaryOp[\"XorI32\"] = _BinaryenXorInt32()] = \"XorI32\";\r\n BinaryOp[BinaryOp[\"ShlI32\"] = _BinaryenShlInt32()] = \"ShlI32\";\r\n BinaryOp[BinaryOp[\"ShrU32\"] = _BinaryenShrUInt32()] = \"ShrU32\";\r\n BinaryOp[BinaryOp[\"ShrI32\"] = _BinaryenShrSInt32()] = \"ShrI32\";\r\n BinaryOp[BinaryOp[\"RotlI32\"] = _BinaryenRotLInt32()] = \"RotlI32\";\r\n BinaryOp[BinaryOp[\"RotrI32\"] = _BinaryenRotRInt32()] = \"RotrI32\";\r\n BinaryOp[BinaryOp[\"EqI32\"] = _BinaryenEqInt32()] = \"EqI32\";\r\n BinaryOp[BinaryOp[\"NeI32\"] = _BinaryenNeInt32()] = \"NeI32\";\r\n BinaryOp[BinaryOp[\"LtI32\"] = _BinaryenLtSInt32()] = \"LtI32\";\r\n BinaryOp[BinaryOp[\"LtU32\"] = _BinaryenLtUInt32()] = \"LtU32\";\r\n BinaryOp[BinaryOp[\"LeI32\"] = _BinaryenLeSInt32()] = \"LeI32\";\r\n BinaryOp[BinaryOp[\"LeU32\"] = _BinaryenLeUInt32()] = \"LeU32\";\r\n BinaryOp[BinaryOp[\"GtI32\"] = _BinaryenGtSInt32()] = \"GtI32\";\r\n BinaryOp[BinaryOp[\"GtU32\"] = _BinaryenGtUInt32()] = \"GtU32\";\r\n BinaryOp[BinaryOp[\"GeI32\"] = _BinaryenGeSInt32()] = \"GeI32\";\r\n BinaryOp[BinaryOp[\"GeU32\"] = _BinaryenGeUInt32()] = \"GeU32\";\r\n BinaryOp[BinaryOp[\"AddI64\"] = _BinaryenAddInt64()] = \"AddI64\";\r\n BinaryOp[BinaryOp[\"SubI64\"] = _BinaryenSubInt64()] = \"SubI64\";\r\n BinaryOp[BinaryOp[\"MulI64\"] = _BinaryenMulInt64()] = \"MulI64\";\r\n BinaryOp[BinaryOp[\"DivI64\"] = _BinaryenDivSInt64()] = \"DivI64\";\r\n BinaryOp[BinaryOp[\"DivU64\"] = _BinaryenDivUInt64()] = \"DivU64\";\r\n BinaryOp[BinaryOp[\"RemI64\"] = _BinaryenRemSInt64()] = \"RemI64\";\r\n BinaryOp[BinaryOp[\"RemU64\"] = _BinaryenRemUInt64()] = \"RemU64\";\r\n BinaryOp[BinaryOp[\"AndI64\"] = _BinaryenAndInt64()] = \"AndI64\";\r\n BinaryOp[BinaryOp[\"OrI64\"] = _BinaryenOrInt64()] = \"OrI64\";\r\n BinaryOp[BinaryOp[\"XorI64\"] = _BinaryenXorInt64()] = \"XorI64\";\r\n BinaryOp[BinaryOp[\"ShlI64\"] = _BinaryenShlInt64()] = \"ShlI64\";\r\n BinaryOp[BinaryOp[\"ShrU64\"] = _BinaryenShrUInt64()] = \"ShrU64\";\r\n BinaryOp[BinaryOp[\"ShrI64\"] = _BinaryenShrSInt64()] = \"ShrI64\";\r\n BinaryOp[BinaryOp[\"RotlI64\"] = _BinaryenRotLInt64()] = \"RotlI64\";\r\n BinaryOp[BinaryOp[\"RotrI64\"] = _BinaryenRotRInt64()] = \"RotrI64\";\r\n BinaryOp[BinaryOp[\"EqI64\"] = _BinaryenEqInt64()] = \"EqI64\";\r\n BinaryOp[BinaryOp[\"NeI64\"] = _BinaryenNeInt64()] = \"NeI64\";\r\n BinaryOp[BinaryOp[\"LtI64\"] = _BinaryenLtSInt64()] = \"LtI64\";\r\n BinaryOp[BinaryOp[\"LtU64\"] = _BinaryenLtUInt64()] = \"LtU64\";\r\n BinaryOp[BinaryOp[\"LeI64\"] = _BinaryenLeSInt64()] = \"LeI64\";\r\n BinaryOp[BinaryOp[\"LeU64\"] = _BinaryenLeUInt64()] = \"LeU64\";\r\n BinaryOp[BinaryOp[\"GtI64\"] = _BinaryenGtSInt64()] = \"GtI64\";\r\n BinaryOp[BinaryOp[\"GtU64\"] = _BinaryenGtUInt64()] = \"GtU64\";\r\n BinaryOp[BinaryOp[\"GeI64\"] = _BinaryenGeSInt64()] = \"GeI64\";\r\n BinaryOp[BinaryOp[\"GeU64\"] = _BinaryenGeUInt64()] = \"GeU64\";\r\n BinaryOp[BinaryOp[\"AddF32\"] = _BinaryenAddFloat32()] = \"AddF32\";\r\n BinaryOp[BinaryOp[\"SubF32\"] = _BinaryenSubFloat32()] = \"SubF32\";\r\n BinaryOp[BinaryOp[\"MulF32\"] = _BinaryenMulFloat32()] = \"MulF32\";\r\n BinaryOp[BinaryOp[\"DivF32\"] = _BinaryenDivFloat32()] = \"DivF32\";\r\n BinaryOp[BinaryOp[\"CopysignF32\"] = _BinaryenCopySignFloat32()] = \"CopysignF32\";\r\n BinaryOp[BinaryOp[\"MinF32\"] = _BinaryenMinFloat32()] = \"MinF32\";\r\n BinaryOp[BinaryOp[\"MaxF32\"] = _BinaryenMaxFloat32()] = \"MaxF32\";\r\n BinaryOp[BinaryOp[\"EqF32\"] = _BinaryenEqFloat32()] = \"EqF32\";\r\n BinaryOp[BinaryOp[\"NeF32\"] = _BinaryenNeFloat32()] = \"NeF32\";\r\n BinaryOp[BinaryOp[\"LtF32\"] = _BinaryenLtFloat32()] = \"LtF32\";\r\n BinaryOp[BinaryOp[\"LeF32\"] = _BinaryenLeFloat32()] = \"LeF32\";\r\n BinaryOp[BinaryOp[\"GtF32\"] = _BinaryenGtFloat32()] = \"GtF32\";\r\n BinaryOp[BinaryOp[\"GeF32\"] = _BinaryenGeFloat32()] = \"GeF32\";\r\n BinaryOp[BinaryOp[\"AddF64\"] = _BinaryenAddFloat64()] = \"AddF64\";\r\n BinaryOp[BinaryOp[\"SubF64\"] = _BinaryenSubFloat64()] = \"SubF64\";\r\n BinaryOp[BinaryOp[\"MulF64\"] = _BinaryenMulFloat64()] = \"MulF64\";\r\n BinaryOp[BinaryOp[\"DivF64\"] = _BinaryenDivFloat64()] = \"DivF64\";\r\n BinaryOp[BinaryOp[\"CopysignF64\"] = _BinaryenCopySignFloat64()] = \"CopysignF64\";\r\n BinaryOp[BinaryOp[\"MinF64\"] = _BinaryenMinFloat64()] = \"MinF64\";\r\n BinaryOp[BinaryOp[\"MaxF64\"] = _BinaryenMaxFloat64()] = \"MaxF64\";\r\n BinaryOp[BinaryOp[\"EqF64\"] = _BinaryenEqFloat64()] = \"EqF64\";\r\n BinaryOp[BinaryOp[\"NeF64\"] = _BinaryenNeFloat64()] = \"NeF64\";\r\n BinaryOp[BinaryOp[\"LtF64\"] = _BinaryenLtFloat64()] = \"LtF64\";\r\n BinaryOp[BinaryOp[\"LeF64\"] = _BinaryenLeFloat64()] = \"LeF64\";\r\n BinaryOp[BinaryOp[\"GtF64\"] = _BinaryenGtFloat64()] = \"GtF64\";\r\n BinaryOp[BinaryOp[\"GeF64\"] = _BinaryenGeFloat64()] = \"GeF64\";\r\n})(BinaryOp = exports.BinaryOp || (exports.BinaryOp = {}));\r\nvar HostOp;\r\n(function (HostOp) {\r\n HostOp[HostOp[\"PageSize\"] = _BinaryenPageSize()] = \"PageSize\";\r\n HostOp[HostOp[\"CurrentMemory\"] = _BinaryenCurrentMemory()] = \"CurrentMemory\";\r\n HostOp[HostOp[\"GrowMemory\"] = _BinaryenGrowMemory()] = \"GrowMemory\";\r\n HostOp[HostOp[\"HasFeature\"] = _BinaryenHasFeature()] = \"HasFeature\";\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n})(HostOp = exports.HostOp || (exports.HostOp = {}));\r\nvar AtomicRMWOp;\r\n(function (AtomicRMWOp) {\r\n AtomicRMWOp[AtomicRMWOp[\"Add\"] = _BinaryenAtomicRMWAdd()] = \"Add\";\r\n AtomicRMWOp[AtomicRMWOp[\"Sub\"] = _BinaryenAtomicRMWSub()] = \"Sub\";\r\n AtomicRMWOp[AtomicRMWOp[\"And\"] = _BinaryenAtomicRMWAnd()] = \"And\";\r\n AtomicRMWOp[AtomicRMWOp[\"Or\"] = _BinaryenAtomicRMWOr()] = \"Or\";\r\n AtomicRMWOp[AtomicRMWOp[\"Xor\"] = _BinaryenAtomicRMWXor()] = \"Xor\";\r\n AtomicRMWOp[AtomicRMWOp[\"Xchg\"] = _BinaryenAtomicRMWXchg()] = \"Xchg\";\r\n})(AtomicRMWOp = exports.AtomicRMWOp || (exports.AtomicRMWOp = {}));\r\nvar MemorySegment = /** @class */ (function () {\r\n function MemorySegment() {\r\n }\r\n MemorySegment.create = function (buffer, offset) {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n };\r\n return MemorySegment;\r\n}());\r\nexports.MemorySegment = MemorySegment;\r\nvar Module = /** @class */ (function () {\r\n function Module() {\r\n }\r\n // TODO: static readonly MAX_MEMORY_WASM64\r\n Module.create = function () {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.out = allocate_memory(16);\r\n return module;\r\n };\r\n Module.createFrom = function (buffer) {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.out = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n return module;\r\n }\r\n finally {\r\n free_memory(changetype(cArr));\r\n }\r\n };\r\n // types\r\n Module.prototype.addFunctionType = function (name, result, paramTypes) {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.getFunctionTypeBySignature = function (result, paramTypes) {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n // constants\r\n Module.prototype.createI32 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createI64 = function (valueLow, valueHigh) {\r\n if (valueHigh === void 0) { valueHigh = 0; }\r\n var out = this.out;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createF32 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createF64 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n // expressions\r\n Module.prototype.createUnary = function (op, expr) {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n };\r\n Module.prototype.createBinary = function (op, left, right) {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n };\r\n Module.prototype.createHost = function (op, name, operands) {\r\n if (name === void 0) { name = null; }\r\n if (operands === void 0) { operands = null; }\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? operands.length : 0);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createGetLocal = function (index, type) {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n };\r\n Module.prototype.createTeeLocal = function (index, value) {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n };\r\n Module.prototype.createGetGlobal = function (name, type) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createLoad = function (bytes, signed, ptr, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n };\r\n Module.prototype.createStore = function (bytes, ptr, value, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicLoad = function (bytes, ptr, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n };\r\n Module.prototype.createAtomicStore = function (bytes, ptr, value, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicRMW = function (op, bytes, offset, ptr, value, type) {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicCmpxchg = function (bytes, offset, ptr, expected, replacement, type) {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n };\r\n Module.prototype.createAtomicWait = function (ptr, expected, timeout, expectedType) {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n };\r\n Module.prototype.createAtomicWake = function (ptr, wakeCount) {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n };\r\n // statements\r\n Module.prototype.createSetLocal = function (index, value) {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n };\r\n Module.prototype.createSetGlobal = function (name, value) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createBlock = function (label, children, type) {\r\n if (type === void 0) { type = NativeType.None; }\r\n var cStr = allocString(label);\r\n var cArr = allocI32Array(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createBreak = function (label, condition, value) {\r\n if (condition === void 0) { condition = 0; }\r\n if (value === void 0) { value = 0; }\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createDrop = function (expression) {\r\n return _BinaryenDrop(this.ref, expression);\r\n };\r\n Module.prototype.createLoop = function (label, body) {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createIf = function (condition, ifTrue, ifFalse) {\r\n if (ifFalse === void 0) { ifFalse = 0; }\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n };\r\n Module.prototype.createNop = function () {\r\n return _BinaryenNop(this.ref);\r\n };\r\n Module.prototype.createReturn = function (expression) {\r\n if (expression === void 0) { expression = 0; }\r\n return _BinaryenReturn(this.ref, expression);\r\n };\r\n Module.prototype.createSelect = function (ifTrue, ifFalse, condition) {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n };\r\n Module.prototype.createSwitch = function (names, defaultName, condition, value) {\r\n if (value === void 0) { value = 0; }\r\n var strs = new Array(names.length);\r\n for (var i = 0, k = names.length; i < k; ++i) {\r\n strs[i] = allocString(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = allocString(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, k, cStr, condition, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n free_memory(cArr);\r\n for (i = k - 1; i >= 0; --i)\r\n free_memory(strs[i]);\r\n }\r\n };\r\n Module.prototype.createCall = function (target, operands, returnType) {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createCallImport = function (target, operands, returnType) {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createUnreachable = function () {\r\n return _BinaryenUnreachable(this.ref);\r\n };\r\n // meta\r\n Module.prototype.addGlobal = function (name, type, mutable, initializer) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunction = function (name, type, varTypes, body) {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes.length, body);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.removeFunction = function (name) {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunctionExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addTableExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addMemoryExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addGlobalExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.removeExport = function (externalName) {\r\n var cStr = allocString(externalName);\r\n try {\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunctionImport = function (internalName, externalModuleName, externalBaseName, functionType) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addTableImport = function (internalName, externalModuleName, externalBaseName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addMemoryImport = function (internalName, externalModuleName, externalBaseName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addGlobalImport = function (internalName, externalModuleName, externalBaseName, globalType) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.removeImport = function (internalName) {\r\n var cStr = allocString(internalName);\r\n try {\r\n _BinaryenRemoveImport(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.setMemory = function (initial, maximum, segments, target, exportName) {\r\n if (exportName === void 0) { exportName = null; }\r\n var cStr = allocString(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var buffer = segments[i].buffer;\r\n var offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == compiler_1.Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n }\r\n finally {\r\n free_memory(cArr3);\r\n free_memory(cArr2);\r\n free_memory(cArr1);\r\n for (i = k - 1; i >= 0; --i)\r\n free_memory(segs[i]);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.setFunctionTable = function (funcs) {\r\n var cArr = allocI32Array(funcs);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n Module.prototype.setStart = function (func) {\r\n _BinaryenSetStart(this.ref, func);\r\n };\r\n Module.prototype.setOptimizeLevel = function (level) {\r\n if (level === void 0) { level = 2; }\r\n _BinaryenSetOptimizeLevel(level);\r\n };\r\n Module.prototype.setShrinkLevel = function (level) {\r\n if (level === void 0) { level = 1; }\r\n _BinaryenSetShrinkLevel(level);\r\n };\r\n Module.prototype.setDebugInfo = function (on) {\r\n if (on === void 0) { on = false; }\r\n _BinaryenSetDebugInfo(on);\r\n };\r\n Module.prototype.optimize = function (func) {\r\n if (func === void 0) { func = 0; }\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n }\r\n else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n };\r\n Module.prototype.runPasses = function (passes, func) {\r\n if (func === void 0) { func = 0; }\r\n var k = passes.length;\r\n var names = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, k);\r\n }\r\n else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, k);\r\n }\r\n }\r\n finally {\r\n free_memory(cArr);\r\n for (; i >= 0; --i)\r\n free_memory(names[i]);\r\n }\r\n };\r\n Module.prototype.validate = function () {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n };\r\n Module.prototype.interpret = function () {\r\n _BinaryenModuleInterpret(this.ref);\r\n };\r\n Module.prototype.toBinary = function (sourceMapUrl) {\r\n var out = this.out;\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr = 0;\r\n var sourceMapPtr = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n var binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n var ret = new Binary();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n }\r\n finally {\r\n if (cStr)\r\n free_memory(cStr);\r\n if (binaryPtr)\r\n free_memory(binaryPtr);\r\n if (sourceMapPtr)\r\n free_memory(sourceMapPtr);\r\n }\r\n };\r\n Module.prototype.toText = function () {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n };\r\n Module.prototype.toAsmjs = function () {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n };\r\n Module.prototype.dispose = function () {\r\n if (!this.ref)\r\n return; // sic\r\n _BinaryenModuleDispose(this.ref);\r\n free_memory(this.out);\r\n };\r\n Module.prototype.createRelooper = function () {\r\n return Relooper.create(this);\r\n };\r\n Module.prototype.cloneExpression = function (expr, noSideEffects, maxDepth) {\r\n if (noSideEffects === void 0) { noSideEffects = false; }\r\n if (maxDepth === void 0) { maxDepth = i32.MAX_VALUE; }\r\n if (maxDepth < 0)\r\n return 0;\r\n maxDepth -= 1;\r\n var nested1, nested2;\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Const:\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n case NativeType.I64:\r\n return this.createI64(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr));\r\n case NativeType.F32:\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n case NativeType.F64:\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n case ExpressionId.GetLocal:\r\n return _BinaryenGetLocal(this.ref, _BinaryenGetLocalGetIndex(expr), _BinaryenExpressionGetType(expr));\r\n case ExpressionId.GetGlobal:\r\n var globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName)\r\n break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n case ExpressionId.Load:\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref, _BinaryenLoadGetBytes(expr), _BinaryenLoadGetOffset(expr), _BinaryenExpressionGetType(expr), nested1)\r\n : _BinaryenLoad(this.ref, _BinaryenLoadGetBytes(expr), _BinaryenLoadIsSigned(expr) ? 1 : 0, _BinaryenLoadGetOffset(expr), _BinaryenLoadGetAlign(expr), _BinaryenExpressionGetType(expr), nested1);\r\n case ExpressionId.Unary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n case ExpressionId.Binary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n return 0;\r\n };\r\n // source map generation\r\n Module.prototype.addDebugInfoFile = function (name) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.getDebugInfoFile = function (index) {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n };\r\n Module.prototype.setDebugLocation = function (func, expr, fileIndex, lineNumber, columnNumber) {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n };\r\n Module.MAX_MEMORY_WASM32 = 0xffff;\r\n return Module;\r\n}());\r\nexports.Module = Module;\r\nvar Relooper = /** @class */ (function () {\r\n function Relooper() {\r\n }\r\n Relooper.create = function (module) {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate();\r\n return relooper;\r\n };\r\n Relooper.createStub = function (module) {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = 0;\r\n return relooper;\r\n };\r\n Relooper.prototype.addBlock = function (code) {\r\n return _RelooperAddBlock(this.ref, code);\r\n };\r\n Relooper.prototype.addBranch = function (from, to, condition, code) {\r\n if (condition === void 0) { condition = 0; }\r\n if (code === void 0) { code = 0; }\r\n _RelooperAddBranch(from, to, condition, code);\r\n };\r\n Relooper.prototype.addBlockWithSwitch = function (code, condition) {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n };\r\n Relooper.prototype.addBranchForSwitch = function (from, to, indexes, code) {\r\n if (code === void 0) { code = 0; }\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n Relooper.prototype.renderAndDispose = function (entry, labelHelper) {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n };\r\n return Relooper;\r\n}());\r\nexports.Relooper = Relooper;\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\nfunction allocU8Array(u8s) {\r\n if (!u8s)\r\n return 0;\r\n var ptr = allocate_memory(u8s.length);\r\n var idx = ptr;\r\n for (var i = 0, k = u8s.length; i < k; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\nfunction allocI32Array(i32s) {\r\n if (!i32s)\r\n return 0;\r\n var ptr = allocate_memory(i32s.length << 2);\r\n var idx = ptr;\r\n for (var i = 0, k = i32s.length; i < k; ++i) {\r\n var val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx, (val & 0xff));\r\n store(idx + 1, ((val >> 8) & 0xff));\r\n store(idx + 2, ((val >> 16) & 0xff));\r\n store(idx + 3, (val >>> 24));\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\nfunction stringLengthUTF8(str) {\r\n var len = 0;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n }\r\n else if (u <= 0x7FF) {\r\n len += 2;\r\n }\r\n else if (u <= 0xFFFF) {\r\n len += 3;\r\n }\r\n else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n }\r\n else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n }\r\n else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\nfunction allocString(str) {\r\n if (str == null)\r\n return 0;\r\n var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n var idx = ptr;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u);\r\n }\r\n else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24)));\r\n store(idx++, (0x80 | ((u >>> 18) & 63)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else {\r\n store(idx++, (0xFC | (u >>> 30)));\r\n store(idx++, (0x80 | ((u >>> 24) & 63)));\r\n store(idx++, (0x80 | ((u >>> 18) & 63)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\nfunction readInt(ptr) {\r\n return (load(ptr) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24));\r\n}\r\nexports.readInt = readInt;\r\nfunction readBuffer(ptr, length) {\r\n var ret = new Uint8Array(length);\r\n for (var i = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\nexports.readBuffer = readBuffer;\r\nfunction readString(ptr) {\r\n if (!ptr)\r\n return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp;\r\n var u1, u2, u3, u4, u5;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n }\r\n else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n }\r\n else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n }\r\n else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\nexports.readString = readString;\r\n/** Result structure of {@link Module#toBinary}. */\r\nvar Binary = /** @class */ (function () {\r\n function Binary() {\r\n }\r\n return Binary;\r\n}());\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnosticMessages_generated_1 = __webpack_require__(8);\r\nvar charcode_1 = __webpack_require__(9);\r\nvar diagnosticMessages_generated_2 = __webpack_require__(8);\r\nexports.DiagnosticCode = diagnosticMessages_generated_2.DiagnosticCode;\r\nexports.diagnosticCodeToString = diagnosticMessages_generated_2.diagnosticCodeToString;\r\nvar DiagnosticCategory;\r\n(function (DiagnosticCategory) {\r\n DiagnosticCategory[DiagnosticCategory[\"INFO\"] = 0] = \"INFO\";\r\n DiagnosticCategory[DiagnosticCategory[\"WARNING\"] = 1] = \"WARNING\";\r\n DiagnosticCategory[DiagnosticCategory[\"ERROR\"] = 2] = \"ERROR\";\r\n})(DiagnosticCategory = exports.DiagnosticCategory || (exports.DiagnosticCategory = {}));\r\nfunction diagnosticCategoryToString(category) {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return \"INFO\";\r\n case DiagnosticCategory.WARNING: return \"WARNING\";\r\n case DiagnosticCategory.ERROR: return \"ERROR\";\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCategoryToString = diagnosticCategoryToString;\r\nvar colorBlue = \"\\u001b[93m\";\r\nvar colorYellow = \"\\u001b[93m\";\r\nvar colorRed = \"\\u001b[91m\";\r\nvar colorReset = \"\\u001b[0m\";\r\nfunction diagnosticCategoryToColor(category) {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return colorBlue;\r\n case DiagnosticCategory.WARNING: return colorYellow;\r\n case DiagnosticCategory.ERROR: return colorRed;\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCategoryToColor = diagnosticCategoryToColor;\r\nvar DiagnosticMessage = /** @class */ (function () {\r\n function DiagnosticMessage(code, category, message) {\r\n this.range = null;\r\n this.code = code;\r\n this.category = category;\r\n this.message = message;\r\n }\r\n DiagnosticMessage.create = function (code, category, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n var message = diagnosticMessages_generated_1.diagnosticCodeToString(code);\r\n if (arg0 != null)\r\n message = message.replace(\"{0}\", arg0);\r\n if (arg1 != null)\r\n message = message.replace(\"{1}\", arg1);\r\n return new DiagnosticMessage(code, category, message);\r\n };\r\n DiagnosticMessage.createInfo = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n };\r\n DiagnosticMessage.createWarning = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n };\r\n DiagnosticMessage.createError = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n };\r\n DiagnosticMessage.prototype.withRange = function (range) {\r\n this.range = range;\r\n return this;\r\n };\r\n DiagnosticMessage.prototype.toString = function () {\r\n if (this.range) {\r\n return (diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \\\"\" +\r\n this.message +\r\n \"\\\" in \" +\r\n this.range.source.normalizedPath +\r\n \" @ \" +\r\n this.range.start.toString(10) +\r\n \",\" +\r\n this.range.end.toString(10));\r\n }\r\n return (diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \" +\r\n this.message);\r\n };\r\n return DiagnosticMessage;\r\n}());\r\nexports.DiagnosticMessage = DiagnosticMessage;\r\nfunction formatDiagnosticMessage(message, useColors, showContext) {\r\n if (useColors === void 0) { useColors = false; }\r\n if (showContext === void 0) { showContext = false; }\r\n // format context first (uses same string builder)\r\n var context = \"\";\r\n if (message.range && showContext) {\r\n context = formatDiagnosticContext(message.range, useColors);\r\n }\r\n // general information\r\n var sb = [];\r\n if (useColors)\r\n sb.push(diagnosticCategoryToColor(message.category));\r\n sb.push(diagnosticCategoryToString(message.category));\r\n if (useColors)\r\n sb.push(colorReset);\r\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n sb.push(message.code.toString(10));\r\n sb.push(\": \");\r\n sb.push(message.message);\r\n // range information if available\r\n if (message.range) {\r\n var range = message.range;\r\n if (showContext) {\r\n sb.push(\"\\n\");\r\n sb.push(context);\r\n }\r\n sb.push(\"\\n\");\r\n sb.push(\" in \");\r\n sb.push(range.source.normalizedPath);\r\n sb.push(\"(\");\r\n sb.push(range.line.toString(10));\r\n sb.push(\",\");\r\n sb.push(range.column.toString(10));\r\n sb.push(\")\");\r\n }\r\n return sb.join(\"\");\r\n}\r\nexports.formatDiagnosticMessage = formatDiagnosticMessage;\r\nfunction formatDiagnosticContext(range, useColors) {\r\n if (useColors === void 0) { useColors = false; }\r\n var text = range.source.text;\r\n var len = text.length;\r\n var start = range.start;\r\n var end = range.end;\r\n while (start > 0 && !charcode_1.isLineBreak(text.charCodeAt(start - 1))) {\r\n start--;\r\n }\r\n while (end < len && !charcode_1.isLineBreak(text.charCodeAt(end))) {\r\n end++;\r\n }\r\n var sb = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors)\r\n sb.push(colorRed);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n }\r\n else {\r\n while (start++ < range.end) {\r\n sb.push(\"~\");\r\n }\r\n }\r\n if (useColors)\r\n sb.push(colorReset);\r\n return sb.join(\"\");\r\n}\r\nexports.formatDiagnosticContext = formatDiagnosticContext;\r\nvar DiagnosticEmitter = /** @class */ (function () {\r\n // silentDiagnostics: bool = false;\r\n function DiagnosticEmitter(diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n DiagnosticEmitter.prototype.emitDiagnostic = function (code, category, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n };\r\n DiagnosticEmitter.prototype.error = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1);\r\n };\r\n DiagnosticEmitter.prototype.info = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1);\r\n };\r\n DiagnosticEmitter.prototype.warning = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1);\r\n };\r\n return DiagnosticEmitter;\r\n}());\r\nexports.DiagnosticEmitter = DiagnosticEmitter;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __values = (this && this.__values) || function (o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n};\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar types_1 = __webpack_require__(5);\r\nvar ast_1 = __webpack_require__(6);\r\nvar module_1 = __webpack_require__(0);\r\n/** Path delimiter inserted between file system levels. */\r\nexports.PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexports.PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexports.GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexports.SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexports.INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexports.STATIC_DELIMITER = \".\";\r\n/** Substitution used to indicate a library directory. */\r\nexports.LIBRARY_SUBST = \"(lib)\";\r\n/** Library directory prefix. */\r\nexports.LIBRARY_PREFIX = exports.LIBRARY_SUBST + exports.PATH_DELIMITER;\r\nvar QueuedExport = /** @class */ (function () {\r\n function QueuedExport() {\r\n }\r\n return QueuedExport;\r\n}());\r\nvar QueuedImport = /** @class */ (function () {\r\n function QueuedImport() {\r\n }\r\n return QueuedImport;\r\n}());\r\nvar noTypesYet = new Map();\r\n/** Represents an AssemblyScript program. */\r\nvar Program = /** @class */ (function (_super) {\r\n __extends(Program, _super);\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n function Program(diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n var _this = _super.call(this, diagnostics) || this;\r\n /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */\r\n _this.diagnosticsOffset = 0;\r\n /** Elements by internal name. */\r\n _this.elements = new Map();\r\n /** Types by internal name. */\r\n _this.types = noTypesYet;\r\n /** Declared type aliases. */\r\n _this.typeAliases = new Map();\r\n /** Exports of individual files by exported name. Not global exports. */\r\n _this.exports = new Map();\r\n _this.sources = [];\r\n return _this;\r\n }\r\n /** Initializes the program and its elements prior to compilation. */\r\n Program.prototype.initialize = function (options) {\r\n this.options = options;\r\n this.types = new Map([\r\n [\"i8\", types_1.Type.i8],\r\n [\"i16\", types_1.Type.i16],\r\n [\"i32\", types_1.Type.i32],\r\n [\"i64\", types_1.Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", types_1.Type.u8],\r\n [\"u16\", types_1.Type.u16],\r\n [\"u32\", types_1.Type.u32],\r\n [\"u64\", types_1.Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", types_1.Type.bool],\r\n [\"f32\", types_1.Type.f32],\r\n [\"f64\", types_1.Type.f64],\r\n [\"void\", types_1.Type.void],\r\n [\"number\", types_1.Type.f64],\r\n [\"boolean\", types_1.Type.bool]\r\n ]);\r\n var queuedExports = new Map();\r\n var queuedImports = new Array();\r\n var queuedDerivedClasses = new Array();\r\n // build initial lookup maps of internal names to declarations\r\n for (var i = 0, k = this.sources.length; i < k; ++i) {\r\n var source = this.sources[i];\r\n var statements = source.statements;\r\n for (var j = 0, l = statements.length; j < l; ++j) {\r\n var statement = statements[j];\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n this.initializeClass(statement, queuedDerivedClasses);\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(statement);\r\n break;\r\n case ast_1.NodeKind.EXPORT:\r\n this.initializeExports(statement, queuedExports);\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(statement);\r\n break;\r\n case ast_1.NodeKind.IMPORT:\r\n this.initializeImports(statement, queuedExports, queuedImports);\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(statement);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(statement, queuedDerivedClasses);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n this.initializeTypeAlias(statement);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n var element;\r\n // queued imports should be resolvable now through traversing exports and\r\n // queued exports\r\n for (i = 0; i < queuedImports.length;) {\r\n var queuedImport = queuedImports[i];\r\n element = this.tryResolveImport(queuedImport.referencedName, queuedExports);\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n }\r\n else {\r\n element = this.tryResolveImport(queuedImport.referencedNameAlt, queuedExports);\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Module_0_has_no_exported_member_1, queuedImport.declaration.range, queuedImport.declaration.parent.path.value, queuedImport.declaration.externalName.text);\r\n ++i;\r\n }\r\n }\r\n }\r\n try {\r\n // queued exports should be resolvable now that imports are finalized\r\n for (var queuedExports_1 = __values(queuedExports), queuedExports_1_1 = queuedExports_1.next(); !queuedExports_1_1.done; queuedExports_1_1 = queuedExports_1.next()) {\r\n var _a = __read(queuedExports_1_1.value, 2), exportName = _a[0], queuedExport = _a[1];\r\n var currentExport = queuedExport; // nullable below\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.exports.get(currentExport.referencedName)) {\r\n this.setExportAndCheckLibrary(exportName, element, currentExport.member.externalName);\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.referencedName);\r\n if (!currentExport) {\r\n this.error(diagnostics_1.DiagnosticCode.Module_0_has_no_exported_member_1, queuedExport.member.externalName.range, queuedExport.member.parent.path.value, queuedExport.member.externalName.text);\r\n }\r\n }\r\n else {\r\n if (\r\n // normal export\r\n (element = this.elements.get(currentExport.referencedName)) ||\r\n // library re-export\r\n (element = this.elements.get(currentExport.member.name.text))) {\r\n this.setExportAndCheckLibrary(exportName, element, currentExport.member.externalName);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, queuedExport.member.range, queuedExport.member.name.text);\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (queuedExports_1_1 && !queuedExports_1_1.done && (_b = queuedExports_1.return)) _b.call(queuedExports_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n // resolve base prototypes of derived classes\r\n for (i = 0, k = queuedDerivedClasses.length; i < k; ++i) {\r\n var derivedDeclaration = queuedDerivedClasses[i].declaration;\r\n var derivedType = assert(derivedDeclaration.extendsType);\r\n var resolved = this.resolveIdentifier(derivedType.name, null);\r\n if (resolved) {\r\n if (resolved.element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(diagnostics_1.DiagnosticCode.A_class_may_only_extend_another_class, derivedType.range);\r\n continue;\r\n }\r\n queuedDerivedClasses[i].basePrototype = resolved.element;\r\n }\r\n }\r\n var e_1, _b;\r\n };\r\n /** Tries to resolve an import by traversing exports and queued exports. */\r\n Program.prototype.tryResolveImport = function (referencedName, queuedExports) {\r\n var element;\r\n do {\r\n if (element = this.exports.get(referencedName)) {\r\n return element;\r\n }\r\n var queuedExport = queuedExports.get(referencedName);\r\n if (!queuedExport)\r\n return null;\r\n if (queuedExport.isReExport) {\r\n referencedName = queuedExport.referencedName;\r\n continue;\r\n }\r\n return this.elements.get(queuedExport.referencedName);\r\n } while (true);\r\n };\r\n Program.prototype.checkInternalDecorators = function (element, declaration) {\r\n var isBuiltin = ast_1.hasDecorator(\"builtin\", declaration.decorators);\r\n if (isBuiltin) {\r\n element.set(ElementFlags.BUILTIN);\r\n }\r\n if (ast_1.hasDecorator(\"global\", declaration.decorators) ||\r\n (declaration.range.source.isLibrary &&\r\n element.is(ElementFlags.EXPORTED) &&\r\n (assert(declaration.parent).kind == ast_1.NodeKind.SOURCE ||\r\n declaration.parent.kind == ast_1.NodeKind.VARIABLE &&\r\n assert(declaration.parent.parent).kind == ast_1.NodeKind.SOURCE))) {\r\n element.set(ElementFlags.GLOBAL);\r\n if (this.elements.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, element.internalName);\r\n }\r\n else {\r\n this.elements.set(declaration.name.text, element);\r\n this.exports.set(declaration.name.text, element);\r\n if (isBuiltin) {\r\n element.internalName = declaration.name.text;\r\n }\r\n }\r\n }\r\n };\r\n Program.prototype.initializeClass = function (declaration, queuedDerivedClasses, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new ClassPrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (ast_1.hasDecorator(\"unmanaged\", declaration.decorators)) {\r\n prototype.isUnmanaged = true;\r\n if (declaration.implementsTypes && declaration.implementsTypes.length) {\r\n this.error(diagnostics_1.DiagnosticCode.Structs_cannot_implement_interfaces, ast_1.Range.join(declaration.name.range, declaration.implementsTypes[declaration.implementsTypes.length - 1]\r\n .range));\r\n }\r\n }\r\n else if (declaration.implementsTypes.length) {\r\n throw new Error(\"not implemented\");\r\n }\r\n // remember classes that extend another one\r\n if (declaration.extendsType) {\r\n queuedDerivedClasses.push(prototype);\r\n }\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n // otherwise add to file-level exports if exported\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case ast_1.NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n case ast_1.NodeKind.METHODDECLARATION:\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter ||\r\n ast_1.hasModifier(ast_1.ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n }\r\n else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"class member expected\");\r\n }\r\n }\r\n // check and possibly register string type\r\n if (prototype.is(ElementFlags.GLOBAL) &&\r\n declaration.name.text === \"String\" &&\r\n !this.types.has(\"string\")) {\r\n var instance = prototype.resolve(null);\r\n if (instance) {\r\n this.types.set(\"string\", instance.type);\r\n }\r\n }\r\n };\r\n Program.prototype.initializeField = function (declaration, classPrototype) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n // static fields become global variables\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.members = new Map();\r\n }\r\n var staticField = new Global(this, name, internalName, declaration, types_1.Type.void);\r\n classPrototype.members.set(name, staticField);\r\n this.elements.set(internalName, staticField);\r\n // instance fields are remembered until resolved\r\n }\r\n else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instanceField = new FieldPrototype(classPrototype, name, internalName, declaration);\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n };\r\n Program.prototype.initializeMethod = function (declaration, classPrototype) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype = null;\r\n // static methods become global functions\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n assert(declaration.name.kind != ast_1.NodeKind.CONSTRUCTOR);\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(this, name, internalName, declaration, null);\r\n classPrototype.members.set(name, prototype);\r\n this.elements.set(internalName, prototype);\r\n // instance methods are remembered until resolved\r\n }\r\n else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(this, name, internalName, declaration, classPrototype);\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == ast_1.NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(diagnostics_1.DiagnosticCode.Multiple_constructor_implementations_are_not_allowed, declaration.name.range);\r\n }\r\n else {\r\n prototype.set(ElementFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers.set(name, prototype);\r\n }\r\n }\r\n this.checkOperators(declaration.decorators, prototype, classPrototype);\r\n };\r\n Program.prototype.checkOperators = function (decorators, prototype, classPrototype) {\r\n // handle operator annotations. operators are either instance methods taking\r\n // a second argument of the instance's type or static methods taking two\r\n // arguments of the instance's type. return values vary depending on the\r\n // operation.\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n if (decorator.decoratorKind == 2 /* OPERATOR */) {\r\n if (!prototype) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, decorator.range);\r\n continue;\r\n }\r\n var numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n var firstArg = decorator.arguments[0];\r\n if (firstArg.kind == ast_1.NodeKind.LITERAL &&\r\n firstArg.literalKind == 2 /* STRING */) {\r\n switch (firstArg.value) {\r\n case \"[]\":\r\n classPrototype.fnIndexedGet = prototype.simpleName;\r\n break;\r\n case \"[]=\":\r\n classPrototype.fnIndexedSet = prototype.simpleName;\r\n break;\r\n case \"+\":\r\n classPrototype.fnConcat = prototype.simpleName;\r\n break;\r\n case \"==\":\r\n classPrototype.fnEquals = prototype.simpleName;\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, firstArg.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, firstArg.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, decorator.range, \"1\", numArgs.toString(0));\r\n }\r\n }\r\n else if (decorator.decoratorKind != 0 /* CUSTOM */) {\r\n // methods support built-in @operator only\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, decorator.range);\r\n }\r\n }\r\n }\r\n };\r\n Program.prototype.initializeAccessor = function (declaration, classPrototype, isGetter) {\r\n var propertyName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n var propertyElement = this.elements.get(internalPropertyName);\r\n if (propertyElement) {\r\n if (propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? propertyElement.getterPrototype\r\n : propertyElement.setterPrototype)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalPropertyName);\r\n return;\r\n }\r\n }\r\n else {\r\n propertyElement = new Property(this, propertyName, internalPropertyName, classPrototype);\r\n }\r\n var name = (isGetter ? exports.GETTER_PREFIX : exports.SETTER_PREFIX) + propertyName;\r\n // static accessors become global functions\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n var staticName = classPrototype.internalName + exports.STATIC_DELIMITER + name;\r\n if (this.elements.has(staticName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, staticName);\r\n return;\r\n }\r\n var staticPrototype = new FunctionPrototype(this, name, staticName, declaration, null);\r\n if (isGetter) {\r\n propertyElement.getterPrototype = staticPrototype;\r\n }\r\n else {\r\n propertyElement.setterPrototype = staticPrototype;\r\n }\r\n if (!classPrototype.members) {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(propertyName, propertyElement); // check above\r\n this.elements.set(internalPropertyName, propertyElement);\r\n // instance accessors are remembered until resolved\r\n }\r\n else {\r\n var instanceName = classPrototype.internalName + exports.INSTANCE_DELIMITER + name;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalPropertyName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instancePrototype = new FunctionPrototype(this, name, instanceName, declaration, classPrototype);\r\n if (isGetter) {\r\n propertyElement.getterPrototype = instancePrototype;\r\n }\r\n else {\r\n propertyElement.setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(name, propertyElement);\r\n this.elements.set(internalPropertyName, propertyElement);\r\n }\r\n };\r\n Program.prototype.initializeEnum = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var enm = new Enum(this, declaration.name.text, internalName, declaration);\r\n enm.namespace = namespace;\r\n this.elements.set(internalName, enm);\r\n this.checkInternalDecorators(enm, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, enm);\r\n }\r\n else if (enm.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, enm);\r\n }\r\n var values = declaration.values;\r\n for (var i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], enm);\r\n }\r\n };\r\n Program.prototype.initializeEnumValue = function (declaration, enm) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n };\r\n Program.prototype.initializeExports = function (statement, queuedExports) {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n };\r\n Program.prototype.setExportAndCheckLibrary = function (name, element, identifier) {\r\n this.exports.set(name, element);\r\n if (identifier.range.source.isLibrary) {\r\n if (this.elements.has(identifier.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, identifier.range, identifier.text);\r\n }\r\n else {\r\n element.internalName = identifier.text;\r\n this.elements.set(identifier.text, element);\r\n }\r\n }\r\n };\r\n Program.prototype.initializeExport = function (member, internalPath, queuedExports) {\r\n var externalName = member.range.source.internalPath + exports.PATH_DELIMITER + member.externalName.text;\r\n if (this.exports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n var referencedName;\r\n var referencedElement;\r\n var queuedExport;\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + exports.PATH_DELIMITER + member.name.text;\r\n // resolve right away if the element exists\r\n if (referencedElement = this.elements.get(referencedName)) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.referencedName = referencedName; // -> internal name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n // export external element\r\n }\r\n else {\r\n referencedName = internalPath + exports.PATH_DELIMITER + member.name.text;\r\n // resolve right away if the export exists\r\n referencedElement = this.elements.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n // walk already known queued exports\r\n var seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.exports.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n referencedName = queuedExport.referencedName;\r\n if (seen.has(queuedExport))\r\n break;\r\n seen.add(queuedExport);\r\n }\r\n else {\r\n referencedElement = this.elements.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.referencedName = referencedName; // -> export name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n };\r\n Program.prototype.initializeFunction = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new FunctionPrototype(this, declaration.name.text, internalName, declaration, null);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n };\r\n Program.prototype.initializeImports = function (statement, queuedExports, queuedImports) {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(declarations[i], statement.internalPath, queuedExports, queuedImports);\r\n }\r\n }\r\n else if (statement.namespaceName) {\r\n var internalName = (statement.range.source.internalPath +\r\n exports.PATH_DELIMITER +\r\n statement.namespaceName.text);\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, statement.namespaceName.range, internalName);\r\n return;\r\n }\r\n this.error(// TODO\r\n diagnostics_1.DiagnosticCode.Operation_not_supported, statement.range);\r\n }\r\n };\r\n Program.prototype.initializeImport = function (declaration, internalPath, queuedExports, queuedImports) {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var referencedName = internalPath + exports.PATH_DELIMITER + declaration.externalName.text;\r\n // resolve right away if the exact export exists\r\n var element;\r\n if (element = this.exports.get(referencedName)) {\r\n this.elements.set(internalName, element);\r\n return;\r\n }\r\n // otherwise queue it\r\n var indexPart = exports.PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.internalName = internalName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text);\r\n }\r\n else {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (internalPath +\r\n indexPart +\r\n exports.PATH_DELIMITER +\r\n declaration.externalName.text);\r\n }\r\n queuedImport.declaration = declaration;\r\n queuedImports.push(queuedImport);\r\n };\r\n Program.prototype.initializeInterface = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new InterfacePrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case ast_1.NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n case ast_1.NodeKind.METHODDECLARATION:\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter || ast_1.hasModifier(ast_1.ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n }\r\n else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n };\r\n Program.prototype.initializeNamespace = function (declaration, queuedExtendingClasses, parentNamespace) {\r\n if (parentNamespace === void 0) { parentNamespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n var namespace = this.elements.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, declaration.name.text, internalName, declaration);\r\n namespace.namespace = parentNamespace;\r\n this.elements.set(internalName, namespace);\r\n this.checkInternalDecorators(namespace, declaration);\r\n }\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(declaration.name.text, namespace);\r\n }\r\n else if (namespace.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, namespace);\r\n }\r\n var members = declaration.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n this.initializeClass(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, members[i].range);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n };\r\n Program.prototype.initializeTypeAlias = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.types.has(name) || this.typeAliases.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, name);\r\n return;\r\n }\r\n this.typeAliases.set(name, declaration.alias);\r\n };\r\n Program.prototype.initializeVariables = function (statement, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var declarations = statement.declarations;\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n continue;\r\n }\r\n var global = new Global(this, declaration.name.text, internalName, declaration, types_1.Type.void // resolved later on\r\n );\r\n global.namespace = namespace;\r\n this.elements.set(internalName, global);\r\n this.checkInternalDecorators(global, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n continue;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, global);\r\n }\r\n else if (global.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n }\r\n else {\r\n this.exports.set(internalName, global);\r\n }\r\n }\r\n }\r\n };\r\n /** Resolves a {@link TypeNode} to a concrete {@link Type}. */\r\n Program.prototype.resolveType = function (node, contextualTypeArguments, reportNotFound) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (reportNotFound === void 0) { reportNotFound = true; }\r\n var globalName = node.name.text;\r\n var localName = node.range.source.internalPath + exports.PATH_DELIMITER + node.name.text;\r\n var element;\r\n // check file-global / program-global element\r\n if ((element = this.elements.get(localName)) || (element = this.elements.get(globalName))) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n var instance = element.resolveInclTypeArguments(node.typeArguments, contextualTypeArguments, null); // reports\r\n return instance ? instance.type : null;\r\n }\r\n }\r\n // resolve parameters\r\n var k = node.typeArguments.length;\r\n var paramTypes = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var paramType = this.resolveType(// reports\r\n node.typeArguments[i], contextualTypeArguments, reportNotFound);\r\n if (!paramType)\r\n return null;\r\n paramTypes[i] = paramType;\r\n }\r\n if (k) {\r\n var instanceKey = types_1.typesToString(paramTypes);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n }\r\n else if (contextualTypeArguments) {\r\n var placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType)\r\n return placeholderType;\r\n }\r\n var type;\r\n // check file-global / program-global type\r\n if ((type = this.types.get(localName)) || (type = this.types.get(globalName))) {\r\n return type;\r\n }\r\n // check type alias\r\n var alias = this.typeAliases.get(globalName);\r\n if (alias && (type = this.resolveType(alias, null, reportNotFound))) {\r\n return type;\r\n }\r\n if (reportNotFound) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, node.name.range, globalName);\r\n }\r\n return null;\r\n };\r\n /** Resolves an array of type parameters to concrete types. */\r\n Program.prototype.resolveTypeArguments = function (typeParameters, typeArgumentNodes, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var parameterCount = typeParameters.length;\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (parameterCount != argumentCount) {\r\n if (argumentCount) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, ast_1.Range.join(typeArgumentNodes[0].range, typeArgumentNodes[argumentCount - 1].range), parameterCount.toString(10), argumentCount.toString(10));\r\n }\r\n else if (alternativeReportNode) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\");\r\n }\r\n return null;\r\n }\r\n var typeArguments = new Array(parameterCount);\r\n for (var i = 0; i < parameterCount; ++i) {\r\n var type = this.resolveType(// reports\r\n typeArgumentNodes[i], contextualTypeArguments, true);\r\n if (!type)\r\n return null;\r\n // TODO: check extendsType\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n };\r\n /** Resolves an identifier to the element it refers to. */\r\n Program.prototype.resolveIdentifier = function (identifier, contextualFunction, contextualEnum) {\r\n if (contextualEnum === void 0) { contextualEnum = null; }\r\n var name = identifier.text;\r\n var element;\r\n var namespace;\r\n // check siblings\r\n if (contextualEnum) {\r\n if (contextualEnum.members &&\r\n (element = contextualEnum.members.get(name)) &&\r\n element.kind == ElementKind.ENUMVALUE) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n }\r\n else if (contextualFunction) {\r\n // check locals\r\n if (element = contextualFunction.flow.getScopedLocal(name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n // search contextual parent namespaces if applicable\r\n if (namespace = contextualFunction.prototype.namespace) {\r\n do {\r\n if (element = this.elements.get(namespace.internalName + exports.STATIC_DELIMITER + name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n } while (namespace = namespace.namespace);\r\n }\r\n }\r\n // search current file\r\n if (element = this.elements.get(identifier.range.source.internalPath + exports.PATH_DELIMITER + name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n // search global scope\r\n if (element = this.elements.get(name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, identifier.range, name);\r\n return null;\r\n };\r\n /** Resolves a property access to the element it refers to. */\r\n Program.prototype.resolvePropertyAccess = function (propertyAccess, contextualFunction) {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n if (!resolvedElement)\r\n return null;\r\n var target = resolvedElement.element;\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n var targetType;\r\n var member;\r\n // Resolve variable-likes to their class type first\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n if (!(targetType = target.type).classType) {\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, targetType.toString());\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n case ElementKind.PROPERTY:\r\n var getter = assert(target.getterPrototype).resolve(); // reports\r\n if (!getter)\r\n return null;\r\n if (!(targetType = getter.returnType).classType) {\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, targetType.toString());\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n }\r\n // Look up the member within\r\n switch (target.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS:\r\n do {\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n // check inherited static members on the base prototype while target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if (target.basePrototype) {\r\n target = target.basePrototype;\r\n }\r\n else {\r\n break;\r\n }\r\n // or inherited instance members on the cbase class while target is a class instance\r\n }\r\n else if (target.kind == ElementKind.CLASS) {\r\n if (target.base) {\r\n target = target.base;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n default:// enums or other namespace-like elements\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, target.internalName);\r\n return null;\r\n };\r\n Program.prototype.resolveElementAccess = function (elementAccess, contextualFunction) {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = elementAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction);\r\n if (!resolvedElement)\r\n return null;\r\n var target = resolvedElement.element;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n var type = target.type;\r\n if (type.classType) {\r\n var indexedGetName = (target = type.classType).prototype.fnIndexedGet;\r\n var indexedGet;\r\n if (indexedGetName != null &&\r\n target.members &&\r\n (indexedGet = target.members.get(indexedGetName)) &&\r\n indexedGet.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n return resolvedElement.set(indexedGet).withTarget(type.classType, targetExpression);\r\n }\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Index_signature_is_missing_in_type_0, targetExpression.range, target.internalName);\r\n return null;\r\n };\r\n Program.prototype.resolveExpression = function (expression, contextualFunction) {\r\n var classType;\r\n while (expression.kind == ast_1.NodeKind.PARENTHESIZED) {\r\n expression = expression.expression;\r\n }\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.ASSERTION:\r\n var type = this.resolveType(expression.toType); // reports\r\n if (type && (classType = type.classType)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n return null;\r\n case ast_1.NodeKind.BINARY:\r\n // TODO: string concatenation, mostly\r\n throw new Error(\"not implemented\");\r\n case ast_1.NodeKind.THIS:// -> Class\r\n if (classType = contextualFunction.instanceMethodOf) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._this_cannot_be_referenced_in_current_location, expression.range);\r\n return null;\r\n case ast_1.NodeKind.SUPER:// -> Class\r\n if ((classType = contextualFunction.instanceMethodOf) && (classType = classType.base)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class, expression.range);\r\n return null;\r\n case ast_1.NodeKind.IDENTIFIER:\r\n return this.resolveIdentifier(expression, contextualFunction);\r\n case ast_1.NodeKind.PROPERTYACCESS:\r\n return this.resolvePropertyAccess(expression, contextualFunction);\r\n case ast_1.NodeKind.ELEMENTACCESS:\r\n return this.resolveElementAccess(expression, contextualFunction);\r\n case ast_1.NodeKind.CALL:\r\n var resolved = this.resolveExpression(expression.expression, contextualFunction);\r\n if (resolved) {\r\n var element = resolved.element;\r\n if (element && element.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = element.resolveInclTypeArguments(expression.typeArguments, null, expression);\r\n if (instance && instance.returnType.classType) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(instance.returnType.classType);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return null;\r\n };\r\n return Program;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Program = Program;\r\n/** Common result structure returned when calling any of the resolve functions on a {@link Program}. */\r\nvar ResolvedElement = /** @class */ (function () {\r\n function ResolvedElement() {\r\n }\r\n /** Clears the target and sets the resolved element. */\r\n ResolvedElement.prototype.set = function (element) {\r\n this.target = null;\r\n this.targetExpression = null;\r\n this.element = element;\r\n return this;\r\n };\r\n /** Sets the resolved target in addition to the previously set element. */\r\n ResolvedElement.prototype.withTarget = function (target, targetExpression) {\r\n this.target = target;\r\n this.targetExpression = targetExpression;\r\n return this;\r\n };\r\n return ResolvedElement;\r\n}());\r\nexports.ResolvedElement = ResolvedElement;\r\n// Cached result structure instance\r\nvar resolvedElement;\r\n/** Indicates the specific kind of an {@link Element}. */\r\nvar ElementKind;\r\n(function (ElementKind) {\r\n /** A {@link Global}. */\r\n ElementKind[ElementKind[\"GLOBAL\"] = 0] = \"GLOBAL\";\r\n /** A {@link Local}. */\r\n ElementKind[ElementKind[\"LOCAL\"] = 1] = \"LOCAL\";\r\n /** An {@link Enum}. */\r\n ElementKind[ElementKind[\"ENUM\"] = 2] = \"ENUM\";\r\n /** An {@link EnumValue}. */\r\n ElementKind[ElementKind[\"ENUMVALUE\"] = 3] = \"ENUMVALUE\";\r\n /** A {@link FunctionPrototype}. */\r\n ElementKind[ElementKind[\"FUNCTION_PROTOTYPE\"] = 4] = \"FUNCTION_PROTOTYPE\";\r\n /** A {@link Function}. */\r\n ElementKind[ElementKind[\"FUNCTION\"] = 5] = \"FUNCTION\";\r\n /** A {@link ClassPrototype}. */\r\n ElementKind[ElementKind[\"CLASS_PROTOTYPE\"] = 6] = \"CLASS_PROTOTYPE\";\r\n /** A {@link Class}. */\r\n ElementKind[ElementKind[\"CLASS\"] = 7] = \"CLASS\";\r\n /** An {@link InterfacePrototype}. */\r\n ElementKind[ElementKind[\"INTERFACE_PROTOTYPE\"] = 8] = \"INTERFACE_PROTOTYPE\";\r\n /** An {@link Interface}. */\r\n ElementKind[ElementKind[\"INTERFACE\"] = 9] = \"INTERFACE\";\r\n /** A {@link FieldPrototype}. */\r\n ElementKind[ElementKind[\"FIELD_PROTOTYPE\"] = 10] = \"FIELD_PROTOTYPE\";\r\n /** A {@link Field}. */\r\n ElementKind[ElementKind[\"FIELD\"] = 11] = \"FIELD\";\r\n /** A {@link Property}. */\r\n ElementKind[ElementKind[\"PROPERTY\"] = 12] = \"PROPERTY\";\r\n /** A {@link Namespace}. */\r\n ElementKind[ElementKind[\"NAMESPACE\"] = 13] = \"NAMESPACE\";\r\n})(ElementKind = exports.ElementKind || (exports.ElementKind = {}));\r\n/** Indicates traits of an {@link Element}. */\r\nvar ElementFlags;\r\n(function (ElementFlags) {\r\n /** No flags set. */\r\n ElementFlags[ElementFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** Is compiled. */\r\n ElementFlags[ElementFlags[\"COMPILED\"] = 1] = \"COMPILED\";\r\n /** Is an import. */\r\n ElementFlags[ElementFlags[\"IMPORTED\"] = 2] = \"IMPORTED\";\r\n /** Is an export. */\r\n ElementFlags[ElementFlags[\"EXPORTED\"] = 4] = \"EXPORTED\";\r\n /** Is built-in. */\r\n ElementFlags[ElementFlags[\"BUILTIN\"] = 8] = \"BUILTIN\";\r\n /** Is declared. */\r\n ElementFlags[ElementFlags[\"DECLARED\"] = 16] = \"DECLARED\";\r\n /** Is generic. */\r\n ElementFlags[ElementFlags[\"GENERIC\"] = 32] = \"GENERIC\";\r\n /** Is constant. */\r\n ElementFlags[ElementFlags[\"CONSTANT\"] = 64] = \"CONSTANT\";\r\n /** Has a constant value and is therefore inlined. */\r\n ElementFlags[ElementFlags[\"INLINED\"] = 128] = \"INLINED\";\r\n /** Is instance member. */\r\n ElementFlags[ElementFlags[\"INSTANCE\"] = 256] = \"INSTANCE\";\r\n /** Is getter. */\r\n ElementFlags[ElementFlags[\"GETTER\"] = 512] = \"GETTER\";\r\n /** Is setter. */\r\n ElementFlags[ElementFlags[\"SETTER\"] = 1024] = \"SETTER\";\r\n /** Is global. */\r\n ElementFlags[ElementFlags[\"GLOBAL\"] = 2048] = \"GLOBAL\";\r\n /** Is read-only. */\r\n ElementFlags[ElementFlags[\"READONLY\"] = 4096] = \"READONLY\";\r\n /** Is a public member. */\r\n ElementFlags[ElementFlags[\"PUBLIC\"] = 8192] = \"PUBLIC\";\r\n /** Is a protected member. */\r\n ElementFlags[ElementFlags[\"PROTECTED\"] = 16384] = \"PROTECTED\";\r\n /** Is a private member. */\r\n ElementFlags[ElementFlags[\"PRIVATE\"] = 32768] = \"PRIVATE\";\r\n /** Is an abstract member. */\r\n ElementFlags[ElementFlags[\"ABSTRACT\"] = 65536] = \"ABSTRACT\";\r\n /** Is a constructor. */\r\n ElementFlags[ElementFlags[\"CONSTRUCTOR\"] = 131072] = \"CONSTRUCTOR\";\r\n /** Is an unmanaged class with limited capabilites. */\r\n ElementFlags[ElementFlags[\"UNMANAGED\"] = 262144] = \"UNMANAGED\";\r\n /** Is scoped. */\r\n ElementFlags[ElementFlags[\"SCOPED\"] = 524288] = \"SCOPED\";\r\n /** Is the start function. */\r\n ElementFlags[ElementFlags[\"START\"] = 1048576] = \"START\";\r\n})(ElementFlags = exports.ElementFlags || (exports.ElementFlags = {}));\r\n/** Base class of all program elements. */\r\nvar Element = /** @class */ (function () {\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n function Element(program, simpleName, internalName) {\r\n /** Element flags. */\r\n this.flags = ElementFlags.NONE;\r\n /** Namespaced member elements. */\r\n this.members = null;\r\n /** Parent namespace, if applicable. */\r\n this.namespace = null;\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n /** Tests if this element has a specific flag or flags. */\r\n Element.prototype.is = function (flag) { return (this.flags & flag) == flag; };\r\n /** Sets a specific flag or flags. */\r\n Element.prototype.set = function (flag) { this.flags |= flag; };\r\n return Element;\r\n}());\r\nexports.Element = Element;\r\n/** A namespace. */\r\nvar Namespace = /** @class */ (function (_super) {\r\n __extends(Namespace, _super);\r\n /** Constructs a new namespace. */\r\n function Namespace(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n _this.kind = ElementKind.NAMESPACE;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n return Namespace;\r\n}(Element));\r\nexports.Namespace = Namespace;\r\n/** An enum. */\r\nvar Enum = /** @class */ (function (_super) {\r\n __extends(Enum, _super);\r\n /** Constructs a new enum. */\r\n function Enum(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.ENUM;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.CONST:\r\n _this.set(ElementFlags.CONSTANT);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n return Enum;\r\n}(Element));\r\nexports.Enum = Enum;\r\n/** An enum value. */\r\nvar EnumValue = /** @class */ (function (_super) {\r\n __extends(EnumValue, _super);\r\n function EnumValue(enm, program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.ENUMVALUE;\r\n /** Constant value, if applicable. */\r\n _this.constantValue = 0;\r\n _this.enum = enm;\r\n _this.declaration = declaration;\r\n return _this;\r\n }\r\n return EnumValue;\r\n}(Element));\r\nexports.EnumValue = EnumValue;\r\nvar ConstantValueKind;\r\n(function (ConstantValueKind) {\r\n ConstantValueKind[ConstantValueKind[\"NONE\"] = 0] = \"NONE\";\r\n ConstantValueKind[ConstantValueKind[\"INTEGER\"] = 1] = \"INTEGER\";\r\n ConstantValueKind[ConstantValueKind[\"FLOAT\"] = 2] = \"FLOAT\";\r\n})(ConstantValueKind = exports.ConstantValueKind || (exports.ConstantValueKind = {}));\r\nvar VariableLikeElement = /** @class */ (function (_super) {\r\n __extends(VariableLikeElement, _super);\r\n function VariableLikeElement() {\r\n // kind varies\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n /** Constant value kind. */\r\n _this.constantValueKind = 0 /* NONE */;\r\n return _this;\r\n }\r\n VariableLikeElement.prototype.withConstantIntegerValue = function (lo, hi) {\r\n this.constantValueKind = 1 /* INTEGER */;\r\n this.constantIntegerValue = i64_new(lo, hi);\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n };\r\n VariableLikeElement.prototype.withConstantFloatValue = function (value) {\r\n this.constantValueKind = 2 /* FLOAT */;\r\n this.constantFloatValue = value;\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n };\r\n return VariableLikeElement;\r\n}(Element));\r\nexports.VariableLikeElement = VariableLikeElement;\r\n/** A global variable. */\r\nvar Global = /** @class */ (function (_super) {\r\n __extends(Global, _super);\r\n function Global(program, simpleName, internalName, declaration, type) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.GLOBAL;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.CONST:\r\n _this.set(ElementFlags.CONSTANT);\r\n break;\r\n case ast_1.ModifierKind.LET:\r\n _this.set(ElementFlags.SCOPED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.READONLY:\r\n _this.set(_this.declaration.initializer\r\n ? ElementFlags.CONSTANT | ElementFlags.READONLY\r\n : ElementFlags.READONLY);\r\n break;\r\n case ast_1.ModifierKind.PUBLIC:\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.STATIC:\r\n break; // static fields become globals\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n _this.type = type; // resolved later if `void`\r\n return _this;\r\n }\r\n return Global;\r\n}(VariableLikeElement));\r\nexports.Global = Global;\r\n/** A function parameter. */\r\nvar Parameter = /** @class */ (function () {\r\n /** Constructs a new function parameter. */\r\n function Parameter(name, type, initializer) {\r\n if (initializer === void 0) { initializer = null; }\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n return Parameter;\r\n}());\r\nexports.Parameter = Parameter;\r\n/** A function local. */\r\nvar Local = /** @class */ (function (_super) {\r\n __extends(Local, _super);\r\n function Local(program, simpleName, index, type) {\r\n var _this = _super.call(this, program, simpleName, simpleName) || this;\r\n _this.kind = ElementKind.LOCAL;\r\n _this.index = index;\r\n _this.type = type;\r\n return _this;\r\n }\r\n return Local;\r\n}(VariableLikeElement));\r\nexports.Local = Local;\r\n/** A yet unresolved function prototype. */\r\nvar FunctionPrototype = /** @class */ (function (_super) {\r\n __extends(FunctionPrototype, _super);\r\n /** Constructs a new function prototype. */\r\n function FunctionPrototype(program, simpleName, internalName, declaration, classPrototype) {\r\n if (classPrototype === void 0) { classPrototype = null; }\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.FUNCTION_PROTOTYPE;\r\n /** Resolved instances. */\r\n _this.instances = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. */\r\n _this.classTypeArguments = null;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.GET:\r\n _this.set(ElementFlags.GETTER);\r\n break;\r\n case ast_1.ModifierKind.SET:\r\n _this.set(ElementFlags.SETTER);\r\n break;\r\n case ast_1.ModifierKind.STATIC:\r\n case ast_1.ModifierKind.ABSTRACT:\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.PUBLIC:\r\n break; // already handled\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (_this.declaration.typeParameters.length) {\r\n _this.set(ElementFlags.GENERIC);\r\n }\r\n if (_this.classPrototype = classPrototype) {\r\n _this.set(ElementFlags.INSTANCE);\r\n }\r\n return _this;\r\n }\r\n FunctionPrototype.prototype.resolve = function (functionTypeArguments, contextualTypeArguments) {\r\n if (functionTypeArguments === void 0) { functionTypeArguments = null; }\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var instanceKey = functionTypeArguments ? types_1.typesToString(functionTypeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance)\r\n return instance;\r\n var declaration = this.declaration;\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n try {\r\n for (var inheritedTypeArguments_1 = __values(inheritedTypeArguments), inheritedTypeArguments_1_1 = inheritedTypeArguments_1.next(); !inheritedTypeArguments_1_1.done; inheritedTypeArguments_1_1 = inheritedTypeArguments_1.next()) {\r\n var _a = __read(inheritedTypeArguments_1_1.value, 2), inheritedName = _a[0], inheritedType = _a[1];\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (inheritedTypeArguments_1_1 && !inheritedTypeArguments_1_1.done && (_b = inheritedTypeArguments_1.return)) _b.call(inheritedTypeArguments_1);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n var i, k;\r\n // inherit class type arguments if a partially resolved instance method (classTypeArguments is set)\r\n if (this.classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n var classDeclaration = this.classPrototype.declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n if ((k = this.classTypeArguments.length) != classTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(classTypeParameters[i].name.text, this.classTypeArguments[i]);\r\n }\r\n }\r\n // override call specific contextual type arguments\r\n var functionTypeParameters = declaration.typeParameters;\r\n if (functionTypeArguments && (k = functionTypeArguments.length)) {\r\n if (k != functionTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(functionTypeParameters[i].name.text, functionTypeArguments[i]);\r\n }\r\n }\r\n // resolve parameters\r\n // TODO: 'this' type\r\n k = declaration.parameters.length;\r\n var parameters = new Array(k);\r\n var parameterTypes = new Array(k);\r\n var typeNode;\r\n for (i = 0; i < k; ++i) {\r\n var parameterDeclaration = declaration.parameters[i];\r\n typeNode = assert(parameterDeclaration.type);\r\n var parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (parameterType) {\r\n parameters[i] = new Parameter(parameterDeclaration.name.text, parameterType, parameterDeclaration.initializer);\r\n parameterTypes[i] = parameterType;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n var classInstance = null;\r\n if (this.classPrototype) {\r\n classInstance = this.classPrototype.resolve(this.classTypeArguments, contextualTypeArguments); // reports\r\n if (!classInstance)\r\n return null;\r\n }\r\n // resolve return type\r\n // TODO: 'this' type\r\n var returnType;\r\n if (this.is(ElementFlags.SETTER) || this.is(ElementFlags.CONSTRUCTOR)) {\r\n returnType = types_1.Type.void; // not annotated\r\n }\r\n else {\r\n typeNode = assert(declaration.returnType);\r\n var type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (type) {\r\n returnType = type;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n instance = new Function(this, internalName, functionTypeArguments, parameters, returnType, classInstance);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n return instance;\r\n var e_2, _b;\r\n };\r\n FunctionPrototype.prototype.resolveInclTypeArguments = function (typeArgumentNodes, contextualTypeArguments, reportNode) {\r\n var resolvedTypeArguments = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(this.declaration.typeParameters, typeArgumentNodes, contextualTypeArguments, reportNode);\r\n if (!resolvedTypeArguments)\r\n return null;\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n };\r\n FunctionPrototype.prototype.resolvePartial = function (classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n if (classTypeArguments && classTypeArguments.length) {\r\n var partialPrototype = new FunctionPrototype(this.program, this.simpleName, this.internalName, this.declaration, this.classPrototype);\r\n partialPrototype.flags = this.flags;\r\n partialPrototype.classTypeArguments = classTypeArguments;\r\n return partialPrototype;\r\n }\r\n return this; // no need to clone\r\n };\r\n FunctionPrototype.prototype.toString = function () { return this.simpleName; };\r\n return FunctionPrototype;\r\n}(Element));\r\nexports.FunctionPrototype = FunctionPrototype;\r\n/** A resolved function. */\r\nvar Function = /** @class */ (function (_super) {\r\n __extends(Function, _super);\r\n /** Constructs a new concrete function. */\r\n function Function(prototype, internalName, typeArguments, parameters, returnType, instanceMethodOf) {\r\n if (instanceMethodOf === void 0) { instanceMethodOf = null; }\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.FUNCTION;\r\n /** Map of locals by name. */\r\n _this.locals = new Map();\r\n /** List of additional non-parameter locals. */\r\n _this.additionalLocals = [];\r\n /** Current break context label. */\r\n _this.breakContext = null;\r\n /** Remembered debug locations. */\r\n _this.debugLocations = null;\r\n _this.nextBreakId = 0;\r\n _this.breakStack = null;\r\n _this.tempI32s = null;\r\n _this.tempI64s = null;\r\n _this.tempF32s = null;\r\n _this.tempF64s = null;\r\n _this.prototype = prototype;\r\n _this.typeArguments = typeArguments;\r\n _this.parameters = parameters || [];\r\n _this.returnType = returnType;\r\n _this.instanceMethodOf = instanceMethodOf;\r\n _this.flags = prototype.flags;\r\n if (!(prototype.is(ElementFlags.BUILTIN) || prototype.is(ElementFlags.DECLARED))) {\r\n var localIndex = 0;\r\n if (instanceMethodOf) {\r\n assert(_this.is(ElementFlags.INSTANCE)); // internal error\r\n _this.locals.set(\"this\", new Local(prototype.program, \"this\", localIndex++, instanceMethodOf.type));\r\n if (instanceMethodOf.contextualTypeArguments) {\r\n if (!_this.contextualTypeArguments) {\r\n _this.contextualTypeArguments = new Map();\r\n }\r\n try {\r\n for (var _a = __values(instanceMethodOf.contextualTypeArguments), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var _c = __read(_b.value, 2), inheritedName = _c[0], inheritedType = _c[1];\r\n _this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_d = _a.return)) _d.call(_a);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n }\r\n }\r\n else {\r\n assert(!_this.is(ElementFlags.INSTANCE)); // internal error\r\n }\r\n for (var i = 0, k = _this.parameters.length; i < k; ++i) {\r\n var parameter = _this.parameters[i];\r\n var parameterName = assert(parameter.name, \"parameter must be named\"); // not a builtin or declared\r\n _this.locals.set(parameterName, new Local(prototype.program, parameterName, localIndex++, parameter.type));\r\n }\r\n }\r\n _this.flow = Flow.create(_this);\r\n return _this;\r\n var e_3, _d;\r\n }\r\n /** Adds a local of the specified type, with an optional name. */\r\n Function.prototype.addLocal = function (type, name) {\r\n if (name === void 0) { name = null; }\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = (this.parameters ? this.parameters.length : 0) + this.additionalLocals.length;\r\n if (this.is(ElementFlags.INSTANCE))\r\n localIndex++; // plus 'this'\r\n var local = new Local(this.prototype.program, name\r\n ? name\r\n : \"var$\" + localIndex.toString(10), localIndex, type);\r\n if (name) {\r\n if (this.locals.has(name))\r\n throw new Error(\"duplicate local name\");\r\n this.locals.set(name, local);\r\n }\r\n this.additionalLocals.push(type);\r\n return local;\r\n };\r\n /** Gets a free temporary local of the specified type. */\r\n Function.prototype.getTempLocal = function (type) {\r\n var temps;\r\n switch (type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s;\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s;\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s;\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s;\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps && temps.length) {\r\n var ret = temps.pop();\r\n ret.type = type;\r\n return ret;\r\n }\r\n return this.addLocal(type);\r\n };\r\n /** Frees the temporary local for reuse. */\r\n Function.prototype.freeTempLocal = function (local) {\r\n var temps;\r\n assert(local.type != null); // internal error\r\n switch (local.type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n temps.push(local);\r\n };\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n Function.prototype.getAndFreeTempLocal = function (type) {\r\n var temps;\r\n switch (type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps.length > 0) {\r\n return temps[temps.length - 1];\r\n }\r\n var local = this.addLocal(type);\r\n temps.push(local);\r\n return local;\r\n };\r\n /** Enters a(nother) break context. */\r\n Function.prototype.enterBreakContext = function () {\r\n var id = this.nextBreakId++;\r\n if (!this.breakStack) {\r\n this.breakStack = [id];\r\n }\r\n else {\r\n this.breakStack.push(id);\r\n }\r\n return this.breakContext = id.toString(10);\r\n };\r\n /** Leaves the current break context. */\r\n Function.prototype.leaveBreakContext = function () {\r\n assert(this.breakStack != null);\r\n var length = this.breakStack.length;\r\n assert(length > 0);\r\n this.breakStack.pop();\r\n if (length > 1) {\r\n this.breakContext = this.breakStack[length - 2].toString(10);\r\n }\r\n else {\r\n this.breakContext = null;\r\n this.breakStack = null;\r\n }\r\n };\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n Function.prototype.finalize = function (module, ref) {\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakContext = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n var debugLocations = this.debugLocations;\r\n if (debugLocations) {\r\n for (var i = 0, k = debugLocations.length; i < k; ++i) {\r\n var debugLocation = debugLocations[i];\r\n module.setDebugLocation(ref, debugLocation.debugInfoRef, debugLocation.source.debugInfoIndex, debugLocation.line, debugLocation.column);\r\n }\r\n }\r\n }\r\n this.debugLocations = null;\r\n };\r\n /** Returns the TypeScript representation of this function. */\r\n Function.prototype.toString = function () { return this.prototype.simpleName; };\r\n /** Returns the function type TypeScript representation of this function.*/\r\n Function.prototype.toTypeString = function () { throw new Error(\"not implemented\"); };\r\n return Function;\r\n}(Element));\r\nexports.Function = Function;\r\n/** A yet unresolved instance field prototype. */\r\nvar FieldPrototype = /** @class */ (function (_super) {\r\n __extends(FieldPrototype, _super);\r\n /** Constructs a new field prototype. */\r\n function FieldPrototype(classPrototype, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, classPrototype.program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.FIELD_PROTOTYPE;\r\n _this.classPrototype = classPrototype;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.READONLY:\r\n _this.set(ElementFlags.READONLY);\r\n break;\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.PUBLIC:\r\n case ast_1.ModifierKind.STATIC:\r\n break; // already handled\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n Object.defineProperty(FieldPrototype.prototype, \"isReadonly\", {\r\n /** Whether the field is read-only or not. */\r\n get: function () {\r\n return (this.flags & ElementFlags.READONLY) != 0;\r\n },\r\n set: function (is) {\r\n if (is) {\r\n this.flags |= ElementFlags.READONLY;\r\n }\r\n else {\r\n this.flags &= ~ElementFlags.READONLY;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return FieldPrototype;\r\n}(Element));\r\nexports.FieldPrototype = FieldPrototype;\r\n/** A resolved instance field. */\r\nvar Field = /** @class */ (function (_super) {\r\n __extends(Field, _super);\r\n /** Constructs a new field. */\r\n function Field(prototype, internalName, type) {\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.FIELD;\r\n /** Field memory offset, if an instance field. */\r\n _this.memoryOffset = -1;\r\n _this.prototype = prototype;\r\n _this.flags = prototype.flags;\r\n _this.type = type;\r\n return _this;\r\n }\r\n return Field;\r\n}(VariableLikeElement));\r\nexports.Field = Field;\r\n/** A property comprised of a getter and a setter function. */\r\nvar Property = /** @class */ (function (_super) {\r\n __extends(Property, _super);\r\n /** Constructs a new property prototype. */\r\n function Property(program, simpleName, internalName, parent) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.PROPERTY;\r\n /** Getter prototype. */\r\n _this.getterPrototype = null;\r\n /** Setter prototype. */\r\n _this.setterPrototype = null;\r\n _this.parent = parent;\r\n return _this;\r\n }\r\n return Property;\r\n}(Element));\r\nexports.Property = Property;\r\n/** A yet unresolved class prototype. */\r\nvar ClassPrototype = /** @class */ (function (_super) {\r\n __extends(ClassPrototype, _super);\r\n function ClassPrototype(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.CLASS_PROTOTYPE;\r\n /** Resolved instances. */\r\n _this.instances = new Map();\r\n /** Instance member prototypes. */\r\n _this.instanceMembers = null;\r\n /** Base class prototype, if applicable. */\r\n _this.basePrototype = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n _this.constructorPrototype = null;\r\n /** Overloaded indexed get method, if any. */\r\n _this.fnIndexedGet = null;\r\n /** Overloaded indexed set method, if any. */\r\n _this.fnIndexedSet = null;\r\n /** Overloaded concatenation method, if any. */\r\n _this.fnConcat = null;\r\n /** Overloaded equality comparison method, if any. */\r\n _this.fnEquals = null;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (_this.declaration.typeParameters.length) {\r\n _this.set(ElementFlags.GENERIC);\r\n }\r\n return _this;\r\n }\r\n Object.defineProperty(ClassPrototype.prototype, \"isUnmanaged\", {\r\n /** Whether an unamanaged class or not. */\r\n get: function () {\r\n return (this.flags & ElementFlags.UNMANAGED) != 0;\r\n },\r\n set: function (is) {\r\n if (is) {\r\n this.flags |= ElementFlags.UNMANAGED;\r\n }\r\n else {\r\n this.flags &= ~ElementFlags.UNMANAGED;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ClassPrototype.prototype.resolve = function (typeArguments, contextualTypeArguments) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var instanceKey = typeArguments ? types_1.typesToString(typeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance)\r\n return instance;\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n try {\r\n for (var inheritedTypeArguments_2 = __values(inheritedTypeArguments), inheritedTypeArguments_2_1 = inheritedTypeArguments_2.next(); !inheritedTypeArguments_2_1.done; inheritedTypeArguments_2_1 = inheritedTypeArguments_2.next()) {\r\n var _a = __read(inheritedTypeArguments_2_1.value, 2), inheritedName = _a[0], inheritedType = _a[1];\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\r\n finally {\r\n try {\r\n if (inheritedTypeArguments_2_1 && !inheritedTypeArguments_2_1.done && (_b = inheritedTypeArguments_2.return)) _b.call(inheritedTypeArguments_2);\r\n }\r\n finally { if (e_4) throw e_4.error; }\r\n }\r\n }\r\n var declaration = this.declaration;\r\n var baseClass = null;\r\n if (declaration.extendsType) {\r\n var baseClassType = this.program.resolveType(declaration.extendsType, null); // reports\r\n if (!baseClassType)\r\n return null;\r\n if (!(baseClass = baseClassType.classType)) {\r\n this.program.error(diagnostics_1.DiagnosticCode.A_class_may_only_extend_another_class, declaration.extendsType.range);\r\n return null;\r\n }\r\n if (baseClass.prototype.isUnmanaged != this.isUnmanaged) {\r\n this.program.error(diagnostics_1.DiagnosticCode.Structs_cannot_extend_classes_and_vice_versa, ast_1.Range.join(declaration.name.range, declaration.extendsType.range));\r\n return null;\r\n }\r\n }\r\n // override call specific contextual type arguments if provided\r\n var i, k;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n else if (declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(this, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n var memoryOffset = 0;\r\n if (baseClass) {\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n if (baseClass.members) {\r\n if (!instance.members)\r\n instance.members = new Map();\r\n try {\r\n for (var _c = __values(baseClass.members.values()), _d = _c.next(); !_d.done; _d = _c.next()) {\r\n var inheritedMember = _d.value;\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\r\n finally {\r\n try {\r\n if (_d && !_d.done && (_e = _c.return)) _e.call(_c);\r\n }\r\n finally { if (e_5) throw e_5.error; }\r\n }\r\n }\r\n }\r\n if (this.constructorPrototype) {\r\n var partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports\r\n if (partialConstructor) {\r\n instance.constructorInstance = partialConstructor.resolve(); // reports\r\n }\r\n // TODO: ^ doesn't know the return type, hence returns null\r\n }\r\n if (this.instanceMembers) {\r\n try {\r\n for (var _f = __values(this.instanceMembers.values()), _g = _f.next(); !_g.done; _g = _f.next()) {\r\n var member = _g.value;\r\n switch (member.kind) {\r\n case ElementKind.FIELD_PROTOTYPE:// fields are layed out in advance\r\n if (!instance.members)\r\n instance.members = new Map();\r\n var fieldDeclaration = member.declaration;\r\n if (!fieldDeclaration.type) {\r\n throw new Error(\"type expected\"); // TODO: check if parent class defines a type\r\n }\r\n var fieldType = this.program.resolveType(// reports\r\n fieldDeclaration.type, instance.contextualTypeArguments);\r\n if (fieldType) {\r\n var fieldInstance = new Field(member, member.internalName, fieldType);\r\n switch (fieldType.byteSize) {\r\n case 1: break;\r\n case 2:\r\n if (memoryOffset & 1)\r\n ++memoryOffset;\r\n break;\r\n case 4:\r\n if (memoryOffset & 3)\r\n memoryOffset = (memoryOffset | 3) + 1;\r\n break;\r\n case 8:\r\n if (memoryOffset & 7)\r\n memoryOffset = (memoryOffset | 7) + 1;\r\n break;\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n }\r\n break;\r\n case ElementKind.FUNCTION_PROTOTYPE:// instance methods remain partially resolved prototypes until compiled\r\n if (!instance.members)\r\n instance.members = new Map();\r\n var methodPrototype = member.resolvePartial(typeArguments); // reports\r\n if (methodPrototype) {\r\n instance.members.set(member.simpleName, methodPrototype);\r\n }\r\n break;\r\n case ElementKind.PROPERTY:// instance properties are cloned with partially resolved getters and setters\r\n if (!instance.members)\r\n instance.members = new Map();\r\n assert(member.getterPrototype);\r\n var instanceProperty = new Property(this.program, member.simpleName, member.internalName, this);\r\n instanceProperty.getterPrototype = (member.getterPrototype.resolvePartial(typeArguments));\r\n if (member.setterPrototype) {\r\n instanceProperty.setterPrototype = (member.setterPrototype.resolvePartial(typeArguments));\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n default:\r\n throw new Error(\"instance member expected\");\r\n }\r\n }\r\n }\r\n catch (e_6_1) { e_6 = { error: e_6_1 }; }\r\n finally {\r\n try {\r\n if (_g && !_g.done && (_h = _f.return)) _h.call(_f);\r\n }\r\n finally { if (e_6) throw e_6.error; }\r\n }\r\n }\r\n instance.currentMemoryOffset = memoryOffset; // sizeof() is its byte size in memory\r\n return instance;\r\n var e_4, _b, e_5, _e, e_6, _h;\r\n };\r\n ClassPrototype.prototype.resolveInclTypeArguments = function (typeArgumentNodes, contextualTypeArguments, alternativeReportNode) {\r\n var resolvedTypeArguments = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(this.declaration.typeParameters, typeArgumentNodes, contextualTypeArguments, alternativeReportNode);\r\n if (!resolvedTypeArguments)\r\n return null;\r\n }\r\n else {\r\n assert(typeArgumentNodes == null || !typeArgumentNodes.length);\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n };\r\n ClassPrototype.prototype.toString = function () {\r\n return this.simpleName;\r\n };\r\n return ClassPrototype;\r\n}(Element));\r\nexports.ClassPrototype = ClassPrototype;\r\n/** A resolved class. */\r\nvar Class = /** @class */ (function (_super) {\r\n __extends(Class, _super);\r\n /** Constructs a new class. */\r\n function Class(prototype, internalName, typeArguments, base) {\r\n if (typeArguments === void 0) { typeArguments = null; }\r\n if (base === void 0) { base = null; }\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.CLASS;\r\n /** Contextual type arguments for fields and methods. */\r\n _this.contextualTypeArguments = null;\r\n /** Current member memory offset. */\r\n _this.currentMemoryOffset = 0;\r\n /** Constructor instance. */\r\n _this.constructorInstance = null;\r\n _this.prototype = prototype;\r\n _this.flags = prototype.flags;\r\n _this.typeArguments = typeArguments;\r\n _this.type = prototype.program.options.usizeType.asClass(_this);\r\n _this.base = base;\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n if (base.contextualTypeArguments) {\r\n if (!_this.contextualTypeArguments)\r\n _this.contextualTypeArguments = new Map();\r\n try {\r\n for (var _a = __values(base.contextualTypeArguments), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var _c = __read(_b.value, 2), baseName = _c[0], baseType = _c[1];\r\n _this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n catch (e_7_1) { e_7 = { error: e_7_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_d = _a.return)) _d.call(_a);\r\n }\r\n finally { if (e_7) throw e_7.error; }\r\n }\r\n }\r\n }\r\n // apply instance-specific contextual type arguments\r\n var declaration = _this.prototype.declaration;\r\n var i, k;\r\n if (declaration) {\r\n var typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!_this.contextualTypeArguments)\r\n _this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n _this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n }\r\n else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n return _this;\r\n var e_7, _d;\r\n }\r\n Class.prototype.toString = function () {\r\n return this.prototype.simpleName;\r\n };\r\n return Class;\r\n}(Element));\r\nexports.Class = Class;\r\n/** A yet unresolved interface. */\r\nvar InterfacePrototype = /** @class */ (function (_super) {\r\n __extends(InterfacePrototype, _super);\r\n /** Constructs a new interface prototype. */\r\n function InterfacePrototype(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName, declaration) || this;\r\n _this.kind = ElementKind.INTERFACE_PROTOTYPE;\r\n return _this;\r\n }\r\n return InterfacePrototype;\r\n}(ClassPrototype));\r\nexports.InterfacePrototype = InterfacePrototype;\r\n/** A resolved interface. */\r\nvar Interface = /** @class */ (function (_super) {\r\n __extends(Interface, _super);\r\n /** Constructs a new interface. */\r\n function Interface(prototype, internalName, typeArguments, base) {\r\n if (typeArguments === void 0) { typeArguments = []; }\r\n if (base === void 0) { base = null; }\r\n var _this = _super.call(this, prototype, internalName, typeArguments, base) || this;\r\n _this.kind = ElementKind.INTERFACE;\r\n return _this;\r\n }\r\n return Interface;\r\n}(Class));\r\nexports.Interface = Interface;\r\n/** Control flow flags indicating specific conditions. */\r\nvar FlowFlags;\r\n(function (FlowFlags) {\r\n /** No specific conditions. */\r\n FlowFlags[FlowFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** This branch always returns. */\r\n FlowFlags[FlowFlags[\"RETURNS\"] = 1] = \"RETURNS\";\r\n /** This branch possibly throws. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_THROWS\"] = 2] = \"POSSIBLY_THROWS\";\r\n /** This branch possible breaks. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_BREAKS\"] = 4] = \"POSSIBLY_BREAKS\";\r\n /** This branch possible continues. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_CONTINUES\"] = 8] = \"POSSIBLY_CONTINUES\";\r\n})(FlowFlags = exports.FlowFlags || (exports.FlowFlags = {}));\r\n/** A control flow evaluator. */\r\nvar Flow = /** @class */ (function () {\r\n function Flow() {\r\n /** Scoped local variables. */\r\n this.scopedLocals = null;\r\n }\r\n /** Creates the parent flow of the specified function. */\r\n Flow.create = function (currentFunction) {\r\n var parentFlow = new Flow();\r\n parentFlow.parent = null;\r\n parentFlow.flags = 0 /* NONE */;\r\n parentFlow.currentFunction = currentFunction;\r\n parentFlow.continueLabel = null;\r\n parentFlow.breakLabel = null;\r\n return parentFlow;\r\n };\r\n /** Tests if this flow has the specified flag or flags. */\r\n Flow.prototype.is = function (flag) { return (this.flags & flag) == flag; };\r\n /** Sets the specified flag or flags. */\r\n Flow.prototype.set = function (flag) { this.flags |= flag; };\r\n /** Enters a new branch or scope and returns the new flow. */\r\n Flow.prototype.enterBranchOrScope = function () {\r\n var branchFlow = new Flow();\r\n branchFlow.parent = this;\r\n branchFlow.flags = this.flags;\r\n branchFlow.currentFunction = this.currentFunction;\r\n branchFlow.continueLabel = this.continueLabel;\r\n branchFlow.breakLabel = this.breakLabel;\r\n return branchFlow;\r\n };\r\n /** Leaves the current branch or scope and returns the parent flow. */\r\n Flow.prototype.leaveBranchOrScope = function () {\r\n var parent = assert(this.parent);\r\n // Free block-scoped locals\r\n if (this.scopedLocals) {\r\n try {\r\n for (var _a = __values(this.scopedLocals.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var scopedLocal = _b.value;\r\n this.currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n catch (e_8_1) { e_8 = { error: e_8_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_8) throw e_8.error; }\r\n }\r\n this.scopedLocals = null;\r\n }\r\n // Propagate flags to parent\r\n if (this.is(2 /* POSSIBLY_THROWS */)) {\r\n parent.set(2 /* POSSIBLY_THROWS */);\r\n }\r\n if (this.is(4 /* POSSIBLY_BREAKS */) && parent.breakLabel == this.breakLabel) {\r\n parent.set(4 /* POSSIBLY_BREAKS */);\r\n }\r\n if (this.is(8 /* POSSIBLY_CONTINUES */) && parent.continueLabel == this.continueLabel) {\r\n parent.set(8 /* POSSIBLY_CONTINUES */);\r\n }\r\n return parent;\r\n var e_8, _c;\r\n };\r\n /** Adds a new scoped local of the specified name. */\r\n Flow.prototype.addScopedLocal = function (name, type, reportNode) {\r\n var scopedLocal = this.currentFunction.getTempLocal(type);\r\n if (!this.scopedLocals)\r\n this.scopedLocals = new Map();\r\n else if (this.scopedLocals.has(name)) {\r\n this.currentFunction.program.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, reportNode.range);\r\n return;\r\n }\r\n this.scopedLocals.set(name, scopedLocal);\r\n };\r\n /** Gets the local of the specified name in the current scope. */\r\n Flow.prototype.getScopedLocal = function (name) {\r\n var local;\r\n var current = this;\r\n do {\r\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n return local;\r\n }\r\n } while (current = current.parent);\r\n return this.currentFunction.locals.get(name);\r\n };\r\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n Flow.prototype.finalize = function () {\r\n assert(this.parent == null, \"must be the topmost parent flow\");\r\n this.continueLabel = null;\r\n this.breakLabel = null;\r\n return this.is(1 /* RETURNS */);\r\n };\r\n return Flow;\r\n}());\r\nexports.Flow = Flow;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __values = (this && this.__values) || function (o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar builtins_1 = __webpack_require__(16);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar module_1 = __webpack_require__(0);\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nvar ast_1 = __webpack_require__(6);\r\nvar types_1 = __webpack_require__(5);\r\n/** Compilation target. */\r\nvar Target;\r\n(function (Target) {\r\n /** WebAssembly with 32-bit pointers. */\r\n Target[Target[\"WASM32\"] = 0] = \"WASM32\";\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n Target[Target[\"WASM64\"] = 1] = \"WASM64\";\r\n})(Target = exports.Target || (exports.Target = {}));\r\n/** Compiler options. */\r\nvar Options = /** @class */ (function () {\r\n function Options() {\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n this.target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n this.noTreeShaking = false;\r\n /** If true, replaces assertions with nops. */\r\n this.noAssert = false;\r\n /** If true, does not set up a memory. */\r\n this.noMemory = false;\r\n /** Static memory start offset. */\r\n this.memoryBase = 0;\r\n /** Memory allocation implementation to use. */\r\n this.allocateImpl = \"allocate_memory\";\r\n /** Memory freeing implementation to use. */\r\n this.freeImpl = \"free_memory\";\r\n /** If true, generates information necessary for source maps. */\r\n this.sourceMap = false;\r\n }\r\n Object.defineProperty(Options.prototype, \"isWasm64\", {\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get: function () {\r\n return this.target == Target.WASM64;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"usizeType\", {\r\n /** Gets the unsigned size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"isizeType\", {\r\n /** Gets the signed size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? types_1.Type.isize64 : types_1.Type.isize32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"nativeSizeType\", {\r\n /** Gets the native size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Options;\r\n}());\r\nexports.Options = Options;\r\n/** Indicates the desired kind of a conversion. */\r\nvar ConversionKind;\r\n(function (ConversionKind) {\r\n /** No conversion. */\r\n ConversionKind[ConversionKind[\"NONE\"] = 0] = \"NONE\";\r\n /** Implicit conversion. */\r\n ConversionKind[ConversionKind[\"IMPLICIT\"] = 1] = \"IMPLICIT\";\r\n /** Explicit conversion. */\r\n ConversionKind[ConversionKind[\"EXPLICIT\"] = 2] = \"EXPLICIT\";\r\n})(ConversionKind = exports.ConversionKind || (exports.ConversionKind = {}));\r\n/** Compiler interface. */\r\nvar Compiler = /** @class */ (function (_super) {\r\n __extends(Compiler, _super);\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n function Compiler(program, options) {\r\n if (options === void 0) { options = null; }\r\n var _this = _super.call(this, program.diagnostics) || this;\r\n /** Start function statements. */\r\n _this.startFunctionBody = new Array();\r\n /** Current enum in compilation. */\r\n _this.currentEnum = null;\r\n /** Current type in compilation. */\r\n _this.currentType = types_1.Type.void;\r\n /** Memory segments being compiled. */\r\n _this.memorySegments = new Array();\r\n /** Map of already compiled static string segments. */\r\n _this.stringSegments = new Map();\r\n /** Already processed file names. */\r\n _this.files = new Set();\r\n _this.program = program;\r\n _this.options = options ? options : new Options();\r\n _this.memoryOffset = i64_new(max(_this.options.memoryBase, _this.options.usizeType.byteSize) // leave space for `null`\r\n );\r\n _this.module = module_1.Module.create();\r\n return _this;\r\n }\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n Compiler.compile = function (program, options) {\r\n if (options === void 0) { options = null; }\r\n return new Compiler(program, options).compile();\r\n };\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n Compiler.prototype.compile = function () {\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n this.program.initialize(this.options);\r\n // set up the start function wrapping top-level statements, of all files.\r\n var startFunctionPrototype = assert(this.program.elements.get(\"start\"));\r\n assert(startFunctionPrototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE);\r\n var startFunctionInstance = new program_1.Function(startFunctionPrototype, startFunctionPrototype.internalName, null, // not generic\r\n null, // no parameters\r\n types_1.Type.void);\r\n startFunctionInstance.set(program_1.ElementFlags.START);\r\n this.currentFunction = this.startFunction = startFunctionInstance;\r\n var sources = this.program.sources;\r\n // compile entry file(s) while traversing to reachable elements\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) {\r\n this.compileSource(sources[i]);\r\n }\r\n }\r\n // compile the start function if not empty\r\n if (this.startFunctionBody.length) {\r\n var typeRef = this.module.getFunctionTypeBySignature(module_1.NativeType.None, []);\r\n if (!typeRef)\r\n typeRef = this.module.addFunctionType(\"v\", module_1.NativeType.None, []);\r\n var ref;\r\n this.module.setStart(ref = this.module.addFunction(this.startFunction.prototype.internalName, typeRef, types_1.typesToNativeTypes(this.startFunction.additionalLocals), this.module.createBlock(null, this.startFunctionBody)));\r\n this.startFunction.finalize(this.module, ref);\r\n }\r\n // set up static memory segments and the heap base pointer\r\n if (!this.options.noMemory) {\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, this.options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n if (this.options.isWasm64) {\r\n this.module.addGlobal(\"HEAP_BASE\", module_1.NativeType.I64, false, this.module.createI64(i64_low(memoryOffset), i64_high(memoryOffset)));\r\n }\r\n else {\r\n this.module.addGlobal(\"HEAP_BASE\", module_1.NativeType.I32, false, this.module.createI32(i64_low(memoryOffset)));\r\n }\r\n // determine initial page size\r\n var pages = i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0));\r\n this.module.setMemory(i64_low(pages), module_1.Module.MAX_MEMORY_WASM32 /* TODO: not WASM64 compatible yet */, this.memorySegments, this.options.target, \"memory\");\r\n }\r\n return this.module;\r\n };\r\n // sources\r\n Compiler.prototype.compileSourceByPath = function (normalizedPathWithoutExtension, reportNode) {\r\n var sources = this.program.sources;\r\n var source;\r\n var expected = normalizedPathWithoutExtension + \".ts\";\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n expected = normalizedPathWithoutExtension + \"/index.ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n expected = program_1.LIBRARY_PREFIX + normalizedPathWithoutExtension + \".ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.File_0_not_found, reportNode.range, normalizedPathWithoutExtension);\r\n };\r\n Compiler.prototype.compileSource = function (source) {\r\n var files = this.files;\r\n if (files.has(source.normalizedPath))\r\n return;\r\n files.add(source.normalizedPath);\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (var i = 0, k = statements.length; i < k; ++i) {\r\n var statement = statements[i];\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n if ((noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) &&\r\n !statement.typeParameters.length) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n if (noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n if ((noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) &&\r\n !statement.typeParameters.length) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.IMPORT:\r\n this.compileSourceByPath(statement.normalizedPath, statement.path);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n if (noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n case ast_1.NodeKind.VARIABLE:// global, always compiled as initializers might have side effects\r\n var variableInit = this.compileVariableStatement(statement);\r\n if (variableInit)\r\n startFunctionBody.push(variableInit);\r\n break;\r\n case ast_1.NodeKind.EXPORT:\r\n if (statement.normalizedPath != null) {\r\n this.compileSourceByPath(statement.normalizedPath, statement.path);\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n // otherwise a top-level statement that is part of the start function's body\r\n default:\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = this.startFunction;\r\n var expr = this.compileStatement(statement);\r\n this.startFunctionBody.push(expr);\r\n this.currentFunction = previousFunction;\r\n break;\r\n }\r\n }\r\n };\r\n // globals\r\n Compiler.prototype.compileGlobalDeclaration = function (declaration) {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.GLOBAL) {\r\n throw new Error(\"global expected\");\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return null;\r\n }\r\n return element;\r\n };\r\n Compiler.prototype.compileGlobal = function (global) {\r\n if (global.is(program_1.ElementFlags.COMPILED) || global.is(program_1.ElementFlags.BUILTIN)) {\r\n return true;\r\n }\r\n var declaration = global.declaration;\r\n var initExpr = 0;\r\n if (global.type == types_1.Type.void) {\r\n if (declaration.type) {\r\n var resolvedType = this.program.resolveType(declaration.type); // reports\r\n if (!resolvedType)\r\n return false;\r\n if (resolvedType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.type.range, \"*\", resolvedType.toString());\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n }\r\n else if (declaration.initializer) {\r\n initExpr = this.compileExpression(// reports\r\n declaration.initializer, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.initializer.range, this.currentType.toString(), \"\");\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, declaration.name.range.atEnd);\r\n return false;\r\n }\r\n }\r\n var nativeType = global.type.toNativeType();\r\n if (global.is(program_1.ElementFlags.DECLARED)) {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n this.module.addGlobalImport(global.internalName, global.namespace\r\n ? global.namespace.simpleName\r\n : \"env\", global.simpleName, nativeType);\r\n global.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, declaration.range);\r\n }\r\n return false;\r\n }\r\n var initializeInStart = false;\r\n if (global.is(program_1.ElementFlags.INLINED)) {\r\n initExpr = this.compileInlineConstant(global, global.type);\r\n }\r\n else {\r\n if (declaration.initializer) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(declaration.initializer, global.type);\r\n }\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, declaration.range);\r\n initializeInStart = true;\r\n }\r\n }\r\n else {\r\n initializeInStart = true;\r\n }\r\n }\r\n }\r\n else {\r\n initExpr = global.type.toNativeZero(this.module);\r\n }\r\n }\r\n var internalName = global.internalName;\r\n if (initializeInStart) {\r\n this.module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(this.module));\r\n var setExpr = this.module.createSetGlobal(internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n }\r\n else {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n var exprType = _BinaryenExpressionGetType(initExpr);\r\n switch (exprType) {\r\n case module_1.NativeType.I32:\r\n global.constantValueKind = 1 /* INTEGER */;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI32(initExpr), 0);\r\n break;\r\n case module_1.NativeType.I64:\r\n global.constantValueKind = 1 /* INTEGER */;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI64Low(initExpr), _BinaryenConstGetValueI64High(initExpr));\r\n break;\r\n case module_1.NativeType.F32:\r\n global.constantValueKind = 2 /* FLOAT */;\r\n global.constantFloatValue = _BinaryenConstGetValueF32(initExpr);\r\n break;\r\n case module_1.NativeType.F64:\r\n global.constantValueKind = 2 /* FLOAT */;\r\n global.constantFloatValue = _BinaryenConstGetValueF64(initExpr);\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n global.set(program_1.ElementFlags.INLINED);\r\n if (declaration.isTopLevel) {\r\n this.module.addGlobal(internalName, nativeType, !global.is(program_1.ElementFlags.CONSTANT), initExpr);\r\n }\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addGlobalExport(global.internalName, declaration.programLevelInternalName);\r\n }\r\n }\r\n else {\r\n this.module.addGlobal(internalName, nativeType, !global.is(program_1.ElementFlags.CONSTANT), initExpr);\r\n }\r\n }\r\n global.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n };\r\n // enums\r\n Compiler.prototype.compileEnumDeclaration = function (declaration) {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.ENUM)\r\n throw new Error(\"enum expected\");\r\n return this.compileEnum(element) ? element : null;\r\n };\r\n Compiler.prototype.compileEnum = function (element) {\r\n if (element.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n // members might reference each other, triggering another compile\r\n element.set(program_1.ElementFlags.COMPILED);\r\n this.currentEnum = element;\r\n var previousValue = null;\r\n if (element.members) {\r\n try {\r\n for (var _a = __values(element.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var member = _b.value;\r\n if (member.kind != program_1.ElementKind.ENUMVALUE)\r\n continue; // happens if an enum is also a namespace\r\n var initInStart = false;\r\n var val = member;\r\n var valueDeclaration = val.declaration;\r\n val.set(program_1.ElementFlags.COMPILED);\r\n if (val.is(program_1.ElementFlags.INLINED)) {\r\n if (element.declaration.isTopLevelExport) {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, false, // constant\r\n this.module.createI32(val.constantValue));\r\n }\r\n }\r\n else {\r\n var initExpr;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(valueDeclaration.value, types_1.Type.i32);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, valueDeclaration.range);\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n }\r\n else if (previousValue == null) {\r\n initExpr = this.module.createI32(0);\r\n }\r\n else if (previousValue.is(program_1.ElementFlags.INLINED)) {\r\n initExpr = this.module.createI32(previousValue.constantValue + 1);\r\n }\r\n else {\r\n // in TypeScript this errors with TS1061, but actually we can do:\r\n initExpr = this.module.createBinary(module_1.BinaryOp.AddI32, this.module.createGetGlobal(previousValue.internalName, module_1.NativeType.I32), this.module.createI32(1));\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, valueDeclaration.range);\r\n }\r\n initInStart = true;\r\n }\r\n if (initInStart) {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, true, // mutable\r\n this.module.createI32(0));\r\n var setExpr = this.module.createSetGlobal(val.internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n }\r\n else {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, false, initExpr);\r\n if (_BinaryenExpressionGetType(initExpr) == module_1.NativeType.I32) {\r\n val.constantValue = _BinaryenConstGetValueI32(initExpr);\r\n val.set(program_1.ElementFlags.INLINED);\r\n }\r\n else {\r\n throw new Error(\"i32 expected\");\r\n }\r\n }\r\n }\r\n previousValue = val;\r\n // export values if the enum is exported\r\n if (element.declaration.range.source.isEntry && element.declaration.isTopLevelExport) {\r\n if (member.is(program_1.ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(member.internalName, member.internalName);\r\n }\r\n else if (valueDeclaration) {\r\n this.warning(diagnostics_1.DiagnosticCode.Cannot_export_a_mutable_global, valueDeclaration.range);\r\n }\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n var e_1, _c;\r\n };\r\n // functions\r\n Compiler.prototype.compileFunctionDeclaration = function (declaration, typeArguments, contextualTypeArguments) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n throw new Error(\"function expected\");\r\n }\r\n return this.compileFunctionUsingTypeArguments(// reports\r\n element, typeArguments, contextualTypeArguments, element.declaration.name);\r\n };\r\n Compiler.prototype.compileFunctionUsingTypeArguments = function (prototype, typeArguments, contextualTypeArguments, reportNode) {\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n typeArguments, contextualTypeArguments, reportNode);\r\n if (!instance)\r\n return null;\r\n return this.compileFunction(instance) ? instance : null;\r\n };\r\n Compiler.prototype.compileFunction = function (instance) {\r\n if (instance.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n assert(!instance.is(program_1.ElementFlags.BUILTIN) || instance.simpleName == \"abort\");\r\n var declaration = instance.prototype.declaration;\r\n if (instance.is(program_1.ElementFlags.DECLARED)) {\r\n if (declaration.statements) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, declaration.name.range);\r\n return false;\r\n }\r\n }\r\n else if (!declaration.statements) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, declaration.name.range);\r\n return false;\r\n }\r\n // might trigger compilation of other functions referring to this one\r\n instance.set(program_1.ElementFlags.COMPILED);\r\n // compile statements\r\n var stmts = null;\r\n if (!instance.is(program_1.ElementFlags.DECLARED)) {\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = instance;\r\n var statements = assert(declaration.statements, \"implementation expected\");\r\n stmts = this.compileStatements(statements);\r\n // make sure the top-level branch or all child branches return\r\n var allBranchesReturn = this.currentFunction.flow.finalize();\r\n if (instance.returnType != types_1.Type.void && !allBranchesReturn) {\r\n this.error(diagnostics_1.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value, assert(declaration.returnType, \"return type expected\").range);\r\n }\r\n this.currentFunction = previousFunction;\r\n }\r\n // create the function type\r\n var numParameters = instance.parameters ? instance.parameters.length : 0;\r\n var numParametersInclThis = instance.instanceMethodOf ? numParameters + 1 : numParameters;\r\n var paramIndex = 0;\r\n var nativeResultType = instance.returnType.toNativeType();\r\n var nativeParamTypes = new Array(numParametersInclThis);\r\n var signatureNameParts = new Array(numParametersInclThis + 1);\r\n if (instance.instanceMethodOf) {\r\n nativeParamTypes[paramIndex] = this.options.isWasm64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n signatureNameParts[paramIndex++] = instance.instanceMethodOf.type.toSignatureString();\r\n }\r\n if (instance.parameters) {\r\n for (var i = 0; i < numParameters; ++i) {\r\n nativeParamTypes[paramIndex] = instance.parameters[i].type.toNativeType();\r\n signatureNameParts[paramIndex++] = instance.parameters[i].type.toSignatureString();\r\n }\r\n }\r\n signatureNameParts[paramIndex] = instance.returnType.toSignatureString();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeResultType, nativeParamTypes);\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(signatureNameParts.join(\"\"), nativeResultType, nativeParamTypes);\r\n }\r\n // create the function\r\n var ref;\r\n if (instance.is(program_1.ElementFlags.DECLARED)) {\r\n ref = this.module.addFunctionImport(instance.internalName, instance.prototype.namespace\r\n ? instance.prototype.namespace.simpleName\r\n : \"env\", instance.simpleName, typeRef);\r\n }\r\n else {\r\n ref = this.module.addFunction(instance.internalName, typeRef, types_1.typesToNativeTypes(instance.additionalLocals), this.module.createBlock(null, stmts, module_1.NativeType.None));\r\n }\r\n // check module export\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addFunctionExport(instance.internalName, declaration.name.text);\r\n }\r\n instance.finalize(this.module, ref);\r\n return true;\r\n };\r\n // namespaces\r\n Compiler.prototype.compileNamespaceDeclaration = function (declaration) {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n switch (member.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n var variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit)\r\n this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n };\r\n Compiler.prototype.compileNamespace = function (ns) {\r\n if (!ns.members)\r\n return;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n try {\r\n for (var _a = __values(ns.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var element = _b.value;\r\n switch (element.kind) {\r\n case program_1.ElementKind.CLASS_PROTOTYPE:\r\n if ((noTreeShaking ||\r\n element.is(program_1.ElementFlags.EXPORTED)) && !element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n case program_1.ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if ((noTreeShaking || element.is(program_1.ElementFlags.EXPORTED)) && !element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileFunctionUsingTypeArguments(element, [], null, element.declaration.name);\r\n }\r\n break;\r\n case program_1.ElementKind.GLOBAL:\r\n this.compileGlobal(element);\r\n break;\r\n case program_1.ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n var e_2, _c;\r\n };\r\n // exports\r\n Compiler.prototype.compileExportStatement = function (statement) {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n var internalExportName = (statement.range.source.internalPath +\r\n program_1.PATH_DELIMITER +\r\n member.externalName.text);\r\n var element = this.program.exports.get(internalExportName);\r\n if (!element)\r\n continue; // reported in Program#initialize\r\n switch (element.kind) {\r\n case program_1.ElementKind.CLASS_PROTOTYPE:\r\n if (!element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n case program_1.ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (!element.is(program_1.ElementFlags.GENERIC) &&\r\n statement.range.source.isEntry) {\r\n var functionInstance = this.compileFunctionUsingTypeArguments(element, [], null, element.declaration.name);\r\n if (functionInstance) {\r\n var functionDeclaration = functionInstance.prototype.declaration;\r\n if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n this.module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n }\r\n }\r\n }\r\n break;\r\n case program_1.ElementKind.GLOBAL:\r\n if (this.compileGlobal(element) && statement.range.source.isEntry) {\r\n var globalDeclaration = element.declaration;\r\n if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(element.internalName, member.externalName.text);\r\n }\r\n else {\r\n this.warning(diagnostics_1.DiagnosticCode.Cannot_export_a_mutable_global, member.range);\r\n }\r\n }\r\n }\r\n break;\r\n case program_1.ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n };\r\n // classes\r\n Compiler.prototype.compileClassDeclaration = function (declaration, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.CLASS_PROTOTYPE) {\r\n throw new Error(\"class expected\");\r\n }\r\n this.compileClassUsingTypeArguments(element, typeArguments, contextualTypeArguments, alternativeReportNode);\r\n };\r\n Compiler.prototype.compileClassUsingTypeArguments = function (prototype, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n typeArguments, contextualTypeArguments, alternativeReportNode);\r\n if (!instance)\r\n return;\r\n this.compileClass(instance);\r\n };\r\n Compiler.prototype.compileClass = function (instance) {\r\n if (instance.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n instance.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n };\r\n Compiler.prototype.compileInterfaceDeclaration = function (declaration, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n throw new Error(\"not implemented\");\r\n };\r\n // memory\r\n /** Adds a static memory segment with the specified data. */\r\n Compiler.prototype.addMemorySegment = function (buffer, alignment) {\r\n if (alignment === void 0) { alignment = 8; }\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = module_1.MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n };\r\n // statements\r\n Compiler.prototype.compileStatement = function (statement) {\r\n var expr;\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.BLOCK:\r\n expr = this.compileBlockStatement(statement);\r\n break;\r\n case ast_1.NodeKind.BREAK:\r\n expr = this.compileBreakStatement(statement);\r\n break;\r\n case ast_1.NodeKind.CONTINUE:\r\n expr = this.compileContinueStatement(statement);\r\n break;\r\n case ast_1.NodeKind.DO:\r\n expr = this.compileDoStatement(statement);\r\n break;\r\n case ast_1.NodeKind.EMPTY:\r\n expr = this.compileEmptyStatement(statement);\r\n break;\r\n case ast_1.NodeKind.EXPRESSION:\r\n expr = this.compileExpressionStatement(statement);\r\n break;\r\n case ast_1.NodeKind.FOR:\r\n expr = this.compileForStatement(statement);\r\n break;\r\n case ast_1.NodeKind.IF:\r\n expr = this.compileIfStatement(statement);\r\n break;\r\n case ast_1.NodeKind.RETURN:\r\n expr = this.compileReturnStatement(statement);\r\n break;\r\n case ast_1.NodeKind.SWITCH:\r\n expr = this.compileSwitchStatement(statement);\r\n break;\r\n case ast_1.NodeKind.THROW:\r\n expr = this.compileThrowStatement(statement);\r\n break;\r\n case ast_1.NodeKind.TRY:\r\n expr = this.compileTryStatement(statement);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n var variableInit = this.compileVariableStatement(statement);\r\n expr = variableInit ? variableInit : this.module.createNop();\r\n break;\r\n case ast_1.NodeKind.WHILE:\r\n expr = this.compileWhileStatement(statement);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n if (this.currentFunction == this.startFunction) {\r\n return this.module.createNop();\r\n }\r\n // fall-through: must be top-level; function bodies are not guaranteed to be evaluated\r\n default:\r\n throw new Error(\"statement expected\");\r\n }\r\n this.addDebugLocation(expr, statement.range);\r\n return expr;\r\n };\r\n Compiler.prototype.compileStatements = function (statements) {\r\n var k = statements.length;\r\n var stmts = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n stmts[i] = this.compileStatement(statements[i]);\r\n }\r\n return stmts; // array of 0-es in noEmit-mode\r\n };\r\n Compiler.prototype.compileBlockStatement = function (statement) {\r\n var statements = statement.statements;\r\n // NOTE that we could optimize this to a NOP if empty or unwrap a single\r\n // statement, but that's not what the source told us to do and left to the\r\n // optimizer.\r\n // Not actually a branch, but can contain its own scoped variables.\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var stmt = this.module.createBlock(null, this.compileStatements(statements), module_1.NativeType.None);\r\n var stmtReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n if (stmtReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n }\r\n return stmt;\r\n };\r\n Compiler.prototype.compileBreakStatement = function (statement) {\r\n if (statement.label) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, statement.label.range);\r\n return this.module.createUnreachable();\r\n }\r\n var breakLabel = this.currentFunction.flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(diagnostics_1.DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement, statement.range);\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(4 /* POSSIBLY_BREAKS */);\r\n return this.module.createBreak(breakLabel);\r\n };\r\n Compiler.prototype.compileContinueStatement = function (statement) {\r\n if (statement.label) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, statement.label.range);\r\n return this.module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var continueLabel = this.currentFunction.flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(diagnostics_1.DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement, statement.range);\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(8 /* POSSIBLY_CONTINUES */);\r\n return this.module.createBreak(continueLabel);\r\n };\r\n Compiler.prototype.compileDoStatement = function (statement) {\r\n // A do statement does not initiate a new branch because it is executed at\r\n // least once, but has its own break and continue labels.\r\n var label = this.currentFunction.enterBreakContext();\r\n var previousBreakLabel = this.currentFunction.flow.breakLabel;\r\n var previousContinueLabel = this.currentFunction.flow.continueLabel;\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n var body = this.compileStatement(statement.statement);\r\n // Reset to the previous break and continue labels, if any.\r\n this.currentFunction.flow.breakLabel = previousBreakLabel;\r\n this.currentFunction.flow.continueLabel = previousContinueLabel;\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n this.currentFunction.leaveBreakContext();\r\n return this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel, condition)\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None);\r\n };\r\n Compiler.prototype.compileEmptyStatement = function (statement) {\r\n return this.module.createNop();\r\n };\r\n Compiler.prototype.compileExpressionStatement = function (statement) {\r\n var expr = this.compileExpression(statement.expression, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType != types_1.Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = types_1.Type.void;\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileForStatement = function (statement) {\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var context = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + context;\r\n // Compile in correct order\r\n var initializer = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : this.module.createNop();\r\n var condition = statement.condition\r\n ? this.compileExpression(statement.condition, types_1.Type.i32)\r\n : this.module.createI32(1);\r\n var incrementor = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, types_1.Type.void)\r\n : this.module.createNop();\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = !statement.condition && this.currentFunction.flow.is(1 /* RETURNS */);\r\n // TODO: check other always-true conditions as well, not just omitted\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n var expr = this.module.createBlock(breakLabel, [\r\n initializer,\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n incrementor,\r\n this.module.createBreak(continueLabel)\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None);\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileIfStatement = function (statement) {\r\n // The condition doesn't initiate a branch yet\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n // Each arm initiates a branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var ifTrue = this.compileStatement(statement.ifTrue);\r\n var ifTrueReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n var ifFalse = 0;\r\n var ifFalseReturns = false;\r\n if (statement.ifFalse) {\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n ifFalse = this.compileStatement(statement.ifFalse);\r\n ifFalseReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n }\r\n if (ifTrueReturns && ifFalseReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n }\r\n return this.module.createIf(condition, ifTrue, ifFalse);\r\n };\r\n Compiler.prototype.compileReturnStatement = function (statement) {\r\n var expression = 0;\r\n if (statement.value) {\r\n expression = this.compileExpression(statement.value, this.currentFunction.returnType);\r\n }\r\n // Remember that this flow returns\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n return this.module.createReturn(expression);\r\n };\r\n Compiler.prototype.compileSwitchStatement = function (statement) {\r\n // Everything within a switch uses the same break context\r\n var context = this.currentFunction.enterBreakContext();\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = this.currentFunction.getTempLocal(types_1.Type.i32);\r\n var k = statement.cases.length;\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + k);\r\n breaks[0] = this.module.createSetLocal(// initializer\r\n tempLocal.index, this.compileExpression(statement.condition, types_1.Type.i32));\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (var i = 0; i < k; ++i) {\r\n var case_ = statement.cases[i];\r\n if (case_.label) {\r\n breaks[breakIndex++] = this.module.createBreak(\"case\" + i.toString(10) + \"|\" + context, this.module.createBinary(module_1.BinaryOp.EqI32, this.module.createGetLocal(tempLocal.index, module_1.NativeType.I32), this.compileExpression(case_.label, types_1.Type.i32)));\r\n }\r\n else {\r\n defaultIndex = i;\r\n }\r\n }\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = this.module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\") + \"|\" + context);\r\n // nest blocks in order\r\n var currentBlock = this.module.createBlock(\"case0|\" + context, breaks, module_1.NativeType.None);\r\n var alwaysReturns = true;\r\n for (i = 0; i < k; ++i) {\r\n case_ = statement.cases[i];\r\n var l = case_.statements.length;\r\n var body = new Array(1 + l);\r\n body[0] = currentBlock;\r\n // Each switch case initiates a new branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var fallsThrough = i != k - 1;\r\n var nextLabel = !fallsThrough ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n for (var j = 0; j < l; ++j) {\r\n body[j + 1] = this.compileStatement(case_.statements[j]);\r\n }\r\n if (!(fallsThrough || this.currentFunction.flow.is(1 /* RETURNS */))) {\r\n alwaysReturns = false; // ignore fall-throughs\r\n }\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n currentBlock = this.module.createBlock(nextLabel, body, module_1.NativeType.None);\r\n }\r\n this.currentFunction.leaveBreakContext();\r\n // If the switch has a default and always returns, propagate that\r\n if (defaultIndex >= 0 && alwaysReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n // Binaryen understands that so we don't need a hint\r\n }\r\n return currentBlock;\r\n };\r\n Compiler.prototype.compileThrowStatement = function (statement) {\r\n // Remember that this branch possibly throws\r\n this.currentFunction.flow.set(2 /* POSSIBLY_THROWS */);\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n // TODO: requires exception-handling spec.\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileTryStatement = function (statement) {\r\n throw new Error(\"not implemented\");\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n };\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n Compiler.prototype.compileVariableStatement = function (statement, isKnownGlobal) {\r\n if (isKnownGlobal === void 0) { isKnownGlobal = false; }\r\n var declarations = statement.declarations;\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (this.currentFunction == this.startFunction &&\r\n statement.parent && statement.parent.kind == ast_1.NodeKind.SOURCE)) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n // other variables become locals\r\n var initializers = new Array();\r\n for (i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var name = declaration.name.text;\r\n var type = null;\r\n var init = 0;\r\n if (declaration.type) {\r\n type = this.program.resolveType(// reports\r\n declaration.type, this.currentFunction.contextualTypeArguments);\r\n if (!type)\r\n continue;\r\n if (declaration.initializer) {\r\n init = this.compileExpression(declaration.initializer, type); // reports\r\n }\r\n }\r\n else if (declaration.initializer) {\r\n init = this.compileExpression(// reports\r\n declaration.initializer, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.range, this.currentType.toString(), \"\");\r\n continue;\r\n }\r\n type = this.currentType;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, declaration.name.range.atEnd);\r\n continue;\r\n }\r\n if (ast_1.hasModifier(ast_1.ModifierKind.CONST, declaration.modifiers)) {\r\n if (init) {\r\n init = this.precomputeExpressionRef(init);\r\n if (_BinaryenExpressionGetId(init) == module_1.ExpressionId.Const) {\r\n var local = new program_1.Local(this.program, name, -1, type);\r\n switch (_BinaryenExpressionGetType(init)) {\r\n case module_1.NativeType.I32:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI32(init), 0);\r\n break;\r\n case module_1.NativeType.I64:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI64Low(init), _BinaryenConstGetValueI64High(init));\r\n break;\r\n case module_1.NativeType.F32:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF32(init));\r\n break;\r\n case module_1.NativeType.F64:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF64(init));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n var scopedLocals = this.currentFunction.flow.scopedLocals;\r\n if (!scopedLocals)\r\n scopedLocals = this.currentFunction.flow.scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, name);\r\n return 0;\r\n }\r\n scopedLocals.set(name, local);\r\n return 0;\r\n }\r\n else {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, declaration.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._const_declarations_must_be_initialized, declaration.range);\r\n }\r\n }\r\n if (ast_1.hasModifier(ast_1.ModifierKind.LET, declaration.modifiers)) {\r\n this.currentFunction.flow.addScopedLocal(name, type, declaration.name); // reports\r\n }\r\n else {\r\n this.currentFunction.addLocal(type, name); // reports\r\n }\r\n if (init) {\r\n initializers.push(this.compileAssignmentWithValue(declaration.name, init));\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, module_1.NativeType.None)\r\n : 0;\r\n };\r\n Compiler.prototype.compileWhileStatement = function (statement) {\r\n // The condition does not yet initialize a branch\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n // Statements initiate a new branch with its own break context\r\n var label = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = false && this.currentFunction.flow.is(1 /* RETURNS */);\r\n // TODO: evaluate possible always-true conditions\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n var expr = this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel, this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel)\r\n ], module_1.NativeType.None)))\r\n ], module_1.NativeType.None);\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n };\r\n // expressions\r\n /** Compiles an inlined constant value of a variable-like element. */\r\n Compiler.prototype.compileInlineConstant = function (element, contextualType) {\r\n assert(element.is(program_1.ElementFlags.INLINED));\r\n switch (element.type.is(4 /* INTEGER */) &&\r\n contextualType.is(4 /* INTEGER */) &&\r\n element.type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = element.type).kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n var shift = element.type.computeSmallIntegerShift(types_1.Type.i32);\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0);\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n var mask = element.type.computeSmallIntegerMask(types_1.Type.i32);\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0);\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue)\r\n : 0);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue)\r\n : 0);\r\n }\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return element.constantValueKind == 1 /* INTEGER */\r\n ? this.module.createI64(i64_low(element.constantIntegerValue), i64_high(element.constantIntegerValue))\r\n : this.module.createI64(0);\r\n case 11 /* F32 */:\r\n return this.module.createF32(element.constantFloatValue);\r\n case 12 /* F64 */:\r\n return this.module.createF64(element.constantFloatValue);\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n };\r\n Compiler.prototype.compileExpression = function (expression, contextualType, conversionKind, wrapSmallIntegers) {\r\n if (conversionKind === void 0) { conversionKind = 1 /* IMPLICIT */; }\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n this.currentType = contextualType;\r\n var expr;\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.ASSERTION:\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.BINARY:\r\n expr = this.compileBinaryExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n case ast_1.NodeKind.CALL:\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.COMMA:\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.ELEMENTACCESS:\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.IDENTIFIER:\r\n case ast_1.NodeKind.FALSE:\r\n case ast_1.NodeKind.NULL:\r\n case ast_1.NodeKind.THIS:\r\n case ast_1.NodeKind.TRUE:\r\n expr = this.compileIdentifierExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.LITERAL:\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.NEW:\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.PARENTHESIZED:\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.PROPERTYACCESS:\r\n expr = this.compilePropertyAccessExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.TERNARY:\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.UNARYPOSTFIX:\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.UNARYPREFIX:\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n default:\r\n throw new Error(\"expression expected\");\r\n }\r\n if (conversionKind != 0 /* NONE */ && this.currentType != contextualType) {\r\n expr = this.convertExpression(expr, this.currentType, contextualType, conversionKind, expression);\r\n this.currentType = contextualType;\r\n }\r\n this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n };\r\n Compiler.prototype.precomputeExpression = function (expression, contextualType, conversionKind) {\r\n if (conversionKind === void 0) { conversionKind = 1 /* IMPLICIT */; }\r\n return this.precomputeExpressionRef(this.compileExpression(expression, contextualType, conversionKind));\r\n };\r\n Compiler.prototype.precomputeExpressionRef = function (expr) {\r\n var nativeType = this.currentType.toNativeType();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeType, []);\r\n var typeRefAdded = false;\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(this.currentType.toSignatureString(), nativeType, []);\r\n typeRefAdded = true;\r\n }\r\n var funcRef = this.module.addFunction(\"__precompute\", typeRef, [], expr);\r\n this.module.runPasses([\"precompute\"], funcRef);\r\n var ret = _BinaryenFunctionGetBody(funcRef);\r\n this.module.removeFunction(\"__precompute\");\r\n if (typeRefAdded) {\r\n // TODO: also remove the function type somehow if no longer used or make the C-API accept\r\n // a `null` typeRef, using an implicit type.\r\n }\r\n return ret;\r\n };\r\n Compiler.prototype.convertExpression = function (expr, fromType, toType, conversionKind, reportNode) {\r\n if (conversionKind == 0 /* NONE */) {\r\n assert(false, \"concrete type expected\");\r\n return expr;\r\n }\r\n // void to any\r\n if (fromType.kind == 13 /* VOID */) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, reportNode.range, fromType.toString(), toType.toString());\r\n return this.module.createUnreachable();\r\n }\r\n // any to void\r\n if (toType.kind == 13 /* VOID */) {\r\n return this.module.createDrop(expr);\r\n }\r\n var mod = this.module;\r\n var losesInformation = false;\r\n if (fromType.is(8 /* FLOAT */)) {\r\n // float to float\r\n if (toType.is(8 /* FLOAT */)) {\r\n if (fromType.kind == 11 /* F32 */) {\r\n // f32 to f64\r\n if (toType.kind == 12 /* F64 */) {\r\n expr = mod.createUnary(module_1.UnaryOp.PromoteF32, expr);\r\n }\r\n // otherwise f32 to f32\r\n // f64 to f32\r\n }\r\n else if (toType.kind == 11 /* F32 */) {\r\n losesInformation = true;\r\n expr = mod.createUnary(module_1.UnaryOp.DemoteF64, expr);\r\n }\r\n // otherwise f64 to f64\r\n // float to int\r\n }\r\n else if (toType.is(4 /* INTEGER */)) {\r\n losesInformation = true;\r\n // f32 to int\r\n if (fromType.kind == 11 /* F32 */) {\r\n if (toType.is(1 /* SIGNED */)) {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToI64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToI32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n else {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToU64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToU32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n // f64 to int\r\n }\r\n else {\r\n if (toType.is(1 /* SIGNED */)) {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToI64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToI32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n else {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToU64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToU32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n }\r\n // float to void\r\n }\r\n else {\r\n assert(toType.flags == 0 /* NONE */, \"void type expected\");\r\n expr = this.module.createDrop(expr);\r\n }\r\n // int to float\r\n }\r\n else if (fromType.is(4 /* INTEGER */) && toType.is(8 /* FLOAT */)) {\r\n // int to f32\r\n if (toType.kind == 11 /* F32 */) {\r\n if (fromType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI64ToF32\r\n : module_1.UnaryOp.ConvertU64ToF32, expr);\r\n }\r\n else {\r\n losesInformation = !fromType.is(32 /* SMALL */);\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI32ToF32\r\n : module_1.UnaryOp.ConvertU32ToF32, expr);\r\n }\r\n // int to f64\r\n }\r\n else {\r\n if (fromType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI64ToF64\r\n : module_1.UnaryOp.ConvertU64ToF64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI32ToF64\r\n : module_1.UnaryOp.ConvertU32ToF64, expr);\r\n }\r\n }\r\n // int to int\r\n }\r\n else {\r\n if (fromType.is(64 /* LONG */)) {\r\n // i64 to i32\r\n if (!toType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(module_1.UnaryOp.WrapI64, expr); // discards upper bits\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n // i32 to i64\r\n }\r\n else if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(toType.is(1 /* SIGNED */) ? module_1.UnaryOp.ExtendI32 : module_1.UnaryOp.ExtendU32, expr);\r\n // i32 or smaller to even smaller or same size int with change of sign\r\n }\r\n else if (toType.is(32 /* SMALL */) &&\r\n (fromType.size > toType.size ||\r\n (fromType.size == toType.size &&\r\n fromType.is(1 /* SIGNED */) != toType.is(1 /* SIGNED */)))) {\r\n losesInformation = true;\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n // otherwise (smaller) i32/u32 to (same size) i32/u32\r\n }\r\n if (losesInformation && conversionKind == 1 /* IMPLICIT */) {\r\n this.error(diagnostics_1.DiagnosticCode.Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast, reportNode.range, fromType.toString(), toType.toString());\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileAssertionExpression = function (expression, contextualType) {\r\n var toType = this.program.resolveType(// reports\r\n expression.toType, this.currentFunction.contextualTypeArguments);\r\n if (!toType)\r\n return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, 2 /* EXPLICIT */);\r\n };\r\n Compiler.prototype.compileBinaryExpression = function (expression, contextualType, wrapSmallIntegers) {\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n var left;\r\n var right;\r\n var condition;\r\n var expr;\r\n var compound = false;\r\n var possiblyOverflows = false;\r\n var tempLocal = null;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.LESSTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtI64, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LtI64\r\n : module_1.BinaryOp.LtI32, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LtU64\r\n : module_1.BinaryOp.LtU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GtU64\r\n : module_1.BinaryOp.GtU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.LESSTHAN_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LeI64\r\n : module_1.BinaryOp.LeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LeU64\r\n : module_1.BinaryOp.LeU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GeI64\r\n : module_1.BinaryOp.GeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GeU64\r\n : module_1.BinaryOp.GeU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EQUALS_EQUALS_EQUALS:\r\n // TODO?\r\n case tokenizer_1.Token.EQUALS_EQUALS:\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.EqI64\r\n : module_1.BinaryOp.EqI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS_EQUALS:\r\n // TODO?\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.NeI64\r\n : module_1.BinaryOp.NeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EQUALS:\r\n return this.compileAssignment(expression.left, expression.right, contextualType);\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.PLUS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF64, left, right);\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.MINUS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.ASTERISK:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n // fall-through\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.MulI64\r\n : module_1.BinaryOp.MulI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.SLASH:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // TODO: when can division remain unwrapped? does it overflow?\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.DivI64\r\n : module_1.BinaryOp.DivI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.DivU64\r\n : module_1.BinaryOp.DivU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.PERCENT:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // TODO: when can remainder remain unwrapped? may it overflow?\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.RemI64\r\n : module_1.BinaryOp.RemI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.RemU64\r\n : module_1.BinaryOp.RemU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n // TODO: internal fmod, possibly simply imported from JS\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n expr = this.module.createUnreachable();\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShlI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShlI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShlI64\r\n : module_1.BinaryOp.ShlI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, true // must wrap small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n default:\r\n // assumes signed shr on signed small integers does not overflow\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrI64, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrI64\r\n : module_1.BinaryOp.ShrI32, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n // assumes unsigned shr on unsigned small integers does not overflow\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrU64\r\n : module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType == types_1.Type.void\r\n ? types_1.Type.u64\r\n : contextualType, 0 /* NONE */, true // modifies low bits of small integers if unsigned\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n possiblyOverflows = true;\r\n // fall-through\r\n default:\r\n // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrU64\r\n : module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.AMPERSAND:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.AndI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AndI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AndI64\r\n : module_1.BinaryOp.AndI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.BAR:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.OrI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.OrI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.OrI64\r\n : module_1.BinaryOp.OrI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.CARET:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.XorI64\r\n : module_1.BinaryOp.XorI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n // logical (no overloading)\r\n case tokenizer_1.Token.AMPERSAND_AMPERSAND:// left && right\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false);\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */);\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(condition, // left\r\n right, // ? right\r\n expr // : cloned left\r\n );\r\n }\r\n else {\r\n expr = this.module.createIf(condition, right, this.module.createGetLocal(assert(tempLocal, \"tempLocal must be set\").index, this.currentType.toNativeType()));\r\n }\r\n break;\r\n case tokenizer_1.Token.BAR_BAR:// left || right\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false);\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */); // if right did\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(condition, // left\r\n expr, // ? cloned left\r\n right // : right\r\n );\r\n }\r\n else {\r\n expr = this.module.createIf(condition, this.module.createGetLocal(assert(tempLocal, \"tempLocal must be set\").index, this.currentType.toNativeType()), right);\r\n }\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"not implemented\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */), \"small integer type expected\");\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.left, expr, contextualType != types_1.Type.void)\r\n : expr;\r\n };\r\n Compiler.prototype.compileAssignment = function (expression, valueExpression, contextualType) {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n // to compile just the value, we need to know the target's type\r\n var element = resolved.element;\r\n var elementType;\r\n switch (element.kind) {\r\n case program_1.ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void, \"concrete type expected\");\r\n // fall-through\r\n case program_1.ElementKind.LOCAL:\r\n case program_1.ElementKind.FIELD:\r\n elementType = element.type;\r\n break;\r\n case program_1.ElementKind.PROPERTY:\r\n var setterPrototype = element.setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (!setterInstance)\r\n return this.module.createUnreachable();\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n elementType = setterInstance.parameters[0].type;\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == ast_1.NodeKind.ELEMENTACCESS) {\r\n assert(resolved.target &&\r\n resolved.target.kind == program_1.ElementKind.CLASS &&\r\n element.simpleName == resolved.target.prototype.fnIndexedGet);\r\n var resolvedIndexedSet = element.resolve(null);\r\n if (resolvedIndexedSet) {\r\n elementType = resolvedIndexedSet.returnType;\r\n break;\r\n }\r\n }\r\n // fall-through\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // now compile the value and do the assignment\r\n this.currentType = elementType;\r\n return this.compileAssignmentWithValue(expression, this.compileExpression(valueExpression, elementType), contextualType != types_1.Type.void);\r\n };\r\n Compiler.prototype.compileAssignmentWithValue = function (expression, valueWithCorrectType, tee) {\r\n if (tee === void 0) { tee = false; }\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n var tempLocal;\r\n var targetExpr;\r\n switch (element.kind) {\r\n case program_1.ElementKind.LOCAL:\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n return tee\r\n ? this.module.createTeeLocal(element.index, valueWithCorrectType)\r\n : this.module.createSetLocal(element.index, valueWithCorrectType);\r\n case program_1.ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void, \"concrete type expected\");\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n if (!tee) {\r\n return this.module.createSetGlobal(element.internalName, valueWithCorrectType);\r\n }\r\n var globalNativeType = element.type.toNativeType();\r\n return this.module.createBlock(null, [\r\n this.module.createSetGlobal(element.internalName, valueWithCorrectType),\r\n this.module.createGetGlobal(element.internalName, globalNativeType)\r\n ], globalNativeType);\r\n case program_1.ElementKind.FIELD:\r\n if (element.prototype.isReadonly) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n assert(resolved.targetExpression != null, \"target expression expected\");\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType, \"class type expected\");\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n var elementNativeType = element.type.toNativeType();\r\n if (!tee) {\r\n return this.module.createStore(element.type.size >> 3, targetExpr, valueWithCorrectType, elementNativeType, element.memoryOffset);\r\n }\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(element.type);\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, valueWithCorrectType),\r\n this.module.createStore(element.type.size >> 3, targetExpr, this.module.createGetLocal(tempLocal.index, elementNativeType), elementNativeType, element.memoryOffset),\r\n this.module.createGetLocal(tempLocal.index, elementNativeType)\r\n ], elementNativeType);\r\n case program_1.ElementKind.PROPERTY:\r\n var setterPrototype = element.setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (setterInstance) {\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n if (!tee) {\r\n if (setterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n this.currentType = types_1.Type.void;\r\n return this.makeCall(setterInstance, [targetExpr, valueWithCorrectType]);\r\n }\r\n else {\r\n this.currentType = types_1.Type.void;\r\n return this.makeCall(setterInstance, [valueWithCorrectType]);\r\n }\r\n }\r\n var getterPrototype = element.getterPrototype;\r\n assert(getterPrototype != null);\r\n var getterInstance = getterPrototype.resolve(); // reports\r\n if (getterInstance) {\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n if (setterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(getterInstance.returnType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [\r\n this.module.createTeeLocal(tempLocal.index, targetExpr), valueWithCorrectType\r\n ]),\r\n this.makeCall(getterInstance, [\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ])\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n else {\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [valueWithCorrectType]),\r\n this.makeCall(getterInstance)\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n }\r\n return this.module.createUnreachable();\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == ast_1.NodeKind.ELEMENTACCESS) {\r\n assert(resolved.target && resolved.target.kind == program_1.ElementKind.CLASS);\r\n var resolvedIndexedGet = element.resolve();\r\n if (!resolvedIndexedGet)\r\n return this.module.createUnreachable();\r\n var indexedSetName = resolved.target.prototype.fnIndexedSet;\r\n var indexedSet;\r\n if (indexedSetName != null &&\r\n resolved.target.members &&\r\n (indexedSet = resolved.target.members.get(indexedSetName)) &&\r\n indexedSet.kind == program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n var resolvedIndexedSet = indexedSet.resolve();\r\n if (!resolvedIndexedSet)\r\n return this.module.createUnreachable();\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n var elementExpr = this.compileExpression(expression.elementExpression, types_1.Type.i32);\r\n if (!tee) {\r\n this.currentType = resolvedIndexedSet.returnType;\r\n return this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n this.currentType = resolvedIndexedGet.returnType;\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n this.module.createTeeLocal(tempLocal.index, valueWithCorrectType)\r\n ]),\r\n // TODO: could be different from an actual __get (needs 2 temp locals)\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ], this.currentType.toNativeType());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Index_signature_in_type_0_only_permits_reading, expression.range, resolved.target.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileCallExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveExpression(expression.expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n if (element.kind != program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n var functionPrototype = element;\r\n var functionInstance = null;\r\n // TODO: generalize?\r\n if (functionPrototype.is(program_1.ElementFlags.BUILTIN)) {\r\n var resolvedTypeArguments = null;\r\n if (expression.typeArguments) {\r\n var k = expression.typeArguments.length;\r\n resolvedTypeArguments = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var resolvedType = this.program.resolveType(// reports\r\n expression.typeArguments[i], this.currentFunction.contextualTypeArguments, true);\r\n if (!resolvedType)\r\n return this.module.createUnreachable();\r\n resolvedTypeArguments[i] = resolvedType;\r\n }\r\n }\r\n var expr = builtins_1.compileCall(this, functionPrototype, resolvedTypeArguments, expression.arguments, contextualType, expression);\r\n if (!expr) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n // TODO: infer type arguments from parameter types if omitted\r\n functionInstance = functionPrototype.resolveInclTypeArguments(// reports\r\n expression.typeArguments, this.currentFunction.contextualTypeArguments, expression);\r\n if (!functionInstance)\r\n return this.module.createUnreachable();\r\n // TODO: generalize? (see above)\r\n /* if (functionInstance.is(ElementFlags.BUILTIN)) {\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n functionInstance.typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n } */\r\n var numArguments = expression.arguments.length;\r\n var numArgumentsInclThis = functionInstance.instanceMethodOf\r\n ? numArguments + 1\r\n : numArguments;\r\n var argumentIndex = 0;\r\n var args = new Array(numArgumentsInclThis);\r\n if (functionInstance.instanceMethodOf) {\r\n assert(resolved.targetExpression != null);\r\n args[argumentIndex++] = resolved.targetExpression;\r\n }\r\n for (i = 0; i < numArguments; ++i) {\r\n args[argumentIndex++] = expression.arguments[i];\r\n }\r\n return this.compileCall(functionInstance, args, expression);\r\n };\r\n /**\r\n * Compiles a call to a function. If an instance method, `this` is the first element in\r\n * `argumentExpressions` or can be specified explicitly as the last argument.\r\n */\r\n Compiler.prototype.compileCall = function (functionInstance, argumentExpressions, reportNode, thisArg) {\r\n if (thisArg === void 0) { thisArg = 0; }\r\n // validate and compile arguments\r\n var parameters = functionInstance.parameters;\r\n var numParameters = parameters ? parameters.length : 0;\r\n var numParametersInclThis = functionInstance.instanceMethodOf != null\r\n ? numParameters + 1\r\n : numParameters;\r\n var numArgumentsInclThis = argumentExpressions.length;\r\n var numArguments = functionInstance.instanceMethodOf != null\r\n ? numArgumentsInclThis - 1\r\n : numArgumentsInclThis;\r\n if (thisArg)\r\n numArgumentsInclThis++;\r\n if (numArgumentsInclThis > numParametersInclThis) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, numParameters.toString(10), numArguments.toString(10));\r\n return this.module.createUnreachable();\r\n }\r\n var operands = new Array(numParametersInclThis);\r\n var operandIndex = 0;\r\n var argumentIndex = 0;\r\n if (functionInstance.instanceMethodOf) {\r\n if (thisArg) {\r\n operands[operandIndex++] = thisArg;\r\n }\r\n else {\r\n operands[operandIndex++] = this.compileExpression(argumentExpressions[argumentIndex++], functionInstance.instanceMethodOf.type);\r\n }\r\n }\r\n if (parameters) {\r\n for (; operandIndex < numParametersInclThis; ++operandIndex) {\r\n // argument has been provided\r\n if (numArgumentsInclThis > operandIndex) {\r\n operands[operandIndex] = this.compileExpression(argumentExpressions[argumentIndex++], parameters[operandIndex + numParameters - numParametersInclThis].type);\r\n // argument has been omitted\r\n }\r\n else {\r\n var initializer = parameters[operandIndex + numParameters - numParametersInclThis].initializer;\r\n if (initializer) {\r\n operands[operandIndex] = this.compileExpression(initializer, parameters[operandIndex + numParameters - numParametersInclThis].type);\r\n // FIXME: here, the initializer is compiled in the caller's scope.\r\n // a solution could be to use a stub for each possible overload, calling the\r\n // full function with optional arguments being part of the stub's body.\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, (operandIndex + numParameters - numParametersInclThis).toString(10), numArguments.toString(10));\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n }\r\n this.currentType = functionInstance.returnType;\r\n return this.makeCall(functionInstance, operands);\r\n };\r\n /** Makes a call operation as is. */\r\n Compiler.prototype.makeCall = function (functionInstance, operands) {\r\n if (operands === void 0) { operands = null; }\r\n if (!(functionInstance.is(program_1.ElementFlags.COMPILED) || this.compileFunction(functionInstance))) {\r\n return this.module.createUnreachable();\r\n }\r\n // imported function\r\n if (functionInstance.is(program_1.ElementFlags.DECLARED)) {\r\n return this.module.createCallImport(functionInstance.internalName, operands, functionInstance.returnType.toNativeType());\r\n }\r\n // internal function\r\n return this.module.createCall(functionInstance.internalName, operands, functionInstance.returnType.toNativeType());\r\n };\r\n Compiler.prototype.compileCommaExpression = function (expression, contextualType) {\r\n var expressions = expression.expressions;\r\n var k = expressions.length;\r\n var exprs = new Array(k--);\r\n for (var i = 0; i < k; ++i) {\r\n exprs[i] = this.compileExpression(expressions[i], types_1.Type.void); // drop all\r\n }\r\n exprs[i] = this.compileExpression(expressions[i], contextualType); // except last\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n };\r\n Compiler.prototype.compileElementAccessExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveElementAccess(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n assert(resolved.element.kind == program_1.ElementKind.FUNCTION_PROTOTYPE &&\r\n resolved.target &&\r\n resolved.target.kind == program_1.ElementKind.CLASS);\r\n var instance = resolved.element.resolve(null, resolved.target.contextualTypeArguments);\r\n if (!instance)\r\n return this.module.createUnreachable();\r\n return this.compileCall(instance, [\r\n expression.expression,\r\n expression.elementExpression\r\n ], expression);\r\n };\r\n Compiler.prototype.compileIdentifierExpression = function (expression, contextualType) {\r\n // check special keywords first\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.NULL:\r\n if (this.options.isWasm64) {\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == 9 /* USIZE */);\r\n this.currentType = types_1.Type.usize64;\r\n }\r\n return this.module.createI64(0);\r\n }\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == 9 /* USIZE */);\r\n this.currentType = types_1.Type.usize32;\r\n }\r\n return this.module.createI32(0);\r\n case ast_1.NodeKind.TRUE:\r\n this.currentType = types_1.Type.bool;\r\n return this.module.createI32(1);\r\n case ast_1.NodeKind.FALSE:\r\n this.currentType = types_1.Type.bool;\r\n return this.module.createI32(0);\r\n case ast_1.NodeKind.THIS:\r\n if (this.currentFunction.instanceMethodOf) {\r\n this.currentType = this.currentFunction.instanceMethodOf.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._this_cannot_be_referenced_in_current_location, expression.range);\r\n this.currentType = this.options.isWasm64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n return this.module.createUnreachable();\r\n case ast_1.NodeKind.SUPER:\r\n if (this.currentFunction.instanceMethodOf && this.currentFunction.instanceMethodOf.base) {\r\n this.currentType = this.currentFunction.instanceMethodOf.base.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class, expression.range);\r\n this.currentType = this.options.isWasm64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n return this.module.createUnreachable();\r\n }\r\n // otherwise resolve\r\n var resolved = this.program.resolveIdentifier(// reports\r\n expression, this.currentFunction, this.currentEnum);\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n switch (element.kind) {\r\n case program_1.ElementKind.LOCAL:\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n assert(element.index >= 0);\r\n this.currentType = element.type;\r\n return this.module.createGetLocal(element.index, this.currentType.toNativeType());\r\n case program_1.ElementKind.GLOBAL:\r\n if (element.is(program_1.ElementFlags.BUILTIN)) {\r\n return builtins_1.compileGetConstant(this, element, expression);\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void);\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = element.type;\r\n return this.module.createGetGlobal(element.internalName, this.currentType.toNativeType());\r\n case program_1.ElementKind.ENUMVALUE:// here: if referenced from within the same enum\r\n if (!element.is(program_1.ElementFlags.COMPILED)) {\r\n this.error(diagnostics_1.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums, expression.range);\r\n this.currentType = types_1.Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = types_1.Type.i32;\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.module.createI32(element.constantValue);\r\n }\r\n return this.module.createGetGlobal(element.internalName, module_1.NativeType.I32);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileLiteralExpression = function (expression, contextualType, implicitNegate) {\r\n if (implicitNegate === void 0) { implicitNegate = false; }\r\n switch (expression.literalKind) {\r\n case 4 /* ARRAY */:\r\n assert(!implicitNegate);\r\n var classType = contextualType.classType;\r\n if (classType &&\r\n classType == this.program.elements.get(\"Array\") &&\r\n classType.typeArguments && classType.typeArguments.length == 1) {\r\n return this.compileStaticArray(classType.typeArguments[0], expression.elementExpressions);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n case 0 /* FLOAT */: {\r\n var floatValue = expression.value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == types_1.Type.f32) {\r\n return this.module.createF32(floatValue);\r\n }\r\n this.currentType = types_1.Type.f64;\r\n return this.module.createF64(floatValue);\r\n }\r\n case 1 /* INTEGER */:\r\n var intValue = expression.value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(i64_new(0), intValue);\r\n }\r\n switch (contextualType.kind) {\r\n // compile to contextualType if matching\r\n case 0 /* I8 */:\r\n if (i64_is_i8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 1 /* I16 */:\r\n if (i64_is_i16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 2 /* I32 */:\r\n if (i64_is_i32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 5 /* U8 */:\r\n if (i64_is_u8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 6 /* U16 */:\r\n if (i64_is_u16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 7 /* U32 */:\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 10 /* BOOL */:\r\n if (i64_is_bool(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 4 /* ISIZE */:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 9 /* USIZE */:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 11 /* F32 */:\r\n if (i64_is_f32(intValue)) {\r\n return this.module.createF32(i64_to_f32(intValue));\r\n }\r\n break;\r\n case 12 /* F64 */:\r\n if (i64_is_f64(intValue)) {\r\n return this.module.createF64(i64_to_f64(intValue));\r\n }\r\n break;\r\n case 13 /* VOID */:\r\n break;\r\n default:\r\n assert(false);\r\n break;\r\n }\r\n // otherwise compile to best fitting native type\r\n if (i64_is_i32(intValue)) {\r\n this.currentType = types_1.Type.i32;\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n else {\r\n this.currentType = types_1.Type.i64;\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n }\r\n case 2 /* STRING */:\r\n assert(!implicitNegate);\r\n return this.compileStaticString(expression.value);\r\n }\r\n throw new Error(\"not implemented\");\r\n };\r\n Compiler.prototype.compileStaticString = function (stringValue) {\r\n var stringSegment = this.stringSegments.get(stringValue);\r\n if (!stringSegment) {\r\n var stringLength = stringValue.length;\r\n var stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n stringBuffer[0] = stringLength & 0xff;\r\n stringBuffer[1] = (stringLength >>> 8) & 0xff;\r\n stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n for (var i = 0; i < stringLength; ++i) {\r\n stringBuffer[4 + i * 2] = stringValue.charCodeAt(i) & 0xff;\r\n stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n }\r\n stringSegment = this.addMemorySegment(stringBuffer, this.options.usizeType.byteSize);\r\n this.stringSegments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n this.currentType = this.options.usizeType;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n }\r\n assert(i64_is_i32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n };\r\n Compiler.prototype.compileStaticArray = function (elementType, expressions) {\r\n // compile as static if all element expressions are precomputable, otherwise\r\n // initialize in place.\r\n var isStatic = true;\r\n var size = expressions.length;\r\n var nativeType = elementType.toNativeType();\r\n var values;\r\n switch (nativeType) {\r\n case module_1.NativeType.I32:\r\n values = changetype(new Int32Array(size));\r\n break;\r\n case module_1.NativeType.I64:\r\n values = changetype(new Array(size));\r\n break;\r\n case module_1.NativeType.F32:\r\n values = changetype(new Float32Array(size));\r\n break;\r\n case module_1.NativeType.F64:\r\n values = changetype(new Float64Array(size));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n var exprs = new Array(size);\r\n var expr;\r\n for (var i = 0; i < size; ++i) {\r\n exprs[i] = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType)\r\n : elementType.toNativeZero(this.module);\r\n if (isStatic) {\r\n expr = this.precomputeExpressionRef(exprs[i]);\r\n if (_BinaryenExpressionGetId(expr) == module_1.ExpressionId.Const) {\r\n assert(_BinaryenExpressionGetType(expr) == nativeType);\r\n switch (nativeType) {\r\n case module_1.NativeType.I32:\r\n changetype(values)[i] = _BinaryenConstGetValueI32(expr);\r\n break;\r\n case module_1.NativeType.I64:\r\n changetype(values)[i] = i64_new(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr));\r\n break;\r\n case module_1.NativeType.F32:\r\n changetype(values)[i] = _BinaryenConstGetValueF32(expr);\r\n break;\r\n case module_1.NativeType.F64:\r\n changetype(values)[i] = _BinaryenConstGetValueF64(expr);\r\n break;\r\n default:\r\n assert(false); // checked above\r\n }\r\n }\r\n else {\r\n // TODO: emit a warning if declared 'const'\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n if (isStatic) {\r\n // TODO: convert to Uint8Array and create the segment\r\n }\r\n else {\r\n // TODO: initialize in place\r\n }\r\n // TODO: alternatively, static elements could go into data segments while\r\n // dynamic ones are initialized on top? any benefits? (doesn't seem so)\r\n throw new Error(\"not implemented\");\r\n };\r\n Compiler.prototype.compileNewExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveExpression(// reports\r\n expression.expression, this.currentFunction);\r\n if (resolved) {\r\n if (resolved.element.kind == program_1.ElementKind.CLASS_PROTOTYPE) {\r\n var prototype = resolved.element;\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n expression.typeArguments, null, expression);\r\n if (instance) {\r\n var thisExpr = builtins_1.compileAllocate(this, instance, expression);\r\n var initializers = new Array();\r\n // use a temp local for 'this'\r\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\r\n initializers.push(this.module.createSetLocal(tempLocal.index, thisExpr));\r\n // apply field initializers\r\n if (instance.members) {\r\n try {\r\n for (var _a = __values(instance.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var member = _b.value;\r\n if (member.kind == program_1.ElementKind.FIELD) {\r\n var field = member;\r\n var fieldDeclaration = field.prototype.declaration;\r\n if (field.is(program_1.ElementFlags.CONSTANT)) {\r\n assert(false); // there are no built-in fields currently\r\n }\r\n else if (fieldDeclaration && fieldDeclaration.initializer) {\r\n initializers.push(this.module.createStore(field.type.byteSize, this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType), this.compileExpression(fieldDeclaration.initializer, field.type), field.type.toNativeType(), field.memoryOffset));\r\n }\r\n }\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n }\r\n // apply constructor\r\n var constructorInstance = instance.constructorInstance;\r\n if (constructorInstance) {\r\n initializers.push(this.compileCall(constructorInstance, expression.arguments, expression, this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType)));\r\n }\r\n // return 'this'\r\n initializers.push(this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType));\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n thisExpr = this.module.createBlock(null, initializers, this.options.nativeSizeType);\r\n this.currentType = instance.type;\r\n return thisExpr;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature, expression.expression.range);\r\n }\r\n }\r\n return this.module.createUnreachable();\r\n var e_3, _c;\r\n };\r\n Compiler.prototype.compileParenthesizedExpression = function (expression, contextualType) {\r\n // does not change types, just order\r\n return this.compileExpression(expression.expression, contextualType, 0 /* NONE */);\r\n };\r\n Compiler.prototype.compilePropertyAccessExpression = function (propertyAccess, contextualType) {\r\n var resolved = this.program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n var targetExpr;\r\n switch (element.kind) {\r\n case program_1.ElementKind.GLOBAL:// static property\r\n if (element.is(program_1.ElementFlags.BUILTIN)) {\r\n return builtins_1.compileGetConstant(this, element, propertyAccess);\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void);\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = element.type;\r\n return this.module.createGetGlobal(element.internalName, this.currentType.toNativeType());\r\n case program_1.ElementKind.ENUMVALUE:// enum value\r\n if (!this.compileEnum(element.enum)) {\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = types_1.Type.i32;\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.module.createI32(element.constantValue);\r\n }\r\n return this.module.createGetGlobal(element.internalName, module_1.NativeType.I32);\r\n case program_1.ElementKind.FIELD:// instance field\r\n assert(resolved.target != null);\r\n assert(resolved.targetExpression != null);\r\n assert(element.memoryOffset >= 0);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.usizeType);\r\n this.currentType = element.type;\r\n return this.module.createLoad(element.type.size >> 3, element.type.is(1 /* SIGNED */ | 4 /* INTEGER */), targetExpr, element.type.toNativeType(), element.memoryOffset);\r\n case program_1.ElementKind.PROPERTY:// instance property (here: getter)\r\n var getter = element.getterPrototype;\r\n assert(getter != null);\r\n var getterInstance = getter.resolve(null); // reports\r\n if (!getterInstance)\r\n return this.module.createUnreachable();\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n this.currentType = getterInstance.returnType;\r\n if (getterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32);\r\n this.currentType = getterInstance.returnType;\r\n return this.makeCall(getterInstance, [targetExpr]);\r\n }\r\n else {\r\n return this.makeCall(getterInstance);\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, propertyAccess.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileTernaryExpression = function (expression, contextualType) {\r\n var condition = this.compileExpression(expression.condition, types_1.Type.i32);\r\n var ifThen = this.compileExpression(expression.ifThen, contextualType);\r\n var ifElse = this.compileExpression(expression.ifElse, contextualType);\r\n return this.module.createIf(condition, ifThen, ifElse);\r\n };\r\n Compiler.prototype.compileUnaryPostfixExpression = function (expression, contextualType) {\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n var op;\r\n var nativeType;\r\n var nativeOne;\r\n var possiblyOverflows = false;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n op = module_1.BinaryOp.AddI32;\r\n nativeType = module_1.NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n op = this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32;\r\n nativeType = this.options.isWasm64\r\n ? module_1.NativeType.I64\r\n : module_1.NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n op = module_1.BinaryOp.AddI64;\r\n nativeType = module_1.NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n case 11 /* F32 */:\r\n op = module_1.BinaryOp.AddF32;\r\n nativeType = module_1.NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n case 12 /* F64 */:\r\n op = module_1.BinaryOp.AddF64;\r\n nativeType = module_1.NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n op = module_1.BinaryOp.SubI32;\r\n nativeType = module_1.NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n op = this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32;\r\n nativeType = this.options.isWasm64\r\n ? module_1.NativeType.I64\r\n : module_1.NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n op = module_1.BinaryOp.SubI64;\r\n nativeType = module_1.NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n case 11 /* F32 */:\r\n op = module_1.BinaryOp.SubF32;\r\n nativeType = module_1.NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n case 12 /* F64 */:\r\n op = module_1.BinaryOp.SubF64;\r\n nativeType = module_1.NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"unary postfix operator expected\");\r\n }\r\n var setValue;\r\n var tempLocal = null;\r\n // simplify if dropped anyway\r\n if (contextualType == types_1.Type.void) {\r\n setValue = this.module.createBinary(op, getValue, nativeOne);\r\n // otherwise use a temp local for the intermediate value\r\n }\r\n else {\r\n tempLocal = this.currentFunction.getTempLocal(this.currentType);\r\n setValue = this.module.createBinary(op, this.module.createGetLocal(tempLocal.index, nativeType), nativeOne);\r\n }\r\n if (possiblyOverflows) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */));\r\n setValue = makeSmallIntegerWrap(setValue, this.currentType, this.module);\r\n }\r\n setValue = this.compileAssignmentWithValue(expression.operand, setValue, false);\r\n // ^ sets currentType = void\r\n if (contextualType == types_1.Type.void) {\r\n assert(!tempLocal);\r\n return setValue;\r\n }\r\n this.currentType = assert(tempLocal).type;\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, getValue),\r\n setValue,\r\n this.module.createGetLocal(tempLocal.index, nativeType)\r\n ], nativeType);\r\n };\r\n Compiler.prototype.compileUnaryPrefixExpression = function (expression, contextualType, wrapSmallIntegers) {\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n var possiblyOverflows = false;\r\n var compound = false;\r\n var expr;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.PLUS:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */); // if operand already did\r\n break;\r\n case tokenizer_1.Token.MINUS:\r\n if (expression.operand.kind == ast_1.NodeKind.LITERAL && (expression.operand.literalKind == 1 /* INTEGER */ ||\r\n expression.operand.literalKind == 0 /* FLOAT */)) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n this.addDebugLocation(expr, expression.range); // compileExpression normally does this\r\n }\r\n else {\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, this.module.createI32(0), expr);\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, this.currentType.toNativeZero(this.module), expr);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, this.module.createI64(0), expr);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createUnary(module_1.UnaryOp.NegF32, expr);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createUnary(module_1.UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n }\r\n break;\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n compound = true;\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32, expr, this.currentType.toNativeOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI64, expr, this.module.createI64(1));\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF32, expr, this.module.createF32(1));\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n compound = true;\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n // fall-through\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, expr, this.module.createI32(1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, expr, this.currentType.toNativeOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, expr, this.module.createI64(1));\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF32, expr, this.module.createF32(1));\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.EXCLAMATION:\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // must wrap small integers\r\n );\r\n expr = makeIsFalseish(expr, this.currentType, this.module);\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.TILDE:\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, contextualType == types_1.Type.void\r\n ? 0 /* NONE */\r\n : 1 /* IMPLICIT */, false // retains low bits of small integers\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI32, expr, this.module.createI32(-1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.XorI64\r\n : module_1.BinaryOp.XorI32, expr, this.currentType.toNativeNegOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI64, expr, this.module.createI64(-1, -1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.TYPEOF:\r\n // it might make sense to implement typeof in a way that a generic function can detect\r\n // whether its type argument is a class type or string. that could then be used, for\r\n // example, to generate hash codes for sets and maps, depending on the kind of type\r\n // parameter we have. ideally the comparison would not involve actual string comparison and\r\n // limit available operations to hard-coded string literals.\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"not implemented\");\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"unary operator expected\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */));\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != types_1.Type.void)\r\n : expr;\r\n };\r\n Compiler.prototype.addDebugLocation = function (expr, range) {\r\n if (this.options.sourceMap != null) {\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) {\r\n source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n }\r\n range.debugInfoRef = expr;\r\n if (!this.currentFunction.debugLocations)\r\n this.currentFunction.debugLocations = [];\r\n this.currentFunction.debugLocations.push(range);\r\n }\r\n };\r\n return Compiler;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Compiler = Compiler;\r\n// helpers\r\n/** Wraps a 32-bit integer expression so it evaluates to a valid value of the specified type. */\r\nfunction makeSmallIntegerWrap(expr, type, module) {\r\n switch (type.kind) {\r\n case 0 /* I8 */:\r\n expr = module.createBinary(module_1.BinaryOp.ShrI32, module.createBinary(module_1.BinaryOp.ShlI32, expr, module.createI32(24)), module.createI32(24));\r\n break;\r\n case 1 /* I16 */:\r\n expr = module.createBinary(module_1.BinaryOp.ShrI32, module.createBinary(module_1.BinaryOp.ShlI32, expr, module.createI32(16)), module.createI32(16));\r\n break;\r\n case 5 /* U8 */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0xff));\r\n break;\r\n case 6 /* U16 */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0xffff));\r\n break;\r\n case 10 /* BOOL */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0x1));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeSmallIntegerWrap = makeSmallIntegerWrap;\r\n/** Creates a comparison whether an expression is not 'true' in a broader sense. */\r\nfunction makeIsFalseish(expr, type, module) {\r\n switch (type.kind) {\r\n default:// any integer up to 32 bits\r\n expr = module.createUnary(module_1.UnaryOp.EqzI32, expr);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = module.createUnary(module_1.UnaryOp.EqzI64, expr);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: strings\r\n case 4 /* ISIZE */:\r\n expr = module.createUnary(type.size == 64 ? module_1.UnaryOp.EqzI64 : module_1.UnaryOp.EqzI32, expr);\r\n break;\r\n case 11 /* F32 */:\r\n expr = module.createBinary(module_1.BinaryOp.EqF32, expr, module.createF32(0));\r\n break;\r\n case 12 /* F64 */:\r\n expr = module.createBinary(module_1.BinaryOp.EqF64, expr, module.createF64(0));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeIsFalseish = makeIsFalseish;\r\n/** Creates a comparison whether an expression is 'true' in a broader sense. */\r\nfunction makeIsTrueish(expr, type, module) {\r\n switch (type.kind) {\r\n default:// any integer up to 32 bits\r\n expr = module.createBinary(module_1.BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeI64, expr, module.createI64(0));\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: strings\r\n case 4 /* ISIZE */:\r\n expr = type.size == 64\r\n ? module.createBinary(module_1.BinaryOp.NeI64, expr, module.createI64(0))\r\n : module.createBinary(module_1.BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n case 11 /* F32 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeF32, expr, module.createF32(0));\r\n break;\r\n case 12 /* F64 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeF64, expr, module.createF64(0));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeIsTrueish = makeIsTrueish;\r\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar module_1 = __webpack_require__(0);\r\n/** Indicates the kind of a type. */\r\nvar TypeKind;\r\n(function (TypeKind) {\r\n // signed integers\r\n TypeKind[TypeKind[\"I8\"] = 0] = \"I8\";\r\n TypeKind[TypeKind[\"I16\"] = 1] = \"I16\";\r\n TypeKind[TypeKind[\"I32\"] = 2] = \"I32\";\r\n TypeKind[TypeKind[\"I64\"] = 3] = \"I64\";\r\n TypeKind[TypeKind[\"ISIZE\"] = 4] = \"ISIZE\";\r\n // unsigned integers\r\n TypeKind[TypeKind[\"U8\"] = 5] = \"U8\";\r\n TypeKind[TypeKind[\"U16\"] = 6] = \"U16\";\r\n TypeKind[TypeKind[\"U32\"] = 7] = \"U32\";\r\n TypeKind[TypeKind[\"U64\"] = 8] = \"U64\";\r\n TypeKind[TypeKind[\"USIZE\"] = 9] = \"USIZE\";\r\n TypeKind[TypeKind[\"BOOL\"] = 10] = \"BOOL\";\r\n // floats\r\n TypeKind[TypeKind[\"F32\"] = 11] = \"F32\";\r\n TypeKind[TypeKind[\"F64\"] = 12] = \"F64\";\r\n // other\r\n TypeKind[TypeKind[\"VOID\"] = 13] = \"VOID\";\r\n})(TypeKind = exports.TypeKind || (exports.TypeKind = {}));\r\n/** Indicates capabilities of a type. */\r\nvar TypeFlags;\r\n(function (TypeFlags) {\r\n TypeFlags[TypeFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** Is a signed type that can represent negative values. */\r\n TypeFlags[TypeFlags[\"SIGNED\"] = 1] = \"SIGNED\";\r\n /** Is an unsigned type that cannot represent negative values. */\r\n TypeFlags[TypeFlags[\"UNSIGNED\"] = 2] = \"UNSIGNED\";\r\n /** Is an integer type. */\r\n TypeFlags[TypeFlags[\"INTEGER\"] = 4] = \"INTEGER\";\r\n /** Is a floating point type. */\r\n TypeFlags[TypeFlags[\"FLOAT\"] = 8] = \"FLOAT\";\r\n /** Is a sized integer type with a target specific bit size. */\r\n TypeFlags[TypeFlags[\"SIZE\"] = 16] = \"SIZE\";\r\n /** Is a small type that is emulated in a larger type. */\r\n TypeFlags[TypeFlags[\"SMALL\"] = 32] = \"SMALL\";\r\n /** Is a long type larger than 32-bits. */\r\n TypeFlags[TypeFlags[\"LONG\"] = 64] = \"LONG\";\r\n /** Is a value type. */\r\n TypeFlags[TypeFlags[\"VALUE\"] = 128] = \"VALUE\";\r\n /** Is a reference type. */\r\n TypeFlags[TypeFlags[\"REFERENCE\"] = 256] = \"REFERENCE\";\r\n /** Is a nullable type. */\r\n TypeFlags[TypeFlags[\"NULLABLE\"] = 512] = \"NULLABLE\";\r\n})(TypeFlags = exports.TypeFlags || (exports.TypeFlags = {}));\r\n/** Represents a resolved type. */\r\nvar Type = /** @class */ (function () {\r\n /** Constructs a new resolved type. */\r\n function Type(kind, flags, size) {\r\n /** Respective nullable type, if non-nullable. */\r\n this.nullableType = null;\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classType = null;\r\n this.nonNullableType = this;\r\n }\r\n /** Computes the sign-extending shift in the target type. */\r\n Type.prototype.computeSmallIntegerShift = function (targetType) {\r\n return targetType.size - this.size;\r\n };\r\n /** Computes the truncating mask in the target type. */\r\n Type.prototype.computeSmallIntegerMask = function (targetType) {\r\n return -1 >>> (targetType.size - this.size);\r\n };\r\n /** Tests if this type has the specified capabilities. */\r\n Type.prototype.is = function (flags) {\r\n return (this.flags & flags) == flags;\r\n };\r\n Object.defineProperty(Type.prototype, \"isClass\", {\r\n /** Tests if this type is a class type. */\r\n get: function () { return this.classType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Type.prototype, \"isFunction\", {\r\n /** Tests if this type is a function type. */\r\n get: function () { return this.functionType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Type.prototype, \"isReference\", {\r\n /** Tests if this type is a reference type. */\r\n get: function () { return this.classType != null || this.functionType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** Composes a class type from this type and a class. */\r\n Type.prototype.asClass = function (classType) {\r\n assert(this.kind == 9 /* USIZE */);\r\n var ret = new Type(this.kind, this.flags & ~128 /* VALUE */ | 256 /* REFERENCE */, this.size);\r\n ret.classType = classType;\r\n return ret;\r\n };\r\n /** Composes a function type from this type and a function. */\r\n Type.prototype.asFunction = function (functionType) {\r\n assert(this.kind == 9 /* USIZE */ && !this.isReference);\r\n var ret = new Type(this.kind, this.flags & ~128 /* VALUE */ | 256 /* REFERENCE */, this.size);\r\n ret.functionType = functionType;\r\n return ret;\r\n };\r\n /** Composes the respective nullable type of this type. */\r\n Type.prototype.asNullable = function () {\r\n assert(this.kind == 9 /* USIZE */);\r\n if (!this.nullableType) {\r\n assert(!this.is(512 /* NULLABLE */) && this.isReference);\r\n this.nullableType = new Type(this.kind, this.flags | 512 /* NULLABLE */, this.size);\r\n this.nullableType.classType = this.classType;\r\n this.nullableType.functionType = this.functionType;\r\n }\r\n return this.nullableType;\r\n };\r\n /** Converts this type to its TypeScript representation. */\r\n Type.prototype.toString = function (kindOnly) {\r\n if (kindOnly === void 0) { kindOnly = false; }\r\n switch (this.kind) {\r\n case 0 /* I8 */: return \"i8\";\r\n case 1 /* I16 */: return \"i16\";\r\n case 2 /* I32 */: return \"i32\";\r\n case 3 /* I64 */: return \"i64\";\r\n case 4 /* ISIZE */: return \"isize\";\r\n case 5 /* U8 */: return \"u8\";\r\n case 6 /* U16 */: return \"u16\";\r\n case 7 /* U32 */: return \"u32\";\r\n case 8 /* U64 */: return \"u64\";\r\n case 9 /* USIZE */:\r\n if (kindOnly)\r\n return \"usize\";\r\n return this.classType\r\n ? this.classType.toString()\r\n : this.functionType\r\n ? this.functionType.toTypeString()\r\n : \"usize\";\r\n case 10 /* BOOL */: return \"bool\";\r\n case 11 /* F32 */: return \"f32\";\r\n case 12 /* F64 */: return \"f64\";\r\n case 13 /* VOID */: return \"void\";\r\n default:\r\n assert(false);\r\n return \"\";\r\n }\r\n };\r\n // Binaryen specific\r\n /** Converts this type to its respective native type. */\r\n Type.prototype.toNativeType = function () {\r\n switch (this.kind) {\r\n default:\r\n return module_1.NativeType.I32;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module_1.NativeType.I64;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n return this.size == 64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n case 11 /* F32 */:\r\n return module_1.NativeType.F32;\r\n case 12 /* F64 */:\r\n return module_1.NativeType.F64;\r\n case 13 /* VOID */:\r\n return module_1.NativeType.None;\r\n }\r\n };\r\n /** Converts this type to its native `0` value. */\r\n Type.prototype.toNativeZero = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(0);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(0);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(0);\r\n case 11 /* F32 */:\r\n return module.createF32(0);\r\n case 12 /* F64 */:\r\n return module.createF64(0);\r\n }\r\n };\r\n /** Converts this type to its native `1` value. */\r\n Type.prototype.toNativeOne = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(1);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(1);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(1);\r\n case 11 /* F32 */:\r\n return module.createF32(1);\r\n case 12 /* F64 */:\r\n return module.createF64(1);\r\n }\r\n };\r\n /** Converts this type to its native `-1` value. */\r\n Type.prototype.toNativeNegOne = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(-1);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(-1);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(-1, -1);\r\n case 11 /* F32 */:\r\n return module.createF32(-1);\r\n case 12 /* F64 */:\r\n return module.createF64(-1);\r\n }\r\n };\r\n /** Converts this type to its signature string. */\r\n Type.prototype.toSignatureString = function () {\r\n switch (this.kind) {\r\n default:\r\n return \"i\";\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return \"I\";\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n return this.size == 64 ? \"I\" : \"i\";\r\n case 11 /* F32 */:\r\n return \"f\";\r\n case 12 /* F64 */:\r\n return \"F\";\r\n case 13 /* VOID */:\r\n return \"v\";\r\n }\r\n };\r\n // Types\r\n /** An 8-bit signed integer. */\r\n Type.i8 = new Type(0 /* I8 */, 1 /* SIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 8);\r\n /** A 16-bit signed integer. */\r\n Type.i16 = new Type(1 /* I16 */, 1 /* SIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 16);\r\n /** A 32-bit signed integer. */\r\n Type.i32 = new Type(2 /* I32 */, 1 /* SIGNED */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit signed integer. */\r\n Type.i64 = new Type(3 /* I64 */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 32-bit signed size. WASM32 only. */\r\n Type.isize32 = new Type(4 /* ISIZE */, 1 /* SIGNED */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit signed size. WASM64 only. */\r\n Type.isize64 = new Type(4 /* ISIZE */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** An 8-bit unsigned integer. */\r\n Type.u8 = new Type(5 /* U8 */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 8);\r\n /** A 16-bit unsigned integer. */\r\n Type.u16 = new Type(6 /* U16 */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 16);\r\n /** A 32-bit unsigned integer. */\r\n Type.u32 = new Type(7 /* U32 */, 2 /* UNSIGNED */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit unsigned integer. */\r\n Type.u64 = new Type(8 /* U64 */, 2 /* UNSIGNED */ |\r\n 64 /* LONG */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n Type.usize32 = new Type(9 /* USIZE */, 2 /* UNSIGNED */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n Type.usize64 = new Type(9 /* USIZE */, 2 /* UNSIGNED */ |\r\n 64 /* LONG */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 1-bit unsigned integer. */\r\n Type.bool = new Type(10 /* BOOL */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 1);\r\n /** A 32-bit float. */\r\n Type.f32 = new Type(11 /* F32 */, 1 /* SIGNED */ |\r\n 8 /* FLOAT */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit float. */\r\n Type.f64 = new Type(12 /* F64 */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 8 /* FLOAT */ |\r\n 128 /* VALUE */, 64);\r\n /** No return type. */\r\n Type.void = new Type(13 /* VOID */, 0 /* NONE */, 0);\r\n return Type;\r\n}());\r\nexports.Type = Type;\r\n/** Converts an array of types to an array of native types. */\r\nfunction typesToNativeTypes(types) {\r\n var k = types.length;\r\n var ret = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n ret[i] = types[i].toNativeType();\r\n }\r\n return ret;\r\n}\r\nexports.typesToNativeTypes = typesToNativeTypes;\r\n/** Converts an array of types to its combined string representation. */\r\nfunction typesToString(types) {\r\n var k = types.length;\r\n if (!k)\r\n return \"\";\r\n var sb = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n sb[i] = types[i].toString();\r\n }\r\n return sb.join(\", \");\r\n}\r\nexports.typesToString = typesToString;\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nexports.Token = tokenizer_1.Token;\r\nexports.Range = tokenizer_1.Range;\r\nvar path_1 = __webpack_require__(10);\r\n/** Indicates the kind of a node. */\r\nvar NodeKind;\r\n(function (NodeKind) {\r\n NodeKind[NodeKind[\"SOURCE\"] = 0] = \"SOURCE\";\r\n // types\r\n NodeKind[NodeKind[\"TYPE\"] = 1] = \"TYPE\";\r\n NodeKind[NodeKind[\"TYPEPARAMETER\"] = 2] = \"TYPEPARAMETER\";\r\n // expressions\r\n NodeKind[NodeKind[\"IDENTIFIER\"] = 3] = \"IDENTIFIER\";\r\n NodeKind[NodeKind[\"ASSERTION\"] = 4] = \"ASSERTION\";\r\n NodeKind[NodeKind[\"BINARY\"] = 5] = \"BINARY\";\r\n NodeKind[NodeKind[\"CALL\"] = 6] = \"CALL\";\r\n NodeKind[NodeKind[\"COMMA\"] = 7] = \"COMMA\";\r\n NodeKind[NodeKind[\"ELEMENTACCESS\"] = 8] = \"ELEMENTACCESS\";\r\n NodeKind[NodeKind[\"FALSE\"] = 9] = \"FALSE\";\r\n NodeKind[NodeKind[\"LITERAL\"] = 10] = \"LITERAL\";\r\n NodeKind[NodeKind[\"NEW\"] = 11] = \"NEW\";\r\n NodeKind[NodeKind[\"NULL\"] = 12] = \"NULL\";\r\n NodeKind[NodeKind[\"PARENTHESIZED\"] = 13] = \"PARENTHESIZED\";\r\n NodeKind[NodeKind[\"PROPERTYACCESS\"] = 14] = \"PROPERTYACCESS\";\r\n NodeKind[NodeKind[\"TERNARY\"] = 15] = \"TERNARY\";\r\n NodeKind[NodeKind[\"SUPER\"] = 16] = \"SUPER\";\r\n NodeKind[NodeKind[\"THIS\"] = 17] = \"THIS\";\r\n NodeKind[NodeKind[\"TRUE\"] = 18] = \"TRUE\";\r\n NodeKind[NodeKind[\"CONSTRUCTOR\"] = 19] = \"CONSTRUCTOR\";\r\n NodeKind[NodeKind[\"UNARYPOSTFIX\"] = 20] = \"UNARYPOSTFIX\";\r\n NodeKind[NodeKind[\"UNARYPREFIX\"] = 21] = \"UNARYPREFIX\";\r\n // statements\r\n NodeKind[NodeKind[\"BLOCK\"] = 22] = \"BLOCK\";\r\n NodeKind[NodeKind[\"BREAK\"] = 23] = \"BREAK\";\r\n NodeKind[NodeKind[\"CONTINUE\"] = 24] = \"CONTINUE\";\r\n NodeKind[NodeKind[\"DO\"] = 25] = \"DO\";\r\n NodeKind[NodeKind[\"EMPTY\"] = 26] = \"EMPTY\";\r\n NodeKind[NodeKind[\"EXPORT\"] = 27] = \"EXPORT\";\r\n NodeKind[NodeKind[\"EXPORTIMPORT\"] = 28] = \"EXPORTIMPORT\";\r\n NodeKind[NodeKind[\"EXPRESSION\"] = 29] = \"EXPRESSION\";\r\n NodeKind[NodeKind[\"FOR\"] = 30] = \"FOR\";\r\n NodeKind[NodeKind[\"IF\"] = 31] = \"IF\";\r\n NodeKind[NodeKind[\"IMPORT\"] = 32] = \"IMPORT\";\r\n NodeKind[NodeKind[\"RETURN\"] = 33] = \"RETURN\";\r\n NodeKind[NodeKind[\"SWITCH\"] = 34] = \"SWITCH\";\r\n NodeKind[NodeKind[\"THROW\"] = 35] = \"THROW\";\r\n NodeKind[NodeKind[\"TRY\"] = 36] = \"TRY\";\r\n NodeKind[NodeKind[\"VARIABLE\"] = 37] = \"VARIABLE\";\r\n NodeKind[NodeKind[\"WHILE\"] = 38] = \"WHILE\";\r\n // declaration statements\r\n NodeKind[NodeKind[\"CLASSDECLARATION\"] = 39] = \"CLASSDECLARATION\";\r\n NodeKind[NodeKind[\"ENUMDECLARATION\"] = 40] = \"ENUMDECLARATION\";\r\n NodeKind[NodeKind[\"ENUMVALUEDECLARATION\"] = 41] = \"ENUMVALUEDECLARATION\";\r\n NodeKind[NodeKind[\"FIELDDECLARATION\"] = 42] = \"FIELDDECLARATION\";\r\n NodeKind[NodeKind[\"FUNCTIONDECLARATION\"] = 43] = \"FUNCTIONDECLARATION\";\r\n NodeKind[NodeKind[\"IMPORTDECLARATION\"] = 44] = \"IMPORTDECLARATION\";\r\n NodeKind[NodeKind[\"INTERFACEDECLARATION\"] = 45] = \"INTERFACEDECLARATION\";\r\n NodeKind[NodeKind[\"METHODDECLARATION\"] = 46] = \"METHODDECLARATION\";\r\n NodeKind[NodeKind[\"NAMESPACEDECLARATION\"] = 47] = \"NAMESPACEDECLARATION\";\r\n NodeKind[NodeKind[\"TYPEDECLARATION\"] = 48] = \"TYPEDECLARATION\";\r\n NodeKind[NodeKind[\"VARIABLEDECLARATION\"] = 49] = \"VARIABLEDECLARATION\";\r\n // other\r\n NodeKind[NodeKind[\"DECORATOR\"] = 50] = \"DECORATOR\";\r\n NodeKind[NodeKind[\"EXPORTMEMBER\"] = 51] = \"EXPORTMEMBER\";\r\n NodeKind[NodeKind[\"MODIFIER\"] = 52] = \"MODIFIER\";\r\n NodeKind[NodeKind[\"PARAMETER\"] = 53] = \"PARAMETER\";\r\n NodeKind[NodeKind[\"SWITCHCASE\"] = 54] = \"SWITCHCASE\";\r\n})(NodeKind = exports.NodeKind || (exports.NodeKind = {}));\r\n/** Base class of all nodes. */\r\nvar Node = /** @class */ (function () {\r\n function Node() {\r\n /** Parent node. */\r\n this.parent = null;\r\n }\r\n // types\r\n Node.createType = function (identifier, typeArguments, isNullable, range) {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = identifier;\r\n type.typeArguments = typeArguments;\r\n type.isNullable = isNullable;\r\n return type;\r\n };\r\n // expressions\r\n Node.createIdentifierExpression = function (name, range) {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n };\r\n Node.createArrayLiteralExpression = function (elements, range) {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements;\r\n setParentOpt(elements, expr);\r\n return expr;\r\n };\r\n Node.createAssertionExpression = function (assertionKind, expression, toType, range) {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.toType = toType;\r\n toType.parent = expr;\r\n return expr;\r\n };\r\n Node.createBinaryExpression = function (operator, left, right, range) {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left;\r\n left.parent = expr;\r\n expr.right = right;\r\n right.parent = expr;\r\n return expr;\r\n };\r\n Node.createCallExpression = function (expression, typeArgs, args, range) {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.typeArguments = typeArgs;\r\n if (typeArgs)\r\n setParent(typeArgs, expr);\r\n expr.arguments = args;\r\n setParent(args, expr);\r\n return expr;\r\n };\r\n Node.createCommaExpression = function (expressions, range) {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions;\r\n setParent(expressions, expr);\r\n return expr;\r\n };\r\n Node.createConstructorExpression = function (range) {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createElementAccessExpression = function (expression, element, range) {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.elementExpression = element;\r\n element.parent = expr;\r\n return expr;\r\n };\r\n Node.createFalseExpression = function (range) {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createFloatLiteralExpression = function (value, range) {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createIntegerLiteralExpression = function (value, range) {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createNewExpression = function (expression, typeArgs, args, range) {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.typeArguments = typeArgs;\r\n if (typeArgs)\r\n setParent(typeArgs, expr);\r\n expr.arguments = args;\r\n setParent(args, expr);\r\n return expr;\r\n };\r\n Node.createNullExpression = function (range) {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createParenthesizedExpression = function (expression, range) {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n return expr;\r\n };\r\n Node.createPropertyAccessExpression = function (expression, property, range) {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.property = property;\r\n property.parent = expr;\r\n return expr;\r\n };\r\n Node.createRegexpLiteralExpression = function (pattern, flags, range) {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n };\r\n Node.createTernaryExpression = function (condition, ifThen, ifElse, range) {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition;\r\n condition.parent = expr;\r\n expr.ifThen = ifThen;\r\n ifThen.parent = expr;\r\n expr.ifElse = ifElse;\r\n ifElse.parent = expr;\r\n return expr;\r\n };\r\n Node.createStringLiteralExpression = function (value, range) {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createSuperExpression = function (range) {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createThisExpression = function (range) {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createTrueExpression = function (range) {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createUnaryPostfixExpression = function (operator, operand, range) {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n operand.parent = expr;\r\n return expr;\r\n };\r\n Node.createUnaryPrefixExpression = function (operator, operand, range) {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n operand.parent = expr;\r\n return expr;\r\n };\r\n // statements\r\n Node.createBlockStatement = function (statements, range) {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n setParent(statements, stmt);\r\n return stmt;\r\n };\r\n Node.createBreakStatement = function (label, range) {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n if (label)\r\n label.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createClassDeclaration = function (identifier, typeParameters, extendsType, implementsTypes, members, modifiers, decorators, range) {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.name = identifier;\r\n identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes;\r\n setParent(implementsTypes, stmt);\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createContinueStatement = function (label, range) {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n if (label)\r\n label.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createDecorator = function (expression, args, range) {\r\n var stmt = new Decorator();\r\n stmt.range = range;\r\n stmt.name = expression;\r\n expression.parent = stmt;\r\n stmt.arguments = args;\r\n if (args)\r\n setParent(args, stmt);\r\n if (expression.kind == NodeKind.IDENTIFIER) {\r\n switch (expression.text) {\r\n case \"global\":\r\n stmt.decoratorKind = 1 /* GLOBAL */;\r\n break;\r\n case \"operator\":\r\n stmt.decoratorKind = 2 /* OPERATOR */;\r\n break;\r\n case \"unmanaged\":\r\n stmt.decoratorKind = 3 /* UNMANAGED */;\r\n break;\r\n case \"offset\":\r\n stmt.decoratorKind = 4 /* OFFSET */;\r\n break;\r\n default:\r\n stmt.decoratorKind = 0 /* CUSTOM */;\r\n break;\r\n }\r\n }\r\n else {\r\n stmt.decoratorKind = 0 /* CUSTOM */;\r\n }\r\n return stmt;\r\n };\r\n Node.createDoStatement = function (statement, condition, range) {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createEmptyStatement = function (range) {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n };\r\n Node.createEnumDeclaration = function (name, members, modifiers, decorators, range) {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.values = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createEnumValueDeclaration = function (name, value, range) {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.value = value;\r\n if (value)\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createExportStatement = function (members, path, modifiers, range) {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n var normalizedPath = path_1.normalize(path.value);\r\n if (path.value.startsWith(\".\")) {\r\n stmt.normalizedPath = path_1.resolve(normalizedPath, range.source.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n return stmt;\r\n };\r\n Node.createExportImportStatement = function (name, externalName, range) {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.externalName = externalName;\r\n externalName.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createExportMember = function (name, externalName, range) {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n }\r\n else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n };\r\n Node.createExpressionStatement = function (expression) {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression;\r\n expression.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createIfStatement = function (condition, ifTrue, ifFalse, range) {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.ifTrue = ifTrue;\r\n ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse;\r\n if (ifFalse)\r\n ifFalse.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createImportStatement = function (decls, path, range) {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls;\r\n if (decls)\r\n setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = path_1.normalize(path.value);\r\n if (path.value.startsWith(\".\")) {\r\n stmt.normalizedPath = path_1.resolve(normalizedPath, range.source.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n };\r\n Node.createImportStatementWithWildcard = function (identifier, path, range) {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = path_1.resolve(path_1.normalize(path.value), range.source.normalizedPath);\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n };\r\n Node.createImportDeclaration = function (externalName, name, range) {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName;\r\n externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n }\r\n else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n };\r\n Node.createInterfaceDeclaration = function (name, extendsType, members, modifiers, range) {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = stmt;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n return stmt;\r\n };\r\n Node.createFieldDeclaration = function (name, type, initializer, modifiers, decorators, range) {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.type = type;\r\n if (type)\r\n type.parent = stmt;\r\n stmt.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = stmt;\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createForStatement = function (initializer, condition, incrementor, statement, range) {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = stmt;\r\n stmt.condition = condition;\r\n if (condition)\r\n condition.parent = stmt;\r\n stmt.incrementor = incrementor;\r\n if (incrementor)\r\n incrementor.parent = stmt;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createTypeParameter = function (name, extendsType, range) {\r\n var elem = new TypeParameter();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = elem;\r\n return elem;\r\n };\r\n Node.createParameter = function (name, type, initializer, kind, range) {\r\n var elem = new Parameter();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.type = type;\r\n if (type)\r\n type.parent = elem;\r\n elem.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n };\r\n Node.createFunctionDeclaration = function (name, typeParameters, parameters, returnType, statements, modifiers, decorators, range) {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.parameters = parameters;\r\n setParent(parameters, stmt);\r\n stmt.returnType = returnType;\r\n if (returnType)\r\n returnType.parent = stmt;\r\n stmt.statements = statements;\r\n if (statements)\r\n setParent(statements, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createMethodDeclaration = function (name, typeParameters, parameters, returnType, statements, modifiers, decorators, range) {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.parameters = parameters;\r\n setParent(parameters, stmt);\r\n stmt.returnType = returnType;\r\n if (returnType)\r\n returnType.parent = stmt;\r\n stmt.statements = statements;\r\n if (statements)\r\n setParent(statements, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createModifier = function (kind, range) {\r\n var elem = new Modifier();\r\n elem.range = range;\r\n elem.modifierKind = kind;\r\n return elem;\r\n };\r\n Node.createNamespaceDeclaration = function (name, members, modifiers, decorators, range) {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createReturnStatement = function (value, range) {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n if (value)\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createSwitchStatement = function (condition, cases, range) {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.cases = cases;\r\n setParent(cases, stmt);\r\n return stmt;\r\n };\r\n Node.createSwitchCase = function (label, statements, range) {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label;\r\n if (label)\r\n label.parent = elem;\r\n elem.statements = statements;\r\n setParent(statements, elem);\r\n return elem;\r\n };\r\n Node.createThrowStatement = function (value, range) {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createTryStatement = function (statements, catchVariable, catchStatements, finallyStatements, range) {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable)\r\n catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements)\r\n setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements)\r\n setParent(finallyStatements, stmt);\r\n return stmt;\r\n };\r\n Node.createTypeDeclaration = function (name, alias, modifiers, decorators, range) {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.alias = alias;\r\n alias.parent = stmt;\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createVariableStatement = function (declarations, modifiers, decorators, range) {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.declarations = declarations;\r\n setParent(declarations, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createVariableDeclaration = function (name, type, initializer, modifiers, decorators, range) {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.type = type;\r\n if (type)\r\n type.parent = elem;\r\n elem.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = elem;\r\n elem.modifiers = modifiers; // inherited from parent VariableStatement\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n };\r\n Node.createWhileStatement = function (condition, statement, range) {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n return stmt;\r\n };\r\n return Node;\r\n}());\r\nexports.Node = Node;\r\n// types\r\n/** Represents a type annotation. */\r\nvar TypeNode = /** @class */ (function (_super) {\r\n __extends(TypeNode, _super);\r\n function TypeNode() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPE;\r\n return _this;\r\n }\r\n return TypeNode;\r\n}(Node));\r\nexports.TypeNode = TypeNode;\r\n/** Represents a type parameter. */\r\nvar TypeParameter = /** @class */ (function (_super) {\r\n __extends(TypeParameter, _super);\r\n function TypeParameter() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPEPARAMETER;\r\n return _this;\r\n }\r\n return TypeParameter;\r\n}(Node));\r\nexports.TypeParameter = TypeParameter;\r\n// expressions\r\n/** Base class of all expression nodes. */\r\nvar Expression = /** @class */ (function (_super) {\r\n __extends(Expression, _super);\r\n function Expression() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Expression;\r\n}(Node));\r\nexports.Expression = Expression;\r\n/** Represents an identifier expression. */\r\nvar IdentifierExpression = /** @class */ (function (_super) {\r\n __extends(IdentifierExpression, _super);\r\n function IdentifierExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IDENTIFIER;\r\n return _this;\r\n }\r\n return IdentifierExpression;\r\n}(Expression));\r\nexports.IdentifierExpression = IdentifierExpression;\r\n/** Indicates the kind of a literal. */\r\nvar LiteralKind;\r\n(function (LiteralKind) {\r\n LiteralKind[LiteralKind[\"FLOAT\"] = 0] = \"FLOAT\";\r\n LiteralKind[LiteralKind[\"INTEGER\"] = 1] = \"INTEGER\";\r\n LiteralKind[LiteralKind[\"STRING\"] = 2] = \"STRING\";\r\n LiteralKind[LiteralKind[\"REGEXP\"] = 3] = \"REGEXP\";\r\n LiteralKind[LiteralKind[\"ARRAY\"] = 4] = \"ARRAY\";\r\n LiteralKind[LiteralKind[\"OBJECT\"] = 5] = \"OBJECT\";\r\n})(LiteralKind = exports.LiteralKind || (exports.LiteralKind = {}));\r\n/** Base class of all literal expressions. */\r\nvar LiteralExpression = /** @class */ (function (_super) {\r\n __extends(LiteralExpression, _super);\r\n function LiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.LITERAL;\r\n return _this;\r\n }\r\n return LiteralExpression;\r\n}(Expression));\r\nexports.LiteralExpression = LiteralExpression;\r\n/** Represents an `[]` literal expression. */\r\nvar ArrayLiteralExpression = /** @class */ (function (_super) {\r\n __extends(ArrayLiteralExpression, _super);\r\n function ArrayLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 4 /* ARRAY */;\r\n return _this;\r\n }\r\n return ArrayLiteralExpression;\r\n}(LiteralExpression));\r\nexports.ArrayLiteralExpression = ArrayLiteralExpression;\r\n/** Indicates the kind of an assertion. */\r\nvar AssertionKind;\r\n(function (AssertionKind) {\r\n AssertionKind[AssertionKind[\"PREFIX\"] = 0] = \"PREFIX\";\r\n AssertionKind[AssertionKind[\"AS\"] = 1] = \"AS\";\r\n})(AssertionKind = exports.AssertionKind || (exports.AssertionKind = {}));\r\n/** Represents an assertion expression. */\r\nvar AssertionExpression = /** @class */ (function (_super) {\r\n __extends(AssertionExpression, _super);\r\n function AssertionExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ASSERTION;\r\n return _this;\r\n }\r\n return AssertionExpression;\r\n}(Expression));\r\nexports.AssertionExpression = AssertionExpression;\r\n/** Represents a binary expression. */\r\nvar BinaryExpression = /** @class */ (function (_super) {\r\n __extends(BinaryExpression, _super);\r\n function BinaryExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BINARY;\r\n return _this;\r\n }\r\n return BinaryExpression;\r\n}(Expression));\r\nexports.BinaryExpression = BinaryExpression;\r\n/** Represents a call expression. */\r\nvar CallExpression = /** @class */ (function (_super) {\r\n __extends(CallExpression, _super);\r\n function CallExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CALL;\r\n return _this;\r\n }\r\n return CallExpression;\r\n}(Expression));\r\nexports.CallExpression = CallExpression;\r\n/** Represents a comma expression composed of multiple expressions. */\r\nvar CommaExpression = /** @class */ (function (_super) {\r\n __extends(CommaExpression, _super);\r\n function CommaExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.COMMA;\r\n return _this;\r\n }\r\n return CommaExpression;\r\n}(Expression));\r\nexports.CommaExpression = CommaExpression;\r\n/** Represents a `constructor` expression. */\r\nvar ConstructorExpression = /** @class */ (function (_super) {\r\n __extends(ConstructorExpression, _super);\r\n function ConstructorExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CONSTRUCTOR;\r\n _this.text = \"constructor\";\r\n return _this;\r\n }\r\n return ConstructorExpression;\r\n}(IdentifierExpression));\r\nexports.ConstructorExpression = ConstructorExpression;\r\n/** Represents an element access expression, e.g., array access. */\r\nvar ElementAccessExpression = /** @class */ (function (_super) {\r\n __extends(ElementAccessExpression, _super);\r\n function ElementAccessExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ELEMENTACCESS;\r\n return _this;\r\n }\r\n return ElementAccessExpression;\r\n}(Expression));\r\nexports.ElementAccessExpression = ElementAccessExpression;\r\n/** Represents a float literal expression. */\r\nvar FloatLiteralExpression = /** @class */ (function (_super) {\r\n __extends(FloatLiteralExpression, _super);\r\n function FloatLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 0 /* FLOAT */;\r\n return _this;\r\n }\r\n return FloatLiteralExpression;\r\n}(LiteralExpression));\r\nexports.FloatLiteralExpression = FloatLiteralExpression;\r\n/** Represents an integer literal expression. */\r\nvar IntegerLiteralExpression = /** @class */ (function (_super) {\r\n __extends(IntegerLiteralExpression, _super);\r\n function IntegerLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 1 /* INTEGER */;\r\n return _this;\r\n }\r\n return IntegerLiteralExpression;\r\n}(LiteralExpression));\r\nexports.IntegerLiteralExpression = IntegerLiteralExpression;\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nvar NewExpression = /** @class */ (function (_super) {\r\n __extends(NewExpression, _super);\r\n function NewExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NEW;\r\n return _this;\r\n }\r\n return NewExpression;\r\n}(CallExpression));\r\nexports.NewExpression = NewExpression;\r\n/** Represents a `null` expression. */\r\nvar NullExpression = /** @class */ (function (_super) {\r\n __extends(NullExpression, _super);\r\n function NullExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NULL;\r\n _this.text = \"null\";\r\n return _this;\r\n }\r\n return NullExpression;\r\n}(IdentifierExpression));\r\nexports.NullExpression = NullExpression;\r\n/** Represents a parenthesized expression. */\r\nvar ParenthesizedExpression = /** @class */ (function (_super) {\r\n __extends(ParenthesizedExpression, _super);\r\n function ParenthesizedExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PARENTHESIZED;\r\n return _this;\r\n }\r\n return ParenthesizedExpression;\r\n}(Expression));\r\nexports.ParenthesizedExpression = ParenthesizedExpression;\r\n/** Represents a property access expression. */\r\nvar PropertyAccessExpression = /** @class */ (function (_super) {\r\n __extends(PropertyAccessExpression, _super);\r\n function PropertyAccessExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PROPERTYACCESS;\r\n return _this;\r\n }\r\n return PropertyAccessExpression;\r\n}(Expression));\r\nexports.PropertyAccessExpression = PropertyAccessExpression;\r\n/** Represents a regular expression literal expression. */\r\nvar RegexpLiteralExpression = /** @class */ (function (_super) {\r\n __extends(RegexpLiteralExpression, _super);\r\n function RegexpLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 3 /* REGEXP */;\r\n return _this;\r\n }\r\n return RegexpLiteralExpression;\r\n}(LiteralExpression));\r\nexports.RegexpLiteralExpression = RegexpLiteralExpression;\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nvar TernaryExpression = /** @class */ (function (_super) {\r\n __extends(TernaryExpression, _super);\r\n function TernaryExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TERNARY;\r\n return _this;\r\n }\r\n return TernaryExpression;\r\n}(Expression));\r\nexports.TernaryExpression = TernaryExpression;\r\n/** Represents a string literal expression. */\r\nvar StringLiteralExpression = /** @class */ (function (_super) {\r\n __extends(StringLiteralExpression, _super);\r\n function StringLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 2 /* STRING */;\r\n return _this;\r\n }\r\n return StringLiteralExpression;\r\n}(LiteralExpression));\r\nexports.StringLiteralExpression = StringLiteralExpression;\r\n/** Represents a `super` expression. */\r\nvar SuperExpression = /** @class */ (function (_super) {\r\n __extends(SuperExpression, _super);\r\n function SuperExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SUPER;\r\n _this.text = \"super\";\r\n return _this;\r\n }\r\n return SuperExpression;\r\n}(IdentifierExpression));\r\nexports.SuperExpression = SuperExpression;\r\n/** Represents a `this` expression. */\r\nvar ThisExpression = /** @class */ (function (_super) {\r\n __extends(ThisExpression, _super);\r\n function ThisExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.THIS;\r\n _this.text = \"this\";\r\n return _this;\r\n }\r\n return ThisExpression;\r\n}(IdentifierExpression));\r\nexports.ThisExpression = ThisExpression;\r\n/** Represents a `true` expression. */\r\nvar TrueExpression = /** @class */ (function (_super) {\r\n __extends(TrueExpression, _super);\r\n function TrueExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TRUE;\r\n _this.text = \"true\";\r\n return _this;\r\n }\r\n return TrueExpression;\r\n}(IdentifierExpression));\r\nexports.TrueExpression = TrueExpression;\r\n/** Represents a `false` expression. */\r\nvar FalseExpression = /** @class */ (function (_super) {\r\n __extends(FalseExpression, _super);\r\n function FalseExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FALSE;\r\n _this.text = \"false\";\r\n return _this;\r\n }\r\n return FalseExpression;\r\n}(IdentifierExpression));\r\nexports.FalseExpression = FalseExpression;\r\n/** Base class of all unary expressions. */\r\nvar UnaryExpression = /** @class */ (function (_super) {\r\n __extends(UnaryExpression, _super);\r\n function UnaryExpression() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return UnaryExpression;\r\n}(Expression));\r\nexports.UnaryExpression = UnaryExpression;\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nvar UnaryPostfixExpression = /** @class */ (function (_super) {\r\n __extends(UnaryPostfixExpression, _super);\r\n function UnaryPostfixExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.UNARYPOSTFIX;\r\n return _this;\r\n }\r\n return UnaryPostfixExpression;\r\n}(UnaryExpression));\r\nexports.UnaryPostfixExpression = UnaryPostfixExpression;\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nvar UnaryPrefixExpression = /** @class */ (function (_super) {\r\n __extends(UnaryPrefixExpression, _super);\r\n function UnaryPrefixExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.UNARYPREFIX;\r\n return _this;\r\n }\r\n return UnaryPrefixExpression;\r\n}(UnaryExpression));\r\nexports.UnaryPrefixExpression = UnaryPrefixExpression;\r\n// statements\r\n/** Indicates the specific kind of a modifier. */\r\nvar ModifierKind;\r\n(function (ModifierKind) {\r\n ModifierKind[ModifierKind[\"ASYNC\"] = 0] = \"ASYNC\";\r\n ModifierKind[ModifierKind[\"CONST\"] = 1] = \"CONST\";\r\n ModifierKind[ModifierKind[\"LET\"] = 2] = \"LET\";\r\n ModifierKind[ModifierKind[\"DECLARE\"] = 3] = \"DECLARE\";\r\n ModifierKind[ModifierKind[\"EXPORT\"] = 4] = \"EXPORT\";\r\n ModifierKind[ModifierKind[\"IMPORT\"] = 5] = \"IMPORT\";\r\n ModifierKind[ModifierKind[\"STATIC\"] = 6] = \"STATIC\";\r\n ModifierKind[ModifierKind[\"ABSTRACT\"] = 7] = \"ABSTRACT\";\r\n ModifierKind[ModifierKind[\"PUBLIC\"] = 8] = \"PUBLIC\";\r\n ModifierKind[ModifierKind[\"PRIVATE\"] = 9] = \"PRIVATE\";\r\n ModifierKind[ModifierKind[\"PROTECTED\"] = 10] = \"PROTECTED\";\r\n ModifierKind[ModifierKind[\"READONLY\"] = 11] = \"READONLY\";\r\n ModifierKind[ModifierKind[\"GET\"] = 12] = \"GET\";\r\n ModifierKind[ModifierKind[\"SET\"] = 13] = \"SET\";\r\n})(ModifierKind = exports.ModifierKind || (exports.ModifierKind = {}));\r\n/** Base class of all statement nodes. */\r\nvar Statement = /** @class */ (function (_super) {\r\n __extends(Statement, _super);\r\n function Statement() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Statement;\r\n}(Node));\r\nexports.Statement = Statement;\r\n/** Indicates the specific kind of a source. */\r\nvar SourceKind;\r\n(function (SourceKind) {\r\n /** Default source. Usually imported from an entry file. */\r\n SourceKind[SourceKind[\"DEFAULT\"] = 0] = \"DEFAULT\";\r\n /** Entry file. */\r\n SourceKind[SourceKind[\"ENTRY\"] = 1] = \"ENTRY\";\r\n /** Library file. */\r\n SourceKind[SourceKind[\"LIBRARY\"] = 2] = \"LIBRARY\";\r\n})(SourceKind = exports.SourceKind || (exports.SourceKind = {}));\r\n/** A top-level source node. */\r\nvar Source = /** @class */ (function (_super) {\r\n __extends(Source, _super);\r\n /** Constructs a new source node. */\r\n function Source(normalizedPath, text, kind) {\r\n var _this = _super.call(this) || this;\r\n _this.kind = NodeKind.SOURCE;\r\n _this.parent = null;\r\n /** Tokenizer reference. */\r\n _this.tokenizer = null;\r\n /** Source map index. */\r\n _this.debugInfoIndex = -1;\r\n _this.sourceKind = kind;\r\n _this.normalizedPath = normalizedPath;\r\n _this.internalPath = mangleInternalPath(_this.normalizedPath);\r\n _this.statements = new Array();\r\n _this.range = new tokenizer_1.Range(_this, 0, text.length);\r\n _this.text = text;\r\n return _this;\r\n }\r\n Object.defineProperty(Source.prototype, \"isEntry\", {\r\n /** Tests if this source is an entry file. */\r\n get: function () { return this.sourceKind == SourceKind.ENTRY; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Source.prototype, \"isLibrary\", {\r\n /** Tests if this source is a stdlib file. */\r\n get: function () { return this.sourceKind == SourceKind.LIBRARY; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Source;\r\n}(Node));\r\nexports.Source = Source;\r\n/** Base class of all declaration statements. */\r\nvar DeclarationStatement = /** @class */ (function (_super) {\r\n __extends(DeclarationStatement, _super);\r\n function DeclarationStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n /** Array of decorators. */\r\n _this.decorators = null;\r\n _this.cachedProgramLevelInternalName = null;\r\n _this.cachedFileLevelInternalName = null;\r\n return _this;\r\n }\r\n Object.defineProperty(DeclarationStatement.prototype, \"programLevelInternalName\", {\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get: function () {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"fileLevelInternalName\", {\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get: function () {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"isTopLevel\", {\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get: function () {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"isTopLevelExport\", {\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get: function () {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return (hasModifier(ModifierKind.EXPORT, this.modifiers) &&\r\n parent.isTopLevelExport);\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return (hasModifier(ModifierKind.STATIC, this.modifiers) &&\r\n parent.isTopLevelExport);\r\n }\r\n return (parent.kind == NodeKind.SOURCE &&\r\n hasModifier(ModifierKind.EXPORT, this.modifiers));\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** Tests if this declaration needs an explicit export. */\r\n DeclarationStatement.prototype.needsExplicitExport = function (member) {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n };\r\n return DeclarationStatement;\r\n}(Statement));\r\nexports.DeclarationStatement = DeclarationStatement;\r\n/** Base class of all variable-like declaration statements. */\r\nvar VariableLikeDeclarationStatement = /** @class */ (function (_super) {\r\n __extends(VariableLikeDeclarationStatement, _super);\r\n function VariableLikeDeclarationStatement() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return VariableLikeDeclarationStatement;\r\n}(DeclarationStatement));\r\nexports.VariableLikeDeclarationStatement = VariableLikeDeclarationStatement;\r\n/** Represents a block statement. */\r\nvar BlockStatement = /** @class */ (function (_super) {\r\n __extends(BlockStatement, _super);\r\n function BlockStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BLOCK;\r\n return _this;\r\n }\r\n return BlockStatement;\r\n}(Statement));\r\nexports.BlockStatement = BlockStatement;\r\n/** Represents a `break` statement. */\r\nvar BreakStatement = /** @class */ (function (_super) {\r\n __extends(BreakStatement, _super);\r\n function BreakStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BREAK;\r\n return _this;\r\n }\r\n return BreakStatement;\r\n}(Statement));\r\nexports.BreakStatement = BreakStatement;\r\n/** Represents a `class` declaration. */\r\nvar ClassDeclaration = /** @class */ (function (_super) {\r\n __extends(ClassDeclaration, _super);\r\n function ClassDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CLASSDECLARATION;\r\n return _this;\r\n }\r\n return ClassDeclaration;\r\n}(DeclarationStatement));\r\nexports.ClassDeclaration = ClassDeclaration;\r\n/** Represents a `continue` statement. */\r\nvar ContinueStatement = /** @class */ (function (_super) {\r\n __extends(ContinueStatement, _super);\r\n function ContinueStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CONTINUE;\r\n return _this;\r\n }\r\n return ContinueStatement;\r\n}(Statement));\r\nexports.ContinueStatement = ContinueStatement;\r\n/** Built-in decorator kinds. */\r\nvar DecoratorKind;\r\n(function (DecoratorKind) {\r\n DecoratorKind[DecoratorKind[\"CUSTOM\"] = 0] = \"CUSTOM\";\r\n DecoratorKind[DecoratorKind[\"GLOBAL\"] = 1] = \"GLOBAL\";\r\n DecoratorKind[DecoratorKind[\"OPERATOR\"] = 2] = \"OPERATOR\";\r\n DecoratorKind[DecoratorKind[\"UNMANAGED\"] = 3] = \"UNMANAGED\";\r\n DecoratorKind[DecoratorKind[\"OFFSET\"] = 4] = \"OFFSET\";\r\n})(DecoratorKind = exports.DecoratorKind || (exports.DecoratorKind = {}));\r\n/** Depresents a decorator. */\r\nvar Decorator = /** @class */ (function (_super) {\r\n __extends(Decorator, _super);\r\n function Decorator() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.DECORATOR;\r\n return _this;\r\n }\r\n return Decorator;\r\n}(Statement));\r\nexports.Decorator = Decorator;\r\n/** Represents a `do` statement. */\r\nvar DoStatement = /** @class */ (function (_super) {\r\n __extends(DoStatement, _super);\r\n function DoStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.DO;\r\n return _this;\r\n }\r\n return DoStatement;\r\n}(Statement));\r\nexports.DoStatement = DoStatement;\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nvar EmptyStatement = /** @class */ (function (_super) {\r\n __extends(EmptyStatement, _super);\r\n function EmptyStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EMPTY;\r\n return _this;\r\n }\r\n return EmptyStatement;\r\n}(Statement));\r\nexports.EmptyStatement = EmptyStatement;\r\n/** Represents an `enum` declaration. */\r\nvar EnumDeclaration = /** @class */ (function (_super) {\r\n __extends(EnumDeclaration, _super);\r\n function EnumDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ENUMDECLARATION;\r\n return _this;\r\n }\r\n return EnumDeclaration;\r\n}(DeclarationStatement));\r\nexports.EnumDeclaration = EnumDeclaration;\r\n/** Represents a value of an `enum` declaration. */\r\nvar EnumValueDeclaration = /** @class */ (function (_super) {\r\n __extends(EnumValueDeclaration, _super);\r\n function EnumValueDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ENUMVALUEDECLARATION;\r\n _this.modifiers = null;\r\n return _this;\r\n }\r\n return EnumValueDeclaration;\r\n}(DeclarationStatement));\r\nexports.EnumValueDeclaration = EnumValueDeclaration;\r\n/** Represents an `export import` statement of an interface. */\r\nvar ExportImportStatement = /** @class */ (function (_super) {\r\n __extends(ExportImportStatement, _super);\r\n function ExportImportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORTIMPORT;\r\n return _this;\r\n }\r\n return ExportImportStatement;\r\n}(Node));\r\nexports.ExportImportStatement = ExportImportStatement;\r\n/** Represents a member of an `export` statement. */\r\nvar ExportMember = /** @class */ (function (_super) {\r\n __extends(ExportMember, _super);\r\n function ExportMember() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORTMEMBER;\r\n return _this;\r\n }\r\n return ExportMember;\r\n}(Node));\r\nexports.ExportMember = ExportMember;\r\n/** Represents an `export` statement. */\r\nvar ExportStatement = /** @class */ (function (_super) {\r\n __extends(ExportStatement, _super);\r\n function ExportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORT;\r\n return _this;\r\n }\r\n return ExportStatement;\r\n}(Statement));\r\nexports.ExportStatement = ExportStatement;\r\n/** Represents an expression that is used as a statement. */\r\nvar ExpressionStatement = /** @class */ (function (_super) {\r\n __extends(ExpressionStatement, _super);\r\n function ExpressionStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPRESSION;\r\n return _this;\r\n }\r\n return ExpressionStatement;\r\n}(Statement));\r\nexports.ExpressionStatement = ExpressionStatement;\r\n/** Represents a field declaration within a `class`. */\r\nvar FieldDeclaration = /** @class */ (function (_super) {\r\n __extends(FieldDeclaration, _super);\r\n function FieldDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FIELDDECLARATION;\r\n return _this;\r\n }\r\n return FieldDeclaration;\r\n}(VariableLikeDeclarationStatement));\r\nexports.FieldDeclaration = FieldDeclaration;\r\n/** Represents a `for` statement. */\r\nvar ForStatement = /** @class */ (function (_super) {\r\n __extends(ForStatement, _super);\r\n function ForStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FOR;\r\n return _this;\r\n }\r\n return ForStatement;\r\n}(Statement));\r\nexports.ForStatement = ForStatement;\r\n/** Represents a `function` declaration. */\r\nvar FunctionDeclaration = /** @class */ (function (_super) {\r\n __extends(FunctionDeclaration, _super);\r\n function FunctionDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FUNCTIONDECLARATION;\r\n return _this;\r\n }\r\n return FunctionDeclaration;\r\n}(DeclarationStatement));\r\nexports.FunctionDeclaration = FunctionDeclaration;\r\n/** Represents an `if` statement. */\r\nvar IfStatement = /** @class */ (function (_super) {\r\n __extends(IfStatement, _super);\r\n function IfStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IF;\r\n return _this;\r\n }\r\n return IfStatement;\r\n}(Statement));\r\nexports.IfStatement = IfStatement;\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nvar ImportDeclaration = /** @class */ (function (_super) {\r\n __extends(ImportDeclaration, _super);\r\n function ImportDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IMPORTDECLARATION;\r\n _this.modifiers = null;\r\n return _this;\r\n }\r\n return ImportDeclaration;\r\n}(DeclarationStatement));\r\nexports.ImportDeclaration = ImportDeclaration;\r\n/** Represents an `import` statement. */\r\nvar ImportStatement = /** @class */ (function (_super) {\r\n __extends(ImportStatement, _super);\r\n function ImportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IMPORT;\r\n return _this;\r\n }\r\n return ImportStatement;\r\n}(Statement));\r\nexports.ImportStatement = ImportStatement;\r\n/** Represents an `interfarce` declaration. */\r\nvar InterfaceDeclaration = /** @class */ (function (_super) {\r\n __extends(InterfaceDeclaration, _super);\r\n function InterfaceDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.INTERFACEDECLARATION;\r\n return _this;\r\n }\r\n return InterfaceDeclaration;\r\n}(ClassDeclaration));\r\nexports.InterfaceDeclaration = InterfaceDeclaration;\r\n/** Represents a method declaration within a `class`. */\r\nvar MethodDeclaration = /** @class */ (function (_super) {\r\n __extends(MethodDeclaration, _super);\r\n function MethodDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.METHODDECLARATION;\r\n return _this;\r\n }\r\n return MethodDeclaration;\r\n}(FunctionDeclaration));\r\nexports.MethodDeclaration = MethodDeclaration;\r\n/** Represents a `namespace` declaration. */\r\nvar NamespaceDeclaration = /** @class */ (function (_super) {\r\n __extends(NamespaceDeclaration, _super);\r\n function NamespaceDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NAMESPACEDECLARATION;\r\n return _this;\r\n }\r\n return NamespaceDeclaration;\r\n}(DeclarationStatement));\r\nexports.NamespaceDeclaration = NamespaceDeclaration;\r\n/** Represents the kind of a parameter. */\r\nvar ParameterKind;\r\n(function (ParameterKind) {\r\n /** No specific flags. */\r\n ParameterKind[ParameterKind[\"DEFAULT\"] = 0] = \"DEFAULT\";\r\n /** Is an optional parameter. */\r\n ParameterKind[ParameterKind[\"OPTIONAL\"] = 1] = \"OPTIONAL\";\r\n /** Is a rest parameter. */\r\n ParameterKind[ParameterKind[\"REST\"] = 2] = \"REST\";\r\n})(ParameterKind = exports.ParameterKind || (exports.ParameterKind = {}));\r\n/** Represents a function parameter. */\r\nvar Parameter = /** @class */ (function (_super) {\r\n __extends(Parameter, _super);\r\n function Parameter() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PARAMETER;\r\n return _this;\r\n }\r\n return Parameter;\r\n}(Node));\r\nexports.Parameter = Parameter;\r\n/** Represents a single modifier. */\r\nvar Modifier = /** @class */ (function (_super) {\r\n __extends(Modifier, _super);\r\n function Modifier() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.MODIFIER;\r\n return _this;\r\n }\r\n return Modifier;\r\n}(Node));\r\nexports.Modifier = Modifier;\r\n/** Represents a `return` statement. */\r\nvar ReturnStatement = /** @class */ (function (_super) {\r\n __extends(ReturnStatement, _super);\r\n function ReturnStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.RETURN;\r\n return _this;\r\n }\r\n return ReturnStatement;\r\n}(Statement));\r\nexports.ReturnStatement = ReturnStatement;\r\n/** Represents a single `case` within a `switch` statement. */\r\nvar SwitchCase = /** @class */ (function (_super) {\r\n __extends(SwitchCase, _super);\r\n function SwitchCase() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SWITCHCASE;\r\n return _this;\r\n }\r\n return SwitchCase;\r\n}(Node));\r\nexports.SwitchCase = SwitchCase;\r\n/** Represents a `switch` statement. */\r\nvar SwitchStatement = /** @class */ (function (_super) {\r\n __extends(SwitchStatement, _super);\r\n function SwitchStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SWITCH;\r\n return _this;\r\n }\r\n return SwitchStatement;\r\n}(Statement));\r\nexports.SwitchStatement = SwitchStatement;\r\n/** Represents a `throw` statement. */\r\nvar ThrowStatement = /** @class */ (function (_super) {\r\n __extends(ThrowStatement, _super);\r\n function ThrowStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.THROW;\r\n return _this;\r\n }\r\n return ThrowStatement;\r\n}(Statement));\r\nexports.ThrowStatement = ThrowStatement;\r\n/** Represents a `try` statement. */\r\nvar TryStatement = /** @class */ (function (_super) {\r\n __extends(TryStatement, _super);\r\n function TryStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TRY;\r\n return _this;\r\n }\r\n return TryStatement;\r\n}(Statement));\r\nexports.TryStatement = TryStatement;\r\n/** Represents a `type` declaration. */\r\nvar TypeDeclaration = /** @class */ (function (_super) {\r\n __extends(TypeDeclaration, _super);\r\n function TypeDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPEDECLARATION;\r\n return _this;\r\n }\r\n return TypeDeclaration;\r\n}(DeclarationStatement));\r\nexports.TypeDeclaration = TypeDeclaration;\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nvar VariableDeclaration = /** @class */ (function (_super) {\r\n __extends(VariableDeclaration, _super);\r\n function VariableDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.VARIABLEDECLARATION;\r\n return _this;\r\n }\r\n return VariableDeclaration;\r\n}(VariableLikeDeclarationStatement));\r\nexports.VariableDeclaration = VariableDeclaration;\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nvar VariableStatement = /** @class */ (function (_super) {\r\n __extends(VariableStatement, _super);\r\n function VariableStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.VARIABLE;\r\n return _this;\r\n }\r\n return VariableStatement;\r\n}(Statement));\r\nexports.VariableStatement = VariableStatement;\r\n/** Represents a `while` statement. */\r\nvar WhileStatement = /** @class */ (function (_super) {\r\n __extends(WhileStatement, _super);\r\n function WhileStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.WHILE;\r\n return _this;\r\n }\r\n return WhileStatement;\r\n}(Statement));\r\nexports.WhileStatement = WhileStatement;\r\n/** Cached unused modifiers for reuse. */\r\nvar reusableModifiers = null;\r\nfunction setReusableModifiers(modifiers) {\r\n reusableModifiers = modifiers;\r\n}\r\nexports.setReusableModifiers = setReusableModifiers;\r\n/** Creates a new modifiers array. */\r\nfunction createModifiers() {\r\n var ret;\r\n if (reusableModifiers != null) {\r\n ret = reusableModifiers;\r\n reusableModifiers = null;\r\n }\r\n else {\r\n ret = [];\r\n }\r\n ret.length = 0;\r\n return ret;\r\n}\r\nexports.createModifiers = createModifiers;\r\n// Utility\r\n/** Adds a modifier to a set of modifiers. Creates a new set if `null`. */\r\nfunction addModifier(modifier, modifiers) {\r\n if (modifiers == null)\r\n modifiers = createModifiers();\r\n modifiers.push(modifier);\r\n return modifiers;\r\n}\r\nexports.addModifier = addModifier;\r\n/** Gets a specific modifier from the specified set of modifiers. */\r\nfunction getModifier(kind, modifiers) {\r\n if (modifiers) {\r\n for (var i = 0, k = modifiers.length; i < k; ++i) {\r\n if (modifiers[i].modifierKind == kind) {\r\n return modifiers[i];\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\nexports.getModifier = getModifier;\r\n/** Tests whether a modifier exists in the specified set of modifiers. */\r\nfunction hasModifier(kind, modifiers) {\r\n return getModifier(kind, modifiers) != null;\r\n}\r\nexports.hasModifier = hasModifier;\r\n/** Gets the first decorator by name within at set of decorators, if present. */\r\nfunction getFirstDecorator(name, decorators) {\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n var expression = decorator.name;\r\n if (expression.kind == NodeKind.IDENTIFIER && expression.text == name) {\r\n return decorator;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\nexports.getFirstDecorator = getFirstDecorator;\r\n/** Tests if a specific decorator is present within the specified decorators. */\r\nfunction hasDecorator(name, decorators) {\r\n return getFirstDecorator(name, decorators) != null;\r\n}\r\nexports.hasDecorator = hasDecorator;\r\n/** Mangles a declaration's name to an internal name. */\r\nfunction mangleInternalName(declaration, asGlobal) {\r\n if (asGlobal === void 0) { asGlobal = false; }\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent)\r\n return name;\r\n if (declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE) {\r\n if (!(parent = parent.parent))\r\n return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (hasModifier(ModifierKind.STATIC, declaration.modifiers)\r\n ? program_1.STATIC_DELIMITER\r\n : program_1.INSTANCE_DELIMITER) + name;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) +\r\n program_1.STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + program_1.PATH_DELIMITER + name;\r\n}\r\nexports.mangleInternalName = mangleInternalName;\r\n/** Mangles an external to an internal path. */\r\nfunction mangleInternalPath(path) {\r\n if (path.endsWith(\".ts\"))\r\n path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\nexports.mangleInternalPath = mangleInternalPath;\r\n// Helpers\r\nfunction setParent(nodes, parent) {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\nfunction setParentOpt(nodes, parent) {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n var node = nodes[i];\r\n if (node)\r\n node.parent = parent;\r\n }\r\n}\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n/*\r\n\r\n This is a modified version of TypeScript's scanner that doesn't perform as much bookkeeping, simply\r\n skips over trivia and provides a more general mark/reset mechanism for the parser to utilize on\r\n ambiguous tokens.\r\n\r\n next() advances the token\r\n peek() peeks for the next token\r\n skip(token) skips over a token if possible\r\n mark() marks at current token\r\n reset() resets to marked state\r\n range() gets the range of the current token\r\n\r\n readFloat() on FLOATLITERAL\r\n readIdentifier() on IDENTIFIER\r\n readInteger() on INTEGERLITERAL\r\n readString() on STRINGLITERAL\r\n\r\n*/\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar charcode_1 = __webpack_require__(9);\r\n/** Named token types. */\r\nvar Token;\r\n(function (Token) {\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n Token[Token[\"ABSTRACT\"] = 0] = \"ABSTRACT\";\r\n Token[Token[\"AS\"] = 1] = \"AS\";\r\n Token[Token[\"ASYNC\"] = 2] = \"ASYNC\";\r\n Token[Token[\"AWAIT\"] = 3] = \"AWAIT\";\r\n Token[Token[\"BREAK\"] = 4] = \"BREAK\";\r\n Token[Token[\"CASE\"] = 5] = \"CASE\";\r\n Token[Token[\"CATCH\"] = 6] = \"CATCH\";\r\n Token[Token[\"CLASS\"] = 7] = \"CLASS\";\r\n Token[Token[\"CONST\"] = 8] = \"CONST\";\r\n Token[Token[\"CONTINUE\"] = 9] = \"CONTINUE\";\r\n Token[Token[\"CONSTRUCTOR\"] = 10] = \"CONSTRUCTOR\";\r\n Token[Token[\"DEBUGGER\"] = 11] = \"DEBUGGER\";\r\n Token[Token[\"DECLARE\"] = 12] = \"DECLARE\";\r\n Token[Token[\"DEFAULT\"] = 13] = \"DEFAULT\";\r\n Token[Token[\"DELETE\"] = 14] = \"DELETE\";\r\n Token[Token[\"DO\"] = 15] = \"DO\";\r\n Token[Token[\"ELSE\"] = 16] = \"ELSE\";\r\n Token[Token[\"ENUM\"] = 17] = \"ENUM\";\r\n Token[Token[\"EXPORT\"] = 18] = \"EXPORT\";\r\n Token[Token[\"EXTENDS\"] = 19] = \"EXTENDS\";\r\n Token[Token[\"FALSE\"] = 20] = \"FALSE\";\r\n Token[Token[\"FINALLY\"] = 21] = \"FINALLY\";\r\n Token[Token[\"FOR\"] = 22] = \"FOR\";\r\n Token[Token[\"FROM\"] = 23] = \"FROM\";\r\n Token[Token[\"FUNCTION\"] = 24] = \"FUNCTION\";\r\n Token[Token[\"GET\"] = 25] = \"GET\";\r\n Token[Token[\"IF\"] = 26] = \"IF\";\r\n Token[Token[\"IMPLEMENTS\"] = 27] = \"IMPLEMENTS\";\r\n Token[Token[\"IMPORT\"] = 28] = \"IMPORT\";\r\n Token[Token[\"IN\"] = 29] = \"IN\";\r\n Token[Token[\"INSTANCEOF\"] = 30] = \"INSTANCEOF\";\r\n Token[Token[\"INTERFACE\"] = 31] = \"INTERFACE\";\r\n Token[Token[\"IS\"] = 32] = \"IS\";\r\n Token[Token[\"KEYOF\"] = 33] = \"KEYOF\";\r\n Token[Token[\"LET\"] = 34] = \"LET\";\r\n Token[Token[\"MODULE\"] = 35] = \"MODULE\";\r\n Token[Token[\"NAMESPACE\"] = 36] = \"NAMESPACE\";\r\n Token[Token[\"NEW\"] = 37] = \"NEW\";\r\n Token[Token[\"NULL\"] = 38] = \"NULL\";\r\n Token[Token[\"OF\"] = 39] = \"OF\";\r\n Token[Token[\"PACKAGE\"] = 40] = \"PACKAGE\";\r\n Token[Token[\"PRIVATE\"] = 41] = \"PRIVATE\";\r\n Token[Token[\"PROTECTED\"] = 42] = \"PROTECTED\";\r\n Token[Token[\"PUBLIC\"] = 43] = \"PUBLIC\";\r\n Token[Token[\"READONLY\"] = 44] = \"READONLY\";\r\n Token[Token[\"RETURN\"] = 45] = \"RETURN\";\r\n Token[Token[\"SET\"] = 46] = \"SET\";\r\n Token[Token[\"STATIC\"] = 47] = \"STATIC\";\r\n Token[Token[\"SUPER\"] = 48] = \"SUPER\";\r\n Token[Token[\"SWITCH\"] = 49] = \"SWITCH\";\r\n Token[Token[\"THIS\"] = 50] = \"THIS\";\r\n Token[Token[\"THROW\"] = 51] = \"THROW\";\r\n Token[Token[\"TRUE\"] = 52] = \"TRUE\";\r\n Token[Token[\"TRY\"] = 53] = \"TRY\";\r\n Token[Token[\"TYPE\"] = 54] = \"TYPE\";\r\n Token[Token[\"TYPEOF\"] = 55] = \"TYPEOF\";\r\n Token[Token[\"VAR\"] = 56] = \"VAR\";\r\n Token[Token[\"VOID\"] = 57] = \"VOID\";\r\n Token[Token[\"WHILE\"] = 58] = \"WHILE\";\r\n Token[Token[\"WITH\"] = 59] = \"WITH\";\r\n Token[Token[\"YIELD\"] = 60] = \"YIELD\";\r\n // punctuation\r\n Token[Token[\"OPENBRACE\"] = 61] = \"OPENBRACE\";\r\n Token[Token[\"CLOSEBRACE\"] = 62] = \"CLOSEBRACE\";\r\n Token[Token[\"OPENPAREN\"] = 63] = \"OPENPAREN\";\r\n Token[Token[\"CLOSEPAREN\"] = 64] = \"CLOSEPAREN\";\r\n Token[Token[\"OPENBRACKET\"] = 65] = \"OPENBRACKET\";\r\n Token[Token[\"CLOSEBRACKET\"] = 66] = \"CLOSEBRACKET\";\r\n Token[Token[\"DOT\"] = 67] = \"DOT\";\r\n Token[Token[\"DOT_DOT_DOT\"] = 68] = \"DOT_DOT_DOT\";\r\n Token[Token[\"SEMICOLON\"] = 69] = \"SEMICOLON\";\r\n Token[Token[\"COMMA\"] = 70] = \"COMMA\";\r\n Token[Token[\"LESSTHAN\"] = 71] = \"LESSTHAN\";\r\n Token[Token[\"GREATERTHAN\"] = 72] = \"GREATERTHAN\";\r\n Token[Token[\"LESSTHAN_EQUALS\"] = 73] = \"LESSTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_EQUALS\"] = 74] = \"GREATERTHAN_EQUALS\";\r\n Token[Token[\"EQUALS_EQUALS\"] = 75] = \"EQUALS_EQUALS\";\r\n Token[Token[\"EXCLAMATION_EQUALS\"] = 76] = \"EXCLAMATION_EQUALS\";\r\n Token[Token[\"EQUALS_EQUALS_EQUALS\"] = 77] = \"EQUALS_EQUALS_EQUALS\";\r\n Token[Token[\"EXCLAMATION_EQUALS_EQUALS\"] = 78] = \"EXCLAMATION_EQUALS_EQUALS\";\r\n Token[Token[\"EQUALS_GREATERTHAN\"] = 79] = \"EQUALS_GREATERTHAN\";\r\n Token[Token[\"PLUS\"] = 80] = \"PLUS\";\r\n Token[Token[\"MINUS\"] = 81] = \"MINUS\";\r\n Token[Token[\"ASTERISK_ASTERISK\"] = 82] = \"ASTERISK_ASTERISK\";\r\n Token[Token[\"ASTERISK\"] = 83] = \"ASTERISK\";\r\n Token[Token[\"SLASH\"] = 84] = \"SLASH\";\r\n Token[Token[\"PERCENT\"] = 85] = \"PERCENT\";\r\n Token[Token[\"PLUS_PLUS\"] = 86] = \"PLUS_PLUS\";\r\n Token[Token[\"MINUS_MINUS\"] = 87] = \"MINUS_MINUS\";\r\n Token[Token[\"LESSTHAN_LESSTHAN\"] = 88] = \"LESSTHAN_LESSTHAN\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN\"] = 89] = \"GREATERTHAN_GREATERTHAN\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_GREATERTHAN\"] = 90] = \"GREATERTHAN_GREATERTHAN_GREATERTHAN\";\r\n Token[Token[\"AMPERSAND\"] = 91] = \"AMPERSAND\";\r\n Token[Token[\"BAR\"] = 92] = \"BAR\";\r\n Token[Token[\"CARET\"] = 93] = \"CARET\";\r\n Token[Token[\"EXCLAMATION\"] = 94] = \"EXCLAMATION\";\r\n Token[Token[\"TILDE\"] = 95] = \"TILDE\";\r\n Token[Token[\"AMPERSAND_AMPERSAND\"] = 96] = \"AMPERSAND_AMPERSAND\";\r\n Token[Token[\"BAR_BAR\"] = 97] = \"BAR_BAR\";\r\n Token[Token[\"QUESTION\"] = 98] = \"QUESTION\";\r\n Token[Token[\"COLON\"] = 99] = \"COLON\";\r\n Token[Token[\"EQUALS\"] = 100] = \"EQUALS\";\r\n Token[Token[\"PLUS_EQUALS\"] = 101] = \"PLUS_EQUALS\";\r\n Token[Token[\"MINUS_EQUALS\"] = 102] = \"MINUS_EQUALS\";\r\n Token[Token[\"ASTERISK_EQUALS\"] = 103] = \"ASTERISK_EQUALS\";\r\n Token[Token[\"ASTERISK_ASTERISK_EQUALS\"] = 104] = \"ASTERISK_ASTERISK_EQUALS\";\r\n Token[Token[\"SLASH_EQUALS\"] = 105] = \"SLASH_EQUALS\";\r\n Token[Token[\"PERCENT_EQUALS\"] = 106] = \"PERCENT_EQUALS\";\r\n Token[Token[\"LESSTHAN_LESSTHAN_EQUALS\"] = 107] = \"LESSTHAN_LESSTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_EQUALS\"] = 108] = \"GREATERTHAN_GREATERTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS\"] = 109] = \"GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS\";\r\n Token[Token[\"AMPERSAND_EQUALS\"] = 110] = \"AMPERSAND_EQUALS\";\r\n Token[Token[\"BAR_EQUALS\"] = 111] = \"BAR_EQUALS\";\r\n Token[Token[\"CARET_EQUALS\"] = 112] = \"CARET_EQUALS\";\r\n Token[Token[\"AT\"] = 113] = \"AT\";\r\n // literals\r\n Token[Token[\"IDENTIFIER\"] = 114] = \"IDENTIFIER\";\r\n Token[Token[\"STRINGLITERAL\"] = 115] = \"STRINGLITERAL\";\r\n Token[Token[\"INTEGERLITERAL\"] = 116] = \"INTEGERLITERAL\";\r\n Token[Token[\"FLOATLITERAL\"] = 117] = \"FLOATLITERAL\";\r\n // meta\r\n Token[Token[\"INVALID\"] = 118] = \"INVALID\";\r\n Token[Token[\"ENDOFFILE\"] = 119] = \"ENDOFFILE\";\r\n})(Token = exports.Token || (exports.Token = {}));\r\n(function (Token) {\r\n function fromKeyword(text) {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n case \"break\": return Token.BREAK;\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n case \"get\": return Token.GET;\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n case \"keyof\": return Token.KEYOF;\r\n case \"let\": return Token.LET;\r\n case \"module\": return Token.MODULE;\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n case \"of\": return Token.OF;\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n case \"yield\": return Token.YIELD;\r\n default: return Token.INVALID;\r\n }\r\n }\r\n Token.fromKeyword = fromKeyword;\r\n function isAlsoIdentifier(token) {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n Token.isAlsoIdentifier = isAlsoIdentifier;\r\n})(Token = exports.Token || (exports.Token = {}));\r\nvar Range = /** @class */ (function () {\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n function Range(source, start, end) {\r\n this.debugInfoRef = 0;\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n Range.join = function (a, b) {\r\n if (a.source != b.source)\r\n throw new Error(\"source mismatch\");\r\n return new Range(a.source, a.start < b.start ? a.start : b.start, a.end > b.end ? a.end : b.end);\r\n };\r\n Object.defineProperty(Range.prototype, \"atStart\", {\r\n get: function () {\r\n return new Range(this.source, this.start, this.start);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"atEnd\", {\r\n get: function () {\r\n return new Range(this.source, this.end, this.end);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"line\", {\r\n get: function () {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var line = 1;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == 10 /* LINEFEED */) {\r\n line++;\r\n }\r\n }\r\n return line;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"column\", {\r\n get: function () {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var column = 0;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == 10 /* LINEFEED */)\r\n break;\r\n column++;\r\n }\r\n return column;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Range.prototype.toString = function () {\r\n return this.source.text.substring(this.start, this.end);\r\n };\r\n return Range;\r\n}());\r\nexports.Range = Range;\r\nvar Tokenizer = /** @class */ (function (_super) {\r\n __extends(Tokenizer, _super);\r\n function Tokenizer(source, diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n var _this = _super.call(this, diagnostics) || this;\r\n _this.end = 0;\r\n _this.pos = 0;\r\n _this.token = -1;\r\n _this.tokenPos = 0;\r\n _this.markedPos = 0;\r\n _this.markedToken = -1;\r\n _this.markedTokenPos = 0;\r\n _this.nextToken = -1;\r\n _this.nextTokenOnNewLine = false;\r\n _this.source = source;\r\n _this.pos = 0;\r\n _this.end = source.text.length;\r\n _this.diagnostics = diagnostics ? diagnostics : new Array();\r\n var text = source.text;\r\n // skip bom\r\n if (_this.pos < _this.end &&\r\n text.charCodeAt(_this.pos) == 65279 /* BYTEORDERMARK */) {\r\n ++_this.pos;\r\n }\r\n // skip shebang\r\n if (_this.pos + 1 < _this.end &&\r\n text.charCodeAt(_this.pos) == 35 /* HASH */ &&\r\n text.charCodeAt(_this.pos + 1) == 33 /* EXCLAMATION */) {\r\n _this.pos += 2;\r\n while (_this.pos < _this.end &&\r\n text.charCodeAt(_this.pos) != 10 /* LINEFEED */) {\r\n ++_this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n return _this;\r\n }\r\n Tokenizer.prototype.next = function (preferIdentifier) {\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(preferIdentifier);\r\n };\r\n Tokenizer.prototype.unsafeNext = function (preferIdentifier, maxTokenLength) {\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n if (maxTokenLength === void 0) { maxTokenLength = i32.MAX_VALUE; }\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n var c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n case 13 /* CARRIAGERETURN */:\r\n if (++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 10 /* LINEFEED */) {\r\n ++this.pos;\r\n }\r\n break;\r\n case 10 /* LINEFEED */:\r\n case 9 /* TAB */:\r\n case 11 /* VERTICALTAB */:\r\n case 12 /* FORMFEED */:\r\n case 32 /* SPACE */:\r\n ++this.pos;\r\n break;\r\n case 33 /* EXCLAMATION */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n case 34 /* DOUBLEQUOTE */:\r\n case 39 /* SINGLEQUOTE */:\r\n case 96 /* BACKTICK */:// TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n case 37 /* PERCENT */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n case 38 /* AMPERSAND */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 38 /* AMPERSAND */) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n case 40 /* OPENPAREN */:\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n case 41 /* CLOSEPAREN */:\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n case 42 /* ASTERISK */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == 42 /* ASTERISK */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n case 43 /* PLUS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 43 /* PLUS */) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n case 44 /* COMMA */:\r\n ++this.pos;\r\n return Token.COMMA;\r\n case 45 /* MINUS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 45 /* MINUS */) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n case 46 /* DOT */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == 46 /* DOT */ &&\r\n text.charCodeAt(this.pos + 1) == 46 /* DOT */) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n case 47 /* SLASH */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 47 /* SLASH */) {\r\n // TODO: triple-slash?\r\n // if (\r\n // this.pos + 1 < this.end &&\r\n // text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n // ) {\r\n // }\r\n while (++this.pos < this.end) {\r\n if (charcode_1.isLineBreak(text.charCodeAt(this.pos)))\r\n break;\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == 42 /* ASTERISK */) {\r\n var closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (c == 42 /* ASTERISK */ &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == 47 /* SLASH */) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, this.range(this.pos), \"*/\");\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n case 48 /* _0 */:\r\n case 49 /* _1 */:\r\n case 50 /* _2 */:\r\n case 51 /* _3 */:\r\n case 52 /* _4 */:\r\n case 53 /* _5 */:\r\n case 54 /* _6 */:\r\n case 55 /* _7 */:\r\n case 56 /* _8 */:\r\n case 57 /* _9 */:\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n case 58 /* COLON */:\r\n ++this.pos;\r\n return Token.COLON;\r\n case 59 /* SEMICOLON */:\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n case 60 /* LESSTHAN */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 60 /* LESSTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n case 61 /* EQUALS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n case 62 /* GREATERTHAN */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n case 63 /* QUESTION */:\r\n ++this.pos;\r\n return Token.QUESTION;\r\n case 91 /* OPENBRACKET */:\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n case 93 /* CLOSEBRACKET */:\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n case 94 /* CARET */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n case 123 /* OPENBRACE */:\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n case 124 /* BAR */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 124 /* BAR */) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n case 125 /* CLOSEBRACE */:\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n case 126 /* TILDE */:\r\n ++this.pos;\r\n return Token.TILDE;\r\n case 64 /* AT */:\r\n ++this.pos;\r\n return Token.AT;\r\n default:\r\n if (charcode_1.isIdentifierStart(c)) {\r\n if (charcode_1.isKeywordCharacter(c)) {\r\n var posBefore = this.pos;\r\n while (++this.pos < this.end &&\r\n charcode_1.isIdentifierPart(c = text.charCodeAt(this.pos))) {\r\n if (!charcode_1.isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n var keywordText = text.substring(posBefore, this.pos);\r\n var keywordToken = Token.fromKeyword(keywordText);\r\n if (keywordToken != Token.INVALID &&\r\n !(preferIdentifier && Token.isAlsoIdentifier(keywordToken))) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n }\r\n else if (charcode_1.isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Invalid_character, this.range(this.pos, this.pos + 1));\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n };\r\n Tokenizer.prototype.peek = function (checkOnNewLine, preferIdentifier, maxCompoundLength) {\r\n if (checkOnNewLine === void 0) { checkOnNewLine = false; }\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n if (maxCompoundLength === void 0) { maxCompoundLength = i32.MAX_VALUE; }\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(preferIdentifier, maxCompoundLength);\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n while (--this.tokenPos > posBefore) {\r\n if (charcode_1.isLineBreak(text.charCodeAt(this.tokenPos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n };\r\n Tokenizer.prototype.skip = function (token) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN:// where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n this.token = this.unsafeNext(token == Token.IDENTIFIER, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n }\r\n else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n };\r\n // skipUntil(token1: Token, token2: Token = -1): bool {\r\n // var next: Token;\r\n // do {\r\n // if ((next = this.peek()) == Token.ENDOFFILE)\r\n // return false;\r\n // if (next == token1 || next == token2)\r\n // return true;\r\n // this.next();\r\n // } while (true);\r\n // }\r\n Tokenizer.prototype.mark = function () {\r\n this.markedPos = this.pos;\r\n this.markedToken = this.token;\r\n this.markedTokenPos = this.tokenPos;\r\n };\r\n Tokenizer.prototype.reset = function () {\r\n this.pos = this.markedPos;\r\n this.token = this.markedToken;\r\n this.tokenPos = this.markedTokenPos;\r\n this.nextToken = -1;\r\n };\r\n Tokenizer.prototype.range = function (start, end) {\r\n if (start === void 0) { start = -1; }\r\n if (end === void 0) { end = -1; }\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n }\r\n else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n };\r\n Tokenizer.prototype.readIdentifier = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (++this.pos < this.end &&\r\n charcode_1.isIdentifierPart(text.charCodeAt(this.pos)))\r\n ;\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.readString = function () {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_string_literal, this.range(start - 1, this.end));\r\n break;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == 92 /* BACKSLASH */) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (charcode_1.isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_string_literal, this.range(start - 1, this.pos));\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n };\r\n Tokenizer.prototype.readEscapeSequence = function () {\r\n if (++this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(this.end));\r\n return \"\";\r\n }\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n case 48 /* _0 */:\r\n return \"\\0\";\r\n case 98 /* b */:\r\n return \"\\b\";\r\n case 116 /* t */:\r\n return \"\\t\";\r\n case 110 /* n */:\r\n return \"\\n\";\r\n case 118 /* v */:\r\n return \"\\v\";\r\n case 102 /* f */:\r\n return \"\\f\";\r\n case 114 /* r */:\r\n return \"\\r\";\r\n case 39 /* SINGLEQUOTE */:\r\n return \"'\";\r\n case 34 /* DOUBLEQUOTE */:\r\n return \"\\\"\";\r\n case 117 /* u */: {\r\n if (this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 123 /* OPENBRACE */) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n case 13 /* CARRIAGERETURN */:\r\n if (this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 10 /* LINEFEED */) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n case 10 /* LINEFEED */:\r\n case 8232 /* LINESEPARATOR */:\r\n case 8233 /* PARAGRAPHSEPARATOR */:\r\n return \"\";\r\n default:\r\n return String.fromCharCode(c);\r\n }\r\n };\r\n Tokenizer.prototype.readRegexpPattern = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_regular_expression_literal, this.range(start, this.end));\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == 92 /* BACKSLASH */) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 47 /* SLASH */ && !escaped)\r\n break;\r\n if (charcode_1.isLineBreak(c)) {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_regular_expression_literal, this.range(start, this.pos));\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.readRegexpFlags = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (!charcode_1.isIdentifierPart(c))\r\n break;\r\n ++this.pos;\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n case 103 /* g */:\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n case 105 /* i */:\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n case 109 /* m */:\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n default:\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(diagnostics_1.DiagnosticCode.Invalid_regular_expression_flags, this.range(start, this.pos));\r\n }\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.testInteger = function () {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == 48 /* _0 */ && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case 88 /* X */:\r\n case 120 /* x */:\r\n case 66 /* B */:\r\n case 98 /* b */:\r\n case 79 /* O */:\r\n case 111 /* o */:\r\n return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n var c = text.charCodeAt(pos);\r\n if (c == 46 /* DOT */ || c == 69 /* E */ || c == 101 /* e */) {\r\n return false;\r\n }\r\n if (c < 48 /* _0 */ || c > 57 /* _9 */)\r\n break;\r\n pos++;\r\n }\r\n return true;\r\n };\r\n Tokenizer.prototype.readInteger = function () {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == 48 /* _0 */ && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n case 88 /* X */:\r\n case 120 /* x */:\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n case 66 /* B */:\r\n case 98 /* b */:\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n case 79 /* O */:\r\n case 111 /* o */:\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n if (charcode_1.isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n var start = this.pos;\r\n ++this.pos;\r\n var value = this.readOctalInteger();\r\n this.error(diagnostics_1.DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode, this.range(start, this.pos));\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n };\r\n Tokenizer.prototype.readHexInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else if (c >= 65 /* A */ && c <= 70 /* F */) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(10 + c - 65 /* A */, 0));\r\n }\r\n else if (c >= 97 /* a */ && c <= 102 /* f */) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(10 + c - 97 /* a */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Hexadecimal_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readDecimalInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_10), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readOctalInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 55 /* _7 */) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_8), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Octal_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readBinaryInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 48 /* _0 */) {\r\n // value = value * 2;\r\n value = i64_mul(value, i64_2);\r\n }\r\n else if (c == 49 /* _1 */) {\r\n // value = value * 2 + 1;\r\n value = i64_add(i64_mul(value, i64_2), i64_1);\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Binary_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readFloat = function () {\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == 46 /* DOT */) {\r\n ++this.pos;\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 69 /* E */ || c == 101 /* e */) {\r\n if (++this.pos < this.end && (text.charCodeAt(this.pos) == 45 /* MINUS */ ||\r\n text.charCodeAt(this.pos) == 43 /* PLUS */) &&\r\n charcode_1.isDecimalDigit(text.charCodeAt(this.pos + 1))) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n };\r\n Tokenizer.prototype.readUnicodeEscape = function () {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos++);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n value = value * 16 + c - 48 /* _0 */;\r\n }\r\n else if (c >= 65 /* A */ && c <= 70 /* F */) {\r\n value = value * 16 + 10 + c - 65 /* A */;\r\n }\r\n else if (c >= 97 /* a */ && c <= 102 /* f */) {\r\n value = value * 16 + 10 + c - 97 /* a */;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Hexadecimal_digit_expected, this.range(this.pos - 1, this.pos));\r\n return \"\";\r\n }\r\n if (--remain == 0)\r\n break;\r\n }\r\n if (remain) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(this.pos));\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n };\r\n Tokenizer.prototype.readExtendedUnicodeEscape = function () {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(diagnostics_1.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive, this.range(start, this.pos));\r\n invalid = true;\r\n }\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(start, this.end));\r\n invalid = true;\r\n }\r\n else if (text.charCodeAt(this.pos) == 125 /* CLOSEBRACE */) {\r\n ++this.pos;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_Unicode_escape_sequence, this.range(start, this.pos));\r\n invalid = true;\r\n }\r\n if (invalid)\r\n return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode((((value32 - 65536) / 1024 | 0) + 0xD800), ((value32 - 65536) % 1024 + 0xDC00));\r\n };\r\n Tokenizer.prototype.finish = function () {\r\n };\r\n return Tokenizer;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Tokenizer = Tokenizer;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n// code below is generated from diagnosticsMessages.json by scripts/build-diagnostics\r\n/* tslint:disable:max-line-length */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar DiagnosticCode;\r\n(function (DiagnosticCode) {\r\n DiagnosticCode[DiagnosticCode[\"Operation_not_supported\"] = 100] = \"Operation_not_supported\";\r\n DiagnosticCode[DiagnosticCode[\"Operation_is_unsafe\"] = 101] = \"Operation_is_unsafe\";\r\n DiagnosticCode[DiagnosticCode[\"Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast\"] = 200] = \"Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast\";\r\n DiagnosticCode[DiagnosticCode[\"Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit\"] = 201] = \"Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_cannot_be_changed_to_type_1\"] = 202] = \"Type_0_cannot_be_changed_to_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_cannot_be_reinterpreted_as_type_1\"] = 203] = \"Type_0_cannot_be_reinterpreted_as_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Basic_type_0_cannot_be_nullable\"] = 204] = \"Basic_type_0_cannot_be_nullable\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_export_a_mutable_global\"] = 205] = \"Cannot_export_a_mutable_global\";\r\n DiagnosticCode[DiagnosticCode[\"Compiling_constant_with_non_constant_initializer_as_mutable\"] = 206] = \"Compiling_constant_with_non_constant_initializer_as_mutable\";\r\n DiagnosticCode[DiagnosticCode[\"Structs_cannot_extend_classes_and_vice_versa\"] = 207] = \"Structs_cannot_extend_classes_and_vice_versa\";\r\n DiagnosticCode[DiagnosticCode[\"Structs_cannot_implement_interfaces\"] = 208] = \"Structs_cannot_implement_interfaces\";\r\n DiagnosticCode[DiagnosticCode[\"Invalid_regular_expression_flags\"] = 209] = \"Invalid_regular_expression_flags\";\r\n DiagnosticCode[DiagnosticCode[\"Implementation_0_must_match_the_signature_1\"] = 210] = \"Implementation_0_must_match_the_signature_1\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_string_literal\"] = 1002] = \"Unterminated_string_literal\";\r\n DiagnosticCode[DiagnosticCode[\"Identifier_expected\"] = 1003] = \"Identifier_expected\";\r\n DiagnosticCode[DiagnosticCode[\"_0_expected\"] = 1005] = \"_0_expected\";\r\n DiagnosticCode[DiagnosticCode[\"A_file_cannot_have_a_reference_to_itself\"] = 1006] = \"A_file_cannot_have_a_reference_to_itself\";\r\n DiagnosticCode[DiagnosticCode[\"Trailing_comma_not_allowed\"] = 1009] = \"Trailing_comma_not_allowed\";\r\n DiagnosticCode[DiagnosticCode[\"Unexpected_token\"] = 1012] = \"Unexpected_token\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_must_be_last_in_a_parameter_list\"] = 1014] = \"A_rest_parameter_must_be_last_in_a_parameter_list\";\r\n DiagnosticCode[DiagnosticCode[\"Parameter_cannot_have_question_mark_and_initializer\"] = 1015] = \"Parameter_cannot_have_question_mark_and_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_required_parameter_cannot_follow_an_optional_parameter\"] = 1016] = \"A_required_parameter_cannot_follow_an_optional_parameter\";\r\n DiagnosticCode[DiagnosticCode[\"Enum_member_must_have_initializer\"] = 1061] = \"Enum_member_must_have_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"Statements_are_not_allowed_in_ambient_contexts\"] = 1036] = \"Statements_are_not_allowed_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"Initializers_are_not_allowed_in_ambient_contexts\"] = 1039] = \"Initializers_are_not_allowed_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"_0_modifier_cannot_be_used_here\"] = 1042] = \"_0_modifier_cannot_be_used_here\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_cannot_be_optional\"] = 1047] = \"A_rest_parameter_cannot_be_optional\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_cannot_have_an_initializer\"] = 1048] = \"A_rest_parameter_cannot_have_an_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_must_have_exactly_one_parameter\"] = 1049] = \"A_set_accessor_must_have_exactly_one_parameter\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_parameter_cannot_have_an_initializer\"] = 1052] = \"A_set_accessor_parameter_cannot_have_an_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_get_accessor_cannot_have_parameters\"] = 1054] = \"A_get_accessor_cannot_have_parameters\";\r\n DiagnosticCode[DiagnosticCode[\"Type_parameters_cannot_appear_on_a_constructor_declaration\"] = 1092] = \"Type_parameters_cannot_appear_on_a_constructor_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"Type_annotation_cannot_appear_on_a_constructor_declaration\"] = 1093] = \"Type_annotation_cannot_appear_on_a_constructor_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"An_accessor_cannot_have_type_parameters\"] = 1094] = \"An_accessor_cannot_have_type_parameters\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_cannot_have_a_return_type_annotation\"] = 1095] = \"A_set_accessor_cannot_have_a_return_type_annotation\";\r\n DiagnosticCode[DiagnosticCode[\"Type_parameter_list_cannot_be_empty\"] = 1098] = \"Type_parameter_list_cannot_be_empty\";\r\n DiagnosticCode[DiagnosticCode[\"A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement\"] = 1104] = \"A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement\";\r\n DiagnosticCode[DiagnosticCode[\"A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement\"] = 1105] = \"A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement\";\r\n DiagnosticCode[DiagnosticCode[\"A_return_statement_can_only_be_used_within_a_function_body\"] = 1108] = \"A_return_statement_can_only_be_used_within_a_function_body\";\r\n DiagnosticCode[DiagnosticCode[\"Expression_expected\"] = 1109] = \"Expression_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Type_expected\"] = 1110] = \"Type_expected\";\r\n DiagnosticCode[DiagnosticCode[\"A_default_clause_cannot_appear_more_than_once_in_a_switch_statement\"] = 1113] = \"A_default_clause_cannot_appear_more_than_once_in_a_switch_statement\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_label_0\"] = 1114] = \"Duplicate_label_0\";\r\n DiagnosticCode[DiagnosticCode[\"Octal_literals_are_not_allowed_in_strict_mode\"] = 1121] = \"Octal_literals_are_not_allowed_in_strict_mode\";\r\n DiagnosticCode[DiagnosticCode[\"Digit_expected\"] = 1124] = \"Digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Hexadecimal_digit_expected\"] = 1125] = \"Hexadecimal_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Unexpected_end_of_text\"] = 1126] = \"Unexpected_end_of_text\";\r\n DiagnosticCode[DiagnosticCode[\"Invalid_character\"] = 1127] = \"Invalid_character\";\r\n DiagnosticCode[DiagnosticCode[\"_case_or_default_expected\"] = 1130] = \"_case_or_default_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Type_argument_expected\"] = 1140] = \"Type_argument_expected\";\r\n DiagnosticCode[DiagnosticCode[\"String_literal_expected\"] = 1141] = \"String_literal_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Line_break_not_permitted_here\"] = 1142] = \"Line_break_not_permitted_here\";\r\n DiagnosticCode[DiagnosticCode[\"Declaration_expected\"] = 1146] = \"Declaration_expected\";\r\n DiagnosticCode[DiagnosticCode[\"_const_declarations_must_be_initialized\"] = 1155] = \"_const_declarations_must_be_initialized\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_regular_expression_literal\"] = 1161] = \"Unterminated_regular_expression_literal\";\r\n DiagnosticCode[DiagnosticCode[\"Binary_digit_expected\"] = 1177] = \"Binary_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Octal_digit_expected\"] = 1178] = \"Octal_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"An_implementation_cannot_be_declared_in_ambient_contexts\"] = 1183] = \"An_implementation_cannot_be_declared_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive\"] = 1198] = \"An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_Unicode_escape_sequence\"] = 1199] = \"Unterminated_Unicode_escape_sequence\";\r\n DiagnosticCode[DiagnosticCode[\"Decorators_are_not_valid_here\"] = 1206] = \"Decorators_are_not_valid_here\";\r\n DiagnosticCode[DiagnosticCode[\"_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration\"] = 1242] = \"_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"A_class_may_only_extend_another_class\"] = 1311] = \"A_class_may_only_extend_another_class\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_identifier_0\"] = 2300] = \"Duplicate_identifier_0\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_find_name_0\"] = 2304] = \"Cannot_find_name_0\";\r\n DiagnosticCode[DiagnosticCode[\"Module_0_has_no_exported_member_1\"] = 2305] = \"Module_0_has_no_exported_member_1\";\r\n DiagnosticCode[DiagnosticCode[\"Generic_type_0_requires_1_type_argument_s\"] = 2314] = \"Generic_type_0_requires_1_type_argument_s\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_is_not_generic\"] = 2315] = \"Type_0_is_not_generic\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_is_not_assignable_to_type_1\"] = 2322] = \"Type_0_is_not_assignable_to_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Index_signature_is_missing_in_type_0\"] = 2329] = \"Index_signature_is_missing_in_type_0\";\r\n DiagnosticCode[DiagnosticCode[\"_this_cannot_be_referenced_in_current_location\"] = 2332] = \"_this_cannot_be_referenced_in_current_location\";\r\n DiagnosticCode[DiagnosticCode[\"_super_can_only_be_referenced_in_a_derived_class\"] = 2335] = \"_super_can_only_be_referenced_in_a_derived_class\";\r\n DiagnosticCode[DiagnosticCode[\"Property_0_does_not_exist_on_type_1\"] = 2339] = \"Property_0_does_not_exist_on_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures\"] = 2349] = \"Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature\"] = 2351] = \"Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature\";\r\n DiagnosticCode[DiagnosticCode[\"A_function_whose_declared_type_is_not_void_must_return_a_value\"] = 2355] = \"A_function_whose_declared_type_is_not_void_must_return_a_value\";\r\n DiagnosticCode[DiagnosticCode[\"The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access\"] = 2357] = \"The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access\"] = 2364] = \"The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"_get_and_set_accessor_must_have_the_same_type\"] = 2380] = \"_get_and_set_accessor_must_have_the_same_type\";\r\n DiagnosticCode[DiagnosticCode[\"Constructor_implementation_is_missing\"] = 2390] = \"Constructor_implementation_is_missing\";\r\n DiagnosticCode[DiagnosticCode[\"Function_implementation_is_missing_or_not_immediately_following_the_declaration\"] = 2391] = \"Function_implementation_is_missing_or_not_immediately_following_the_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"Multiple_constructor_implementations_are_not_allowed\"] = 2392] = \"Multiple_constructor_implementations_are_not_allowed\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_function_implementation\"] = 2393] = \"Duplicate_function_implementation\";\r\n DiagnosticCode[DiagnosticCode[\"Export_declaration_conflicts_with_exported_declaration_of_0\"] = 2484] = \"Export_declaration_conflicts_with_exported_declaration_of_0\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property\"] = 2540] = \"Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property\";\r\n DiagnosticCode[DiagnosticCode[\"The_target_of_an_assignment_must_be_a_variable_or_a_property_access\"] = 2541] = \"The_target_of_an_assignment_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"Index_signature_in_type_0_only_permits_reading\"] = 2542] = \"Index_signature_in_type_0_only_permits_reading\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_0_arguments_but_got_1\"] = 2554] = \"Expected_0_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_at_least_0_arguments_but_got_1\"] = 2555] = \"Expected_at_least_0_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_0_type_arguments_but_got_1\"] = 2558] = \"Expected_0_type_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums\"] = 2651] = \"A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums\";\r\n DiagnosticCode[DiagnosticCode[\"Namespace_0_has_no_exported_member_1\"] = 2694] = \"Namespace_0_has_no_exported_member_1\";\r\n DiagnosticCode[DiagnosticCode[\"File_0_not_found\"] = 6054] = \"File_0_not_found\";\r\n})(DiagnosticCode = exports.DiagnosticCode || (exports.DiagnosticCode = {}));\r\nfunction diagnosticCodeToString(code) {\r\n switch (code) {\r\n case 100: return \"Operation not supported.\";\r\n case 101: return \"Operation is unsafe.\";\r\n case 200: return \"Conversion from type '{0}' to '{1}' possibly loses information and thus requires an explicit cast.\";\r\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\r\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\r\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\r\n case 204: return \"Basic type '{0}' cannot be nullable.\";\r\n case 205: return \"Cannot export a mutable global.\";\r\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\r\n case 207: return \"Structs cannot extend classes and vice-versa.\";\r\n case 208: return \"Structs cannot implement interfaces.\";\r\n case 209: return \"Invalid regular expression flags.\";\r\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\r\n case 1002: return \"Unterminated string literal.\";\r\n case 1003: return \"Identifier expected.\";\r\n case 1005: return \"'{0}' expected.\";\r\n case 1006: return \"A file cannot have a reference to itself.\";\r\n case 1009: return \"Trailing comma not allowed.\";\r\n case 1012: return \"Unexpected token.\";\r\n case 1014: return \"A rest parameter must be last in a parameter list.\";\r\n case 1015: return \"Parameter cannot have question mark and initializer.\";\r\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\r\n case 1061: return \"Enum member must have initializer.\";\r\n case 1036: return \"Statements are not allowed in ambient contexts.\";\r\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\r\n case 1042: return \"'{0}' modifier cannot be used here.\";\r\n case 1047: return \"A rest parameter cannot be optional.\";\r\n case 1048: return \"A rest parameter cannot have an initializer.\";\r\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\r\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\r\n case 1054: return \"A 'get' accessor cannot have parameters.\";\r\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\r\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\r\n case 1094: return \"An accessor cannot have type parameters.\";\r\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\r\n case 1098: return \"Type parameter list cannot be empty.\";\r\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\r\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\r\n case 1108: return \"A 'return' statement can only be used within a function body.\";\r\n case 1109: return \"Expression expected.\";\r\n case 1110: return \"Type expected.\";\r\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\r\n case 1114: return \"Duplicate label '{0}'.\";\r\n case 1121: return \"Octal literals are not allowed in strict mode.\";\r\n case 1124: return \"Digit expected.\";\r\n case 1125: return \"Hexadecimal digit expected.\";\r\n case 1126: return \"Unexpected end of text.\";\r\n case 1127: return \"Invalid character.\";\r\n case 1130: return \"'case' or 'default' expected.\";\r\n case 1140: return \"Type argument expected.\";\r\n case 1141: return \"String literal expected.\";\r\n case 1142: return \"Line break not permitted here.\";\r\n case 1146: return \"Declaration expected.\";\r\n case 1155: return \"'const' declarations must be initialized.\";\r\n case 1161: return \"Unterminated regular expression literal.\";\r\n case 1177: return \"Binary digit expected.\";\r\n case 1178: return \"Octal digit expected.\";\r\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\r\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\r\n case 1199: return \"Unterminated Unicode escape sequence.\";\r\n case 1206: return \"Decorators are not valid here.\";\r\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\r\n case 1311: return \"A class may only extend another class.\";\r\n case 2300: return \"Duplicate identifier '{0}'.\";\r\n case 2304: return \"Cannot find name '{0}'.\";\r\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\r\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\r\n case 2315: return \"Type '{0}' is not generic.\";\r\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\r\n case 2329: return \"Index signature is missing in type '{0}'.\";\r\n case 2332: return \"'this' cannot be referenced in current location.\";\r\n case 2335: return \"'super' can only be referenced in a derived class.\";\r\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\r\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\r\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\r\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\r\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\r\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\r\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\r\n case 2390: return \"Constructor implementation is missing.\";\r\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\r\n case 2392: return \"Multiple constructor implementations are not allowed.\";\r\n case 2393: return \"Duplicate function implementation.\";\r\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\r\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\r\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\r\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\r\n case 2554: return \"Expected {0} arguments, but got {1}.\";\r\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\r\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\r\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\r\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\r\n case 6054: return \"File '{0}' not found.\";\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCodeToString = diagnosticCodeToString;\r\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/** An enum of named character codes. */\r\nvar CharCode;\r\n(function (CharCode) {\r\n CharCode[CharCode[\"NULL\"] = 0] = \"NULL\";\r\n CharCode[CharCode[\"LINEFEED\"] = 10] = \"LINEFEED\";\r\n CharCode[CharCode[\"CARRIAGERETURN\"] = 13] = \"CARRIAGERETURN\";\r\n CharCode[CharCode[\"LINESEPARATOR\"] = 8232] = \"LINESEPARATOR\";\r\n CharCode[CharCode[\"PARAGRAPHSEPARATOR\"] = 8233] = \"PARAGRAPHSEPARATOR\";\r\n CharCode[CharCode[\"NEXTLINE\"] = 133] = \"NEXTLINE\";\r\n CharCode[CharCode[\"SPACE\"] = 32] = \"SPACE\";\r\n CharCode[CharCode[\"NONBREAKINGSPACE\"] = 160] = \"NONBREAKINGSPACE\";\r\n CharCode[CharCode[\"ENQUAD\"] = 8192] = \"ENQUAD\";\r\n CharCode[CharCode[\"EMQUAD\"] = 8193] = \"EMQUAD\";\r\n CharCode[CharCode[\"ENSPACE\"] = 8194] = \"ENSPACE\";\r\n CharCode[CharCode[\"EMSPACE\"] = 8195] = \"EMSPACE\";\r\n CharCode[CharCode[\"THREEPEREMSPACE\"] = 8196] = \"THREEPEREMSPACE\";\r\n CharCode[CharCode[\"FOURPEREMSPACE\"] = 8197] = \"FOURPEREMSPACE\";\r\n CharCode[CharCode[\"SIXPEREMSPACE\"] = 8198] = \"SIXPEREMSPACE\";\r\n CharCode[CharCode[\"FIGURESPACE\"] = 8199] = \"FIGURESPACE\";\r\n CharCode[CharCode[\"PUNCTUATIONSPACE\"] = 8200] = \"PUNCTUATIONSPACE\";\r\n CharCode[CharCode[\"THINSPACE\"] = 8201] = \"THINSPACE\";\r\n CharCode[CharCode[\"HAIRSPACE\"] = 8202] = \"HAIRSPACE\";\r\n CharCode[CharCode[\"ZEROWIDTHSPACE\"] = 8203] = \"ZEROWIDTHSPACE\";\r\n CharCode[CharCode[\"NARROWNOBREAKSPACE\"] = 8239] = \"NARROWNOBREAKSPACE\";\r\n CharCode[CharCode[\"IDEOGRAPHICSPACE\"] = 12288] = \"IDEOGRAPHICSPACE\";\r\n CharCode[CharCode[\"MATHEMATICALSPACE\"] = 8287] = \"MATHEMATICALSPACE\";\r\n CharCode[CharCode[\"OGHAM\"] = 5760] = \"OGHAM\";\r\n CharCode[CharCode[\"_\"] = 95] = \"_\";\r\n CharCode[CharCode[\"_0\"] = 48] = \"_0\";\r\n CharCode[CharCode[\"_1\"] = 49] = \"_1\";\r\n CharCode[CharCode[\"_2\"] = 50] = \"_2\";\r\n CharCode[CharCode[\"_3\"] = 51] = \"_3\";\r\n CharCode[CharCode[\"_4\"] = 52] = \"_4\";\r\n CharCode[CharCode[\"_5\"] = 53] = \"_5\";\r\n CharCode[CharCode[\"_6\"] = 54] = \"_6\";\r\n CharCode[CharCode[\"_7\"] = 55] = \"_7\";\r\n CharCode[CharCode[\"_8\"] = 56] = \"_8\";\r\n CharCode[CharCode[\"_9\"] = 57] = \"_9\";\r\n CharCode[CharCode[\"a\"] = 97] = \"a\";\r\n CharCode[CharCode[\"b\"] = 98] = \"b\";\r\n CharCode[CharCode[\"c\"] = 99] = \"c\";\r\n CharCode[CharCode[\"d\"] = 100] = \"d\";\r\n CharCode[CharCode[\"e\"] = 101] = \"e\";\r\n CharCode[CharCode[\"f\"] = 102] = \"f\";\r\n CharCode[CharCode[\"g\"] = 103] = \"g\";\r\n CharCode[CharCode[\"h\"] = 104] = \"h\";\r\n CharCode[CharCode[\"i\"] = 105] = \"i\";\r\n CharCode[CharCode[\"j\"] = 106] = \"j\";\r\n CharCode[CharCode[\"k\"] = 107] = \"k\";\r\n CharCode[CharCode[\"l\"] = 108] = \"l\";\r\n CharCode[CharCode[\"m\"] = 109] = \"m\";\r\n CharCode[CharCode[\"n\"] = 110] = \"n\";\r\n CharCode[CharCode[\"o\"] = 111] = \"o\";\r\n CharCode[CharCode[\"p\"] = 112] = \"p\";\r\n CharCode[CharCode[\"q\"] = 113] = \"q\";\r\n CharCode[CharCode[\"r\"] = 114] = \"r\";\r\n CharCode[CharCode[\"s\"] = 115] = \"s\";\r\n CharCode[CharCode[\"t\"] = 116] = \"t\";\r\n CharCode[CharCode[\"u\"] = 117] = \"u\";\r\n CharCode[CharCode[\"v\"] = 118] = \"v\";\r\n CharCode[CharCode[\"w\"] = 119] = \"w\";\r\n CharCode[CharCode[\"x\"] = 120] = \"x\";\r\n CharCode[CharCode[\"y\"] = 121] = \"y\";\r\n CharCode[CharCode[\"z\"] = 122] = \"z\";\r\n CharCode[CharCode[\"A\"] = 65] = \"A\";\r\n CharCode[CharCode[\"B\"] = 66] = \"B\";\r\n CharCode[CharCode[\"C\"] = 67] = \"C\";\r\n CharCode[CharCode[\"D\"] = 68] = \"D\";\r\n CharCode[CharCode[\"E\"] = 69] = \"E\";\r\n CharCode[CharCode[\"F\"] = 70] = \"F\";\r\n CharCode[CharCode[\"G\"] = 71] = \"G\";\r\n CharCode[CharCode[\"H\"] = 72] = \"H\";\r\n CharCode[CharCode[\"I\"] = 73] = \"I\";\r\n CharCode[CharCode[\"J\"] = 74] = \"J\";\r\n CharCode[CharCode[\"K\"] = 75] = \"K\";\r\n CharCode[CharCode[\"L\"] = 76] = \"L\";\r\n CharCode[CharCode[\"M\"] = 77] = \"M\";\r\n CharCode[CharCode[\"N\"] = 78] = \"N\";\r\n CharCode[CharCode[\"O\"] = 79] = \"O\";\r\n CharCode[CharCode[\"P\"] = 80] = \"P\";\r\n CharCode[CharCode[\"Q\"] = 81] = \"Q\";\r\n CharCode[CharCode[\"R\"] = 82] = \"R\";\r\n CharCode[CharCode[\"S\"] = 83] = \"S\";\r\n CharCode[CharCode[\"T\"] = 84] = \"T\";\r\n CharCode[CharCode[\"U\"] = 85] = \"U\";\r\n CharCode[CharCode[\"V\"] = 86] = \"V\";\r\n CharCode[CharCode[\"W\"] = 87] = \"W\";\r\n CharCode[CharCode[\"X\"] = 88] = \"X\";\r\n CharCode[CharCode[\"Y\"] = 89] = \"Y\";\r\n CharCode[CharCode[\"Z\"] = 90] = \"Z\";\r\n CharCode[CharCode[\"AMPERSAND\"] = 38] = \"AMPERSAND\";\r\n CharCode[CharCode[\"ASTERISK\"] = 42] = \"ASTERISK\";\r\n CharCode[CharCode[\"AT\"] = 64] = \"AT\";\r\n CharCode[CharCode[\"BACKSLASH\"] = 92] = \"BACKSLASH\";\r\n CharCode[CharCode[\"BACKTICK\"] = 96] = \"BACKTICK\";\r\n CharCode[CharCode[\"BAR\"] = 124] = \"BAR\";\r\n CharCode[CharCode[\"CARET\"] = 94] = \"CARET\";\r\n CharCode[CharCode[\"CLOSEBRACE\"] = 125] = \"CLOSEBRACE\";\r\n CharCode[CharCode[\"CLOSEBRACKET\"] = 93] = \"CLOSEBRACKET\";\r\n CharCode[CharCode[\"CLOSEPAREN\"] = 41] = \"CLOSEPAREN\";\r\n CharCode[CharCode[\"COLON\"] = 58] = \"COLON\";\r\n CharCode[CharCode[\"COMMA\"] = 44] = \"COMMA\";\r\n CharCode[CharCode[\"DOLLAR\"] = 36] = \"DOLLAR\";\r\n CharCode[CharCode[\"DOT\"] = 46] = \"DOT\";\r\n CharCode[CharCode[\"DOUBLEQUOTE\"] = 34] = \"DOUBLEQUOTE\";\r\n CharCode[CharCode[\"EQUALS\"] = 61] = \"EQUALS\";\r\n CharCode[CharCode[\"EXCLAMATION\"] = 33] = \"EXCLAMATION\";\r\n CharCode[CharCode[\"GREATERTHAN\"] = 62] = \"GREATERTHAN\";\r\n CharCode[CharCode[\"HASH\"] = 35] = \"HASH\";\r\n CharCode[CharCode[\"LESSTHAN\"] = 60] = \"LESSTHAN\";\r\n CharCode[CharCode[\"MINUS\"] = 45] = \"MINUS\";\r\n CharCode[CharCode[\"OPENBRACE\"] = 123] = \"OPENBRACE\";\r\n CharCode[CharCode[\"OPENBRACKET\"] = 91] = \"OPENBRACKET\";\r\n CharCode[CharCode[\"OPENPAREN\"] = 40] = \"OPENPAREN\";\r\n CharCode[CharCode[\"PERCENT\"] = 37] = \"PERCENT\";\r\n CharCode[CharCode[\"PLUS\"] = 43] = \"PLUS\";\r\n CharCode[CharCode[\"QUESTION\"] = 63] = \"QUESTION\";\r\n CharCode[CharCode[\"SEMICOLON\"] = 59] = \"SEMICOLON\";\r\n CharCode[CharCode[\"SINGLEQUOTE\"] = 39] = \"SINGLEQUOTE\";\r\n CharCode[CharCode[\"SLASH\"] = 47] = \"SLASH\";\r\n CharCode[CharCode[\"TILDE\"] = 126] = \"TILDE\";\r\n CharCode[CharCode[\"BACKSPACE\"] = 8] = \"BACKSPACE\";\r\n CharCode[CharCode[\"FORMFEED\"] = 12] = \"FORMFEED\";\r\n CharCode[CharCode[\"BYTEORDERMARK\"] = 65279] = \"BYTEORDERMARK\";\r\n CharCode[CharCode[\"TAB\"] = 9] = \"TAB\";\r\n CharCode[CharCode[\"VERTICALTAB\"] = 11] = \"VERTICALTAB\";\r\n})(CharCode = exports.CharCode || (exports.CharCode = {}));\r\n/** Tests if the specified character code is some sort of line break. */\r\nfunction isLineBreak(c) {\r\n switch (c) {\r\n case 10 /* LINEFEED */:\r\n case 13 /* CARRIAGERETURN */:\r\n case 8232 /* LINESEPARATOR */:\r\n case 8233 /* PARAGRAPHSEPARATOR */:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\nexports.isLineBreak = isLineBreak;\r\n/** Tests if the specified character code is some sort of white space. */\r\nfunction isWhiteSpace(c) {\r\n switch (c) {\r\n case 32 /* SPACE */:\r\n case 9 /* TAB */:\r\n case 11 /* VERTICALTAB */:\r\n case 12 /* FORMFEED */:\r\n case 160 /* NONBREAKINGSPACE */:\r\n case 133 /* NEXTLINE */:\r\n case 5760 /* OGHAM */:\r\n case 8239 /* NARROWNOBREAKSPACE */:\r\n case 8287 /* MATHEMATICALSPACE */:\r\n case 12288 /* IDEOGRAPHICSPACE */:\r\n case 65279 /* BYTEORDERMARK */:\r\n return true;\r\n default:\r\n return c >= 8192 /* ENQUAD */ && c <= 8203 /* ZEROWIDTHSPACE */;\r\n }\r\n}\r\nexports.isWhiteSpace = isWhiteSpace;\r\n/** Tests if the specified character code is a decimal digit. */\r\nfunction isDecimalDigit(c) {\r\n return c >= 48 /* _0 */ && c <= 57 /* _9 */;\r\n}\r\nexports.isDecimalDigit = isDecimalDigit;\r\n/** Tests if the specified character code is an octal digit. */\r\nfunction isOctalDigit(c) {\r\n return c >= 48 /* _0 */ && c <= 55 /* _7 */;\r\n}\r\nexports.isOctalDigit = isOctalDigit;\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nfunction isIdentifierStart(c) {\r\n return c >= 65 /* A */ && c <= 90 /* Z */\r\n || c >= 97 /* a */ && c <= 122 /* z */\r\n || c == 36 /* DOLLAR */\r\n || c == 95 /* _ */\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\nexports.isIdentifierStart = isIdentifierStart;\r\n/** Tests if the specified character code is a valid keyword character. */\r\nfunction isKeywordCharacter(c) {\r\n return c >= 97 /* a */ && c <= 122 /* z */;\r\n}\r\nexports.isKeywordCharacter = isKeywordCharacter;\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nfunction isIdentifierPart(c) {\r\n return c >= 65 /* A */ && c <= 90 /* Z */\r\n || c >= 97 /* a */ && c <= 122 /* z */\r\n || c >= 48 /* _0 */ && c <= 57 /* _9 */\r\n || c == 36 /* DOLLAR */\r\n || c == 95 /* _ */\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\nexports.isIdentifierPart = isIdentifierPart;\r\n// storing as u16 to save memory\r\nvar unicodeIdentifierStart = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nvar unicodeIdentifierPart = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nfunction lookupInUnicodeMap(code, map) {\r\n if (code < map[0])\r\n return false;\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid;\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n }\r\n else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction isUnicodeIdentifierStart(code) {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code, unicodeIdentifierStart);\r\n}\r\nfunction isUnicodeIdentifierPart(code) {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code, unicodeIdentifierPart);\r\n}\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar separator = 47 /* SLASH */;\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nfunction normalize(path) {\r\n var pos = 0;\r\n var len = path.length;\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == 46 /* DOT */ &&\r\n path.charCodeAt(pos + 1) == separator) {\r\n pos += 2;\r\n }\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n var atEnd;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n // we are only interested in '/.' sequences ...\r\n if (path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == 46 /* DOT */) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == 46 /* DOT */ ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == 46 /* DOT */ &&\r\n path.charCodeAt(pos + 3) == separator) {\r\n // find preceeding '/'\r\n var ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != 46 /* DOT */ ||\r\n path.charCodeAt(ipos + 2) != 46 /* DOT */) {\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != 46 /* DOT */ ||\r\n path.charCodeAt(1) != 46 /* DOT */) {\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\nexports.normalize = normalize;\r\n/** Resolves the specified path relative to the specified origin. */\r\nfunction resolve(normalizedPath, origin) {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalize(dirname(origin) + String.fromCharCode(separator) + normalizedPath);\r\n}\r\nexports.resolve = resolve;\r\n/** Obtains the directory portion of a normalized path. */\r\nfunction dirname(normalizedPath) {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\nexports.dirname = dirname;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(12);\nmodule.exports = __webpack_require__(19);\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n__webpack_require__(13);\r\n__webpack_require__(14);\r\n__webpack_require__(17);\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || __webpack_require__(15);\r\n\r\nfor (var key in binaryen)\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n if (!size) return 0; // should be safe in our case\r\n return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = __webpack_require__(0).Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrint(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrintAsmjs(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_15__;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar types_1 = __webpack_require__(5);\r\nvar module_1 = __webpack_require__(0);\r\nvar program_1 = __webpack_require__(2);\r\n/** Compiles a get of a built-in global. */\r\nfunction compileGetConstant(compiler, global, reportNode) {\r\n switch (global.internalName) {\r\n case \"NaN\":// context-sensitive\r\n if (compiler.currentType == types_1.Type.f32) {\r\n return compiler.module.createF32(NaN);\r\n }\r\n else {\r\n compiler.currentType = types_1.Type.f64;\r\n return compiler.module.createF64(NaN);\r\n }\r\n case \"Infinity\":// context-sensitive\r\n if (compiler.currentType == types_1.Type.f32) {\r\n return compiler.module.createF32(Infinity);\r\n }\r\n else {\r\n compiler.currentType = types_1.Type.f64;\r\n return compiler.module.createF64(Infinity);\r\n }\r\n case \"HEAP_BASE\":// never inlined for linking purposes\r\n compiler.currentType = compiler.options.usizeType;\r\n return compiler.module.createGetGlobal(\"HEAP_BASE\", compiler.currentType.toNativeType());\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return compiler.module.createUnreachable();\r\n}\r\nexports.compileGetConstant = compileGetConstant;\r\n/** Compiles a call to a built-in function. */\r\nfunction compileCall(compiler, prototype, typeArguments, operands, contextualType, reportNode) {\r\n var module = compiler.module;\r\n var arg0, arg1, arg2, ret;\r\n var tempLocal0, tempLocal1;\r\n var type, offset;\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n // search: createSelect\r\n switch (prototype.internalName) {\r\n // math\r\n case \"isNaN\":// isNaN(value: T) -> bool\r\n compiler.currentType = types_1.Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createBinary(module_1.BinaryOp.NeF32, module.createTeeLocal(tempLocal0.index, arg0), module.createGetLocal(tempLocal0.index, module_1.NativeType.F32));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createBinary(module_1.BinaryOp.NeF64, module.createTeeLocal(tempLocal0.index, arg0), module.createGetLocal(tempLocal0.index, module_1.NativeType.F64));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n default:// every other type is never NaN\r\n ret = module.createI32(0);\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.bool;\r\n return ret;\r\n case \"isFinite\":// isFinite(value: T) -> bool\r\n compiler.currentType = types_1.Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createSelect(module.createBinary(module_1.BinaryOp.NeF32, module.createUnary(module_1.UnaryOp.AbsF32, module.createTeeLocal(tempLocal0.index, arg0)), module.createF32(Infinity)), module.createI32(0), module.createBinary(module_1.BinaryOp.EqF32, module.createGetLocal(tempLocal0.index, module_1.NativeType.F32), module.createGetLocal(tempLocal0.index, module_1.NativeType.F32)));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createSelect(module.createBinary(module_1.BinaryOp.NeF64, module.createUnary(module_1.UnaryOp.AbsF64, module.createTeeLocal(tempLocal0.index, arg0)), module.createF64(Infinity)), module.createI32(0), module.createBinary(module_1.BinaryOp.EqF64, module.createGetLocal(tempLocal0.index, module_1.NativeType.F64), module.createGetLocal(tempLocal0.index, module_1.NativeType.F64)));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n default:// every other type is always finite\r\n ret = module.createI32(1);\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.bool;\r\n return ret;\r\n case \"clz\":// clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.ClzI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.ClzI64\r\n : module_1.UnaryOp.ClzI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.ClzI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"ctz\":// ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.CtzI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.CtzI64\r\n : module_1.UnaryOp.CtzI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.CtzI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"popcnt\":// popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.PopcntI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.PopcntI64\r\n : module_1.UnaryOp.PopcntI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.PopcntI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"rotl\":// rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n ret = compiler_1.makeSmallIntegerWrap(module.createBinary(module_1.BinaryOp.RotlI32, arg0, arg1), compiler.currentType, module);\r\n // fall-through\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.RotlI64\r\n : module_1.BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"rotr\":// rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n ret = compiler_1.makeSmallIntegerWrap(module.createBinary(module_1.BinaryOp.RotrI32, arg0, arg1), compiler.currentType, module);\r\n break;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.RotrI64\r\n : module_1.BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"abs\":// abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n // doesn't need sign-extension here because ifFalse below is either positive\r\n // or MIN_VALUE (-MIN_VALUE == MIN_VALUE) if selected\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(module_1.BinaryOp.SubI32, // ifFalse\r\n module.createI32(0), module.createGetLocal(tempLocal0.index, module_1.NativeType.I32)), module.createBinary(module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createI32(0)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, compiler.options.usizeType.toNativeZero(module), module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), compiler.options.usizeType.toNativeZero(module)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(module_1.BinaryOp.SubI64, module.createI64(0, 0), module.createGetLocal(tempLocal0.index, module_1.NativeType.I64)), module.createBinary(module_1.BinaryOp.GtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createI64(0, 0)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 8 /* U64 */:\r\n case 10 /* BOOL */:\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.AbsF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.AbsF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n ret = module.createUnreachable();\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"max\":// max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtU32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtU64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtU64\r\n : module_1.BinaryOp.GtU32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"min\":// min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtU32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtU64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.LtI64\r\n : module_1.BinaryOp.LtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.LtU64\r\n : module_1.BinaryOp.LtU32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"ceil\":// ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.CeilF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.CeilF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"floor\":// floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.FloorF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.FloorF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"copysign\":// copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n // TODO: does an integer version make sense?\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"nearest\":// nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.NearestF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.NearestF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"reinterpret\":// reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n switch (typeArguments[0].kind) {\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f32);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (typeArguments[0].isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.isWasm64\r\n ? types_1.Type.f64\r\n : types_1.Type.f32);\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.ReinterpretF64\r\n : module_1.UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.u32);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.u64);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n default:// small integers and void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n case \"sqrt\":// sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n // TODO: integer versions (that return f64 or convert)?\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.SqrtF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.SqrtF64, arg0);\r\n break;\r\n default:\r\n // case TypeKind.VOID:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"trunc\":// trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.TruncF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.TruncF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n // memory access\r\n case \"load\":// load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) {\r\n return module.createUnreachable();\r\n }\r\n return module.createLoad(typeArguments[0].byteSize, typeArguments[0].is(1 /* SIGNED */ | 4 /* INTEGER */), arg0, typeArguments[0].is(4 /* INTEGER */) &&\r\n contextualType.is(4 /* INTEGER */) &&\r\n contextualType.size >= typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(), offset);\r\n case \"store\":// store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = types_1.Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], typeArguments[0], typeArguments[0].is(4 /* INTEGER */)\r\n ? 0 /* NONE */\r\n : 1 /* IMPLICIT */);\r\n if (compiler.currentType.is(4 /* INTEGER */) &&\r\n typeArguments[0].is(4 /* INTEGER */) &&\r\n typeArguments[0].size > compiler.currentType.size) {\r\n arg1 = compiler.convertExpression(arg1, compiler.currentType, typeArguments[0], 1 /* IMPLICIT */, operands[1]);\r\n type = typeArguments[0];\r\n }\r\n else {\r\n type = compiler.currentType;\r\n }\r\n offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) {\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = types_1.Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n case \"sizeof\":// sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n ret = compiler.options.isWasm64\r\n ? module.createI64(typeArguments[0].byteSize, 0)\r\n : module.createI32(typeArguments[0].byteSize);\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", \"0\");\r\n return module.createUnreachable();\r\n }\r\n return ret;\r\n // control flow\r\n case \"select\":// select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], type = compiler.currentType);\r\n arg2 = compiler.compileExpression(operands[2], types_1.Type.bool);\r\n compiler.currentType = type;\r\n switch (compiler.currentType.kind) {\r\n default:// any value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"unreachable\":// unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createUnreachable();\r\n // host operations\r\n case \"current_memory\":// current_memory() -> i32\r\n compiler.currentType = types_1.Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createHost(module_1.HostOp.CurrentMemory);\r\n case \"grow_memory\":// grow_memory(pages: i32) -> i32\r\n compiler.currentType = types_1.Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n arg0 = module.createUnreachable();\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32);\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createHost(module_1.HostOp.GrowMemory, null, [arg0]);\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"move_memory\":// move_memory(dest: usize, src: usize: n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], compiler.options.usizeType);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = types_1.Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n case \"set_memory\":// set_memory(dest: usize, value: u32, n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], types_1.Type.u32);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = types_1.Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n // other\r\n case \"changetype\":// changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n else if (typeArguments[0].kind != 9 /* USIZE */) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType, 0 /* NONE */);\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.kind != 9 /* USIZE */) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n case \"assert\":// assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n }\r\n else if (operands.length > 2) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == types_1.Type.void) {\r\n compiler.currentType = types_1.Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n var abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n compiler.currentType = type.nonNullableType;\r\n if (contextualType == types_1.Type.void) {\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI32, arg0), abort);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI64, arg0), abort);\r\n break;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n ret = module.createIf(module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.EqzI64\r\n : module_1.UnaryOp.EqzI32, arg0), abort);\r\n break;\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n case 11 /* F32 */:\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF32, arg0, module.createF32(0)), abort);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF64, arg0, module.createF64(0)), abort);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = abort;\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.void;\r\n }\r\n else {\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI32, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI64, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64));\r\n break;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createIf(module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.EqzI64\r\n : module_1.UnaryOp.EqzI32, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType));\r\n break;\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF32, module.createTeeLocal(tempLocal0.index, arg0), module.createF32(0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.F32));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF64, module.createTeeLocal(tempLocal0.index, arg0), module.createF64(0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.F64));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n return ret;\r\n // conversions\r\n case \"i8\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i8, 2 /* EXPLICIT */);\r\n case \"i16\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i16, 2 /* EXPLICIT */);\r\n case \"i32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i32, 2 /* EXPLICIT */);\r\n case \"i64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i64, 2 /* EXPLICIT */);\r\n case \"isize\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = compiler.options.isWasm64\r\n ? types_1.Type.isize64\r\n : types_1.Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], compiler.options.isWasm64\r\n ? types_1.Type.isize64\r\n : types_1.Type.isize32, 2 /* EXPLICIT */);\r\n case \"u8\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u8, 2 /* EXPLICIT */);\r\n case \"u16\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u16, 2 /* EXPLICIT */);\r\n case \"u32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u32, 2 /* EXPLICIT */);\r\n case \"u64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u64, 2 /* EXPLICIT */);\r\n case \"usize\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], compiler.options.usizeType, 2 /* EXPLICIT */);\r\n case \"bool\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.bool, 2 /* EXPLICIT */);\r\n case \"f32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.f32, 2 /* EXPLICIT */);\r\n case \"f64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.f64, 2 /* EXPLICIT */);\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return module.createUnreachable();\r\n}\r\nexports.compileCall = compileCall;\r\nfunction evaluateConstantOffset(compiler, expression) {\r\n var expr;\r\n var value;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, types_1.Type.i64);\r\n if (_BinaryenExpressionGetId(expr) != module_1.ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != module_1.NativeType.I64 ||\r\n _BinaryenConstGetValueI64High(expr) != 0 ||\r\n (value = _BinaryenConstGetValueI64Low(expr)) < 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n value = -1;\r\n }\r\n }\r\n else {\r\n expr = compiler.precomputeExpression(expression, types_1.Type.i32);\r\n if (_BinaryenExpressionGetId(expr) != module_1.ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != module_1.NativeType.I32 ||\r\n (value = _BinaryenConstGetValueI32(expr)) < 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nfunction compileAllocate(compiler, cls, reportNode) {\r\n var program = cls.program;\r\n var prototype = program.elements.get(compiler.options.allocateImpl);\r\n if (prototype) {\r\n if (prototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = prototype.resolve(); // reports\r\n if (instance) {\r\n if (!instance.is(program_1.ElementFlags.GENERIC) &&\r\n instance.returnType == compiler.options.usizeType &&\r\n instance.parameters &&\r\n instance.parameters.length == 1 &&\r\n instance.parameters[0].type == compiler.options.usizeType) {\r\n if (compiler.compileFunction(instance)) {\r\n return compiler.makeCall(instance, [\r\n compiler.options.isWasm64\r\n ? compiler.module.createI64(cls.currentMemoryOffset)\r\n : compiler.module.createI32(cls.currentMemoryOffset)\r\n ]);\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Implementation_0_must_match_the_signature_1, reportNode.range, compiler.options.allocateImpl, \"(size: usize): usize\");\r\n }\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures, reportNode.range, prototype.internalName);\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, reportNode.range, compiler.options.allocateImpl);\r\n }\r\n return compiler.module.createUnreachable();\r\n}\r\nexports.compileAllocate = compileAllocate;\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nfunction compileAbort(compiler, message, reportNode) {\r\n var module = compiler.module;\r\n var abort = module.createUnreachable();\r\n var abortPrototype = compiler.program.elements.get(\"abort\");\r\n var stringType = compiler.program.types.get(\"string\");\r\n if (abortPrototype &&\r\n abortPrototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE &&\r\n stringType) {\r\n var abortInstance = abortPrototype.resolve(); // reports\r\n if (abortInstance &&\r\n compiler.compileFunction(abortInstance) // reports\r\n ) {\r\n assert(abortInstance.parameters && abortInstance.parameters.length == 4); // to be sure\r\n abort = module.createBlock(null, [\r\n compiler.makeCall(abortInstance, [\r\n message != null\r\n ? compiler.compileExpression(message, stringType)\r\n : compiler.options.usizeType.toNativeZero(module),\r\n compiler.compileStaticString(reportNode.range.source.normalizedPath),\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ]),\r\n abort\r\n ]);\r\n }\r\n }\r\n return abort;\r\n}\r\nexports.compileAbort = compileAbort;\r\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {const Long = global.Long || __webpack_require__(18);\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n//////////////////////// Low-level C-Like Compiler API /////////////////////////\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar decompiler_1 = __webpack_require__(20);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nexports.formatDiagnostic = diagnostics_1.formatDiagnosticMessage;\r\nvar parser_1 = __webpack_require__(21);\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nfunction parseFile(text, path, isEntry, parser) {\r\n if (isEntry === void 0) { isEntry = false; }\r\n if (parser === void 0) { parser = null; }\r\n if (!parser) {\r\n parser = new parser_1.Parser();\r\n isEntry = true;\r\n }\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\nexports.parseFile = parseFile;\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nfunction nextFile(parser) {\r\n return parser.nextFile();\r\n}\r\nexports.nextFile = nextFile;\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nfunction nextDiagnostic(parser) {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\nexports.nextDiagnostic = nextDiagnostic;\r\n/** Tests whether a diagnostic is informatory. */\r\nfunction isInfo(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.INFO;\r\n}\r\nexports.isInfo = isInfo;\r\n/** Tests whether a diagnostic is a warning. */\r\nfunction isWarning(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.WARNING;\r\n}\r\nexports.isWarning = isWarning;\r\n/** Tests whether a diagnostic is an error. */\r\nfunction isError(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.ERROR;\r\n}\r\nexports.isError = isError;\r\n/** Creates a new set of compiler options. */\r\nfunction createOptions() {\r\n return new compiler_1.Options();\r\n}\r\nexports.createOptions = createOptions;\r\n/** Sets the `target` option. */\r\nfunction setTarget(options, target) {\r\n options.target = target;\r\n}\r\nexports.setTarget = setTarget;\r\n/** Sets the `noTreeShaking` option. */\r\nfunction setNoTreeShaking(options, noTreeShaking) {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\nexports.setNoTreeShaking = setNoTreeShaking;\r\n/** Sets the `noAssert` option. */\r\nfunction setNoAssert(options, noAssert) {\r\n options.noAssert = noAssert;\r\n}\r\nexports.setNoAssert = setNoAssert;\r\n/** Sets the `noMemory` option. */\r\nfunction setNoMemory(options, noMemory) {\r\n options.noMemory = noMemory;\r\n}\r\nexports.setNoMemory = setNoMemory;\r\n/** Sets the `sourceMap` option. */\r\nfunction setSourceMap(options, sourceMap) {\r\n options.sourceMap = sourceMap;\r\n}\r\nexports.setSourceMap = setSourceMap;\r\n/** Sets the `memoryBase` option. */\r\nfunction setMemoryBase(options, memoryBase) {\r\n options.memoryBase = memoryBase;\r\n}\r\nexports.setMemoryBase = setMemoryBase;\r\n/** Compiles the sources computed by the parser to a module. */\r\nfunction compile(parser, options) {\r\n if (options === void 0) { options = null; }\r\n var program = parser.finish();\r\n var compiler = new compiler_1.Compiler(program, options);\r\n return compiler.compile();\r\n}\r\nexports.compile = compile;\r\n/** Decompiles a module to its (low level) source. */\r\nfunction decompile(module) {\r\n var decompiler = new decompiler_1.Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\nexports.decompile = decompile;\r\n/** Prefix indicating a library file. */\r\nvar program_1 = __webpack_require__(2);\r\nexports.LIBRARY_PREFIX = program_1.LIBRARY_PREFIX;\r\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar module_1 = __webpack_require__(0);\r\n// TODO :-)\r\nvar Decompiler = /** @class */ (function () {\r\n function Decompiler() {\r\n this.text = [];\r\n this.functionId = 0;\r\n }\r\n Decompiler.decompile = function (module) {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n };\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n Decompiler.prototype.decompile = function (module) {\r\n throw new Error(\"not implemented\");\r\n };\r\n Decompiler.prototype.decompileFunction = function (func) {\r\n var name = module_1.readString(_BinaryenFunctionGetName(func)) || \"$\" + this.functionId.toString(10);\r\n var body = _BinaryenFunctionGetBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (var i = 0, k = _BinaryenFunctionGetNumParams(func); i < k; ++i) {\r\n if (i > 0)\r\n this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetParam(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetResult(func)));\r\n this.push(\" \");\r\n if (_BinaryenExpressionGetId(body) != module_1.ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (_BinaryenExpressionGetId(body) != module_1.ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n };\r\n Decompiler.prototype.decompileExpression = function (expr) {\r\n var id = _BinaryenExpressionGetId(expr);\r\n var type = _BinaryenExpressionGetType(expr);\r\n var nested;\r\n var string;\r\n var i, k;\r\n switch (id) {\r\n case module_1.ExpressionId.Block:// TODO: magic\r\n if ((string = module_1.readString(_BinaryenBlockGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = _BinaryenBlockGetNumChildren(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(_BinaryenBlockGetChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n case module_1.ExpressionId.If:\r\n if (type == module_1.NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n if (nested = _BinaryenIfGetIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n }\r\n else {\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(_BinaryenIfGetIfFalse(expr));\r\n }\r\n return;\r\n case module_1.ExpressionId.Loop:\r\n if ((string = module_1.readString(_BinaryenLoopGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(_BinaryenLoopGetBody(expr));\r\n this.push(\"while (0);\\n\");\r\n case module_1.ExpressionId.Break:\r\n if (nested = _BinaryenBreakGetCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = module_1.readString(_BinaryenBreakGetName(expr))) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n }\r\n else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n case module_1.ExpressionId.Switch:\r\n case module_1.ExpressionId.Call:\r\n case module_1.ExpressionId.CallImport:\r\n case module_1.ExpressionId.CallIndirect:\r\n case module_1.ExpressionId.GetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenGetLocalGetIndex(expr).toString(10));\r\n return;\r\n case module_1.ExpressionId.SetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenSetLocalGetIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(_BinaryenSetLocalGetValue(expr));\r\n return;\r\n case module_1.ExpressionId.GetGlobal:\r\n case module_1.ExpressionId.SetGlobal:\r\n case module_1.ExpressionId.Load:\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenLoadGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenLoadGetPtr(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Store:\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenStoreGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenStoreGetPtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenStoreGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Const:\r\n switch (type) {\r\n case module_1.NativeType.I32:\r\n this.push(_BinaryenConstGetValueI32(expr).toString(10));\r\n return;\r\n case module_1.NativeType.I64:\r\n this.push(i64_to_string(i64_new(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr))));\r\n return;\r\n case module_1.NativeType.F32:\r\n this.push(_BinaryenConstGetValueF32(expr).toString(10));\r\n return;\r\n case module_1.NativeType.F64:\r\n this.push(_BinaryenConstGetValueF64(expr).toString(10));\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Unary:\r\n switch (_BinaryenUnaryGetOp(expr)) {\r\n case module_1.UnaryOp.ClzI32:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CtzI32:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.PopcntI32:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NegF32:\r\n case module_1.UnaryOp.NegF64:\r\n this.push(\"-\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.AbsF32:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CeilF32:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.FloorF32:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.TruncF32:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NearestF32:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.SqrtF32:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.EqzI32:\r\n case module_1.UnaryOp.EqzI64:\r\n this.push(\"!\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ClzI64:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CtzI64:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.PopcntI64:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.AbsF64:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CeilF64:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.FloorF64:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.TruncF64:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NearestF64:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.SqrtF64:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ExtendI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ExtendU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.WrapI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ReinterpretF32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ReinterpretF64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ConvertI32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.PromoteF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.DemoteF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ReinterpretI32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ReinterpretI64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Binary:// TODO: precedence\r\n switch (_BinaryenBinaryGetOp(expr)) {\r\n case module_1.BinaryOp.AddI32:\r\n case module_1.BinaryOp.AddI64:\r\n case module_1.BinaryOp.AddF32:\r\n case module_1.BinaryOp.AddF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.SubI32:\r\n case module_1.BinaryOp.SubI64:\r\n case module_1.BinaryOp.SubF32:\r\n case module_1.BinaryOp.SubF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.MulI32:\r\n case module_1.BinaryOp.MulI64:\r\n case module_1.BinaryOp.MulF32:\r\n case module_1.BinaryOp.MulF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivI32:\r\n case module_1.BinaryOp.DivI64:\r\n case module_1.BinaryOp.DivF32:\r\n case module_1.BinaryOp.DivF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RemI32:\r\n case module_1.BinaryOp.RemI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RemU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.AndI32:\r\n case module_1.BinaryOp.AndI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.OrI32:\r\n case module_1.BinaryOp.OrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.XorI32:\r\n case module_1.BinaryOp.XorI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShlI32:\r\n case module_1.BinaryOp.ShlI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShrU32:\r\n case module_1.BinaryOp.ShrU64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShrI32:\r\n case module_1.BinaryOp.ShrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RotlI32:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RotrI32:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.EqI32:\r\n case module_1.BinaryOp.EqI64:\r\n case module_1.BinaryOp.EqF32:\r\n case module_1.BinaryOp.EqF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.NeI32:\r\n case module_1.BinaryOp.NeI64:\r\n case module_1.BinaryOp.NeF32:\r\n case module_1.BinaryOp.NeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LtI32:\r\n case module_1.BinaryOp.LtI64:\r\n case module_1.BinaryOp.LtF32:\r\n case module_1.BinaryOp.LtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeI32:\r\n case module_1.BinaryOp.LeI64:\r\n case module_1.BinaryOp.LeF32:\r\n case module_1.BinaryOp.LeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtI32:\r\n case module_1.BinaryOp.GtI64:\r\n case module_1.BinaryOp.GtF32:\r\n case module_1.BinaryOp.GtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeI32:\r\n case module_1.BinaryOp.GeI64:\r\n case module_1.BinaryOp.GeF32:\r\n case module_1.BinaryOp.GeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RemU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RotlI64:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RotrI64:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.LtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.CopysignF32:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MinF32:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MaxF32:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.CopysignF64:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MinF64:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MaxF64:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n return;\r\n case module_1.ExpressionId.Select:\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(_BinaryenSelectGetIfTrue(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetIfFalse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetCondition(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Drop:\r\n this.decompileExpression(_BinaryenDropGetValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n case module_1.ExpressionId.Return:\r\n if (nested = _BinaryenReturnGetValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n }\r\n else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n case module_1.ExpressionId.Host:\r\n switch (_BinaryenHostGetOp(expr)) {\r\n case module_1.HostOp.CurrentMemory:\r\n this.push(\"current_memory()\");\r\n return;\r\n case module_1.HostOp.GrowMemory:\r\n this.push(\"grow_memory(\");\r\n this.decompileExpression(_BinaryenHostGetOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Nop:\r\n this.push(\";\\n\");\r\n return;\r\n case module_1.ExpressionId.Unreachable:\r\n this.push(\"unreachable()\");\r\n return;\r\n case module_1.ExpressionId.AtomicCmpxchg:\r\n case module_1.ExpressionId.AtomicRMW:\r\n case module_1.ExpressionId.AtomicWait:\r\n case module_1.ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n };\r\n Decompiler.prototype.push = function (text) {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n };\r\n Decompiler.prototype.finish = function () {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n };\r\n return Decompiler;\r\n}());\r\nexports.Decompiler = Decompiler;\r\nfunction nativeTypeToType(type) {\r\n switch (type) {\r\n case module_1.NativeType.None: return \"void\";\r\n case module_1.NativeType.I32: return \"i32\";\r\n case module_1.NativeType.I64: return \"i64\";\r\n case module_1.NativeType.F32: return \"f32\";\r\n case module_1.NativeType.F64: return \"f64\";\r\n case module_1.NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case module_1.NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n/*\r\n\r\n This is a custom parser specifically written for the AssemblyScript subset. It accepts some of the\r\n most common TypeScript-only patterns that it knows an appropriate error message for but, though it\r\n uses TypeScript's codes for diagnostics, doesn't ultimately aim at full compatibility.\r\n\r\n*/\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar path_1 = __webpack_require__(10);\r\nvar ast_1 = __webpack_require__(6);\r\n/** Parser interface. */\r\nvar Parser = /** @class */ (function (_super) {\r\n __extends(Parser, _super);\r\n /** Constructs a new parser. */\r\n function Parser() {\r\n var _this = _super.call(this) || this;\r\n /** Log of source file names to be requested. */\r\n _this.backlog = new Array();\r\n /** Log of source file names already processed. */\r\n _this.seenlog = new Set();\r\n _this.program = new program_1.Program(_this.diagnostics);\r\n return _this;\r\n }\r\n /** Parses a file and adds its definitions to the program. */\r\n Parser.prototype.parseFile = function (text, path, isEntry) {\r\n // check if already parsed\r\n var normalizedPath = path_1.normalize(path);\r\n for (var i = 0, k = this.program.sources.length; i < k; ++i) {\r\n if (this.program.sources[i].normalizedPath == normalizedPath)\r\n return;\r\n }\r\n this.seenlog.add(normalizedPath);\r\n // create the source element\r\n var source = new ast_1.Source(normalizedPath, text, isEntry\r\n ? ast_1.SourceKind.ENTRY\r\n : path.startsWith(program_1.LIBRARY_PREFIX) && path.indexOf(program_1.PATH_DELIMITER, program_1.LIBRARY_PREFIX.length) < 0\r\n ? ast_1.SourceKind.LIBRARY\r\n : ast_1.SourceKind.DEFAULT);\r\n this.program.sources.push(source);\r\n // tokenize and parse\r\n var tn = new tokenizer_1.Tokenizer(source, this.program.diagnostics);\r\n source.tokenizer = tn;\r\n while (!tn.skip(tokenizer_1.Token.ENDOFFILE)) {\r\n var statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n source.statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n };\r\n /** Parses a top-level statement. */\r\n Parser.prototype.parseTopLevelStatement = function (tn, isNamespaceMember) {\r\n if (isNamespaceMember === void 0) { isNamespaceMember = false; }\r\n // check decorators\r\n var decorators = null;\r\n while (tn.skip(tokenizer_1.Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator)\r\n break;\r\n if (!decorators)\r\n decorators = [];\r\n decorators.push(decorator);\r\n }\r\n // check modifiers\r\n var modifiers = null;\r\n if (tn.skip(tokenizer_1.Token.EXPORT)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.EXPORT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.DECLARE)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.DECLARE, tn.range()), modifiers);\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) {\r\n this.error(diagnostics_1.DiagnosticCode.Line_break_not_permitted_here, tn.range(tn.pos)); // recoverable, compatibility\r\n }\r\n }\r\n // remember where we took off\r\n tn.mark();\r\n // parse the statement\r\n var statement = null;\r\n var modifier;\r\n // handle declarations\r\n switch (tn.next()) {\r\n case tokenizer_1.Token.CONST:\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.CONST, tn.range()), modifiers);\r\n if (tn.skip(tokenizer_1.Token.ENUM)) {\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n break;\r\n }\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.LET:\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.LET, tn.range()), modifiers);\r\n // fall-through\r\n case tokenizer_1.Token.VAR:\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.ENUM:\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.FUNCTION:\r\n statement = this.parseFunction(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.ABSTRACT:\r\n if (!tn.skip(tokenizer_1.Token.CLASS)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"class\");\r\n break;\r\n }\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n // fall through\r\n case tokenizer_1.Token.CLASS:\r\n statement = this.parseClass(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.NAMESPACE:\r\n statement = this.parseNamespace(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.IMPORT:\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.EXPORT, modifiers)) {\r\n statement = this.parseExportImport(tn, modifier.range);\r\n }\r\n else {\r\n statement = this.parseImport(tn);\r\n }\r\n if (modifiers)\r\n ast_1.setReusableModifiers(modifiers);\r\n break;\r\n case tokenizer_1.Token.TYPE:\r\n statement = this.parseTypeDeclaration(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n default:\r\n // handle plain exports\r\n if (ast_1.hasModifier(ast_1.ModifierKind.EXPORT, modifiers)) {\r\n tn.reset();\r\n statement = this.parseExport(tn, modifiers); // TODO: why exactly does this have modifiers again? 'declare'?\r\n // handle non-declaration statements\r\n }\r\n else {\r\n if (modifiers) {\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.DECLARE, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"declare\"); // recoverable\r\n }\r\n ast_1.setReusableModifiers(modifiers);\r\n }\r\n tn.reset();\r\n if (!isNamespaceMember) {\r\n statement = this.parseStatement(tn, true);\r\n }\r\n }\r\n break;\r\n }\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(diagnostics_1.DiagnosticCode.Decorators_are_not_valid_here, decorators[i].range);\r\n }\r\n }\r\n return statement;\r\n };\r\n /** Obtains the next file to parse. */\r\n Parser.prototype.nextFile = function () {\r\n return this.backlog.length ? this.backlog.shift() : null;\r\n };\r\n /** Finishes parsing and returns the program. */\r\n Parser.prototype.finish = function () {\r\n if (this.backlog.length)\r\n throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n return this.program;\r\n };\r\n /** Parses a type. */\r\n Parser.prototype.parseType = function (tn, acceptParenthesized, suppressErrors) {\r\n if (acceptParenthesized === void 0) { acceptParenthesized = true; }\r\n if (suppressErrors === void 0) { suppressErrors = false; }\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n // void\r\n if (token == tokenizer_1.Token.VOID) {\r\n return ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n }\r\n var type;\r\n // ( ... )\r\n if (acceptParenthesized && token == tokenizer_1.Token.OPENPAREN) {\r\n var innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"}\");\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n // this\r\n }\r\n else if (token == tokenizer_1.Token.THIS) {\r\n type = ast_1.Node.createType(ast_1.Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // true\r\n }\r\n else if (token == tokenizer_1.Token.TRUE || token == tokenizer_1.Token.FALSE) {\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // string literal\r\n }\r\n else if (token == tokenizer_1.Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // Name\r\n }\r\n else if (token == tokenizer_1.Token.IDENTIFIER) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var parameters = new Array();\r\n var nullable = false;\r\n // Name\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n do {\r\n var parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter)\r\n return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \">\");\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n if (tn.skip(tokenizer_1.Token.BAR)) {\r\n if (tn.skip(tokenizer_1.Token.NULL)) {\r\n nullable = true;\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"null\");\r\n }\r\n return null;\r\n }\r\n }\r\n type = ast_1.Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(tokenizer_1.Token.OPENBRACKET)) {\r\n var bracketStart = tn.tokenPos;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n }\r\n return null;\r\n }\r\n var bracketRange = tn.range(bracketStart, tn.pos);\r\n // ...[] | null\r\n nullable = false;\r\n if (tn.skip(tokenizer_1.Token.BAR)) {\r\n if (tn.skip(tokenizer_1.Token.NULL)) {\r\n nullable = true;\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"null\");\r\n }\r\n return null;\r\n }\r\n }\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"Array\", bracketRange), [type], nullable, tn.range(startPos, tn.pos));\r\n if (nullable)\r\n break;\r\n }\r\n return type;\r\n };\r\n // statements\r\n Parser.prototype.parseDecorator = function (tn) {\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var name = tn.readIdentifier();\r\n var expression = ast_1.Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(tokenizer_1.Token.DOT)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n name = tn.readIdentifier();\r\n expression = ast_1.Node.createPropertyAccessExpression(expression, ast_1.Node.createIdentifierExpression(name, tn.range()), tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n var args;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return ast_1.Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n }\r\n else {\r\n return ast_1.Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseVariable = function (tn, modifiers, decorators) {\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n var members = new Array();\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseVariableDeclaration(tn, isDeclare, modifiers, decorators);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n var ret = ast_1.Node.createVariableStatement(members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseVariableDeclaration = function (tn, isDeclare, parentModifiers, parentDecorators) {\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n if (isDeclare === void 0) { isDeclare = false; }\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!initializer)\r\n return null;\r\n }\r\n else {\r\n if (ast_1.hasModifier(ast_1.ModifierKind.CONST, parentModifiers)) {\r\n if (!ast_1.hasModifier(ast_1.ModifierKind.DECLARE, parentModifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._const_declarations_must_be_initialized, identifier.range);\r\n }\r\n }\r\n else if (!type) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range(tn.pos)); // recoverable\r\n }\r\n }\r\n return ast_1.Node.createVariableDeclaration(identifier, type, initializer, parentModifiers, parentDecorators, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n };\r\n Parser.prototype.parseEnum = function (tn, modifiers, decorators) {\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.next() != tokenizer_1.Token.IDENTIFIER) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != tokenizer_1.Token.OPENBRACE) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseEnumValue(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n var ret = ast_1.Node.createEnumDeclaration(identifier, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseEnumValue = function (tn) {\r\n // before: Identifier ('=' Expression)?\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n value = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!value)\r\n return null;\r\n }\r\n return ast_1.Node.createEnumValueDeclaration(identifier, value, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n };\r\n Parser.prototype.parseReturn = function (tn) {\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n var expr = null;\r\n if (tn.peek(true) != tokenizer_1.Token.SEMICOLON &&\r\n tn.nextToken != tokenizer_1.Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine) {\r\n if (!(expr = this.parseExpression(tn)))\r\n return null;\r\n }\r\n var ret = ast_1.Node.createReturnStatement(expr, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseTypeParameters = function (tn) {\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n var typeParameters = new Array();\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n do {\r\n var typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter)\r\n return null;\r\n typeParameters.push(typeParameter);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \">\");\r\n return null;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_parameter_list_cannot_be_empty, tn.range()); // recoverable\r\n }\r\n return typeParameters;\r\n };\r\n Parser.prototype.parseTypeParameter = function (tn) {\r\n // before: Identifier ('extends' Type)?\r\n if (tn.next() == tokenizer_1.Token.IDENTIFIER) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var extendsType = null;\r\n if (tn.skip(tokenizer_1.Token.EXTENDS)) {\r\n if (!(extendsType = this.parseType(tn)))\r\n return null;\r\n }\r\n return ast_1.Node.createTypeParameter(identifier, extendsType, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseParameters = function (tn) {\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n var parameters = new Array();\r\n var seenRest = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n if (tn.peek() != tokenizer_1.Token.CLOSEPAREN) {\r\n do {\r\n var param = this.parseParameter(tn);\r\n if (!param)\r\n return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list, seenRest.name.range);\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n default:\r\n if (seenOptional) {\r\n this.error(diagnostics_1.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter, param.name.range);\r\n }\r\n break;\r\n case ast_1.ParameterKind.OPTIONAL:\r\n seenOptional = true;\r\n break;\r\n case ast_1.ParameterKind.REST:\r\n seenRest = param;\r\n break;\r\n }\r\n parameters.push(param);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n }\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n return parameters;\r\n };\r\n Parser.prototype.parseParameter = function (tn) {\r\n // before: '...'? Identifier '?'? (':' Type)? ('=' Expression)?\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange = null;\r\n if (tn.skip(tokenizer_1.Token.DOT_DOT_DOT)) {\r\n isRest = true;\r\n startRange = tn.range();\r\n }\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n if (!isRest)\r\n startRange = tn.range();\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type = null;\r\n if (isOptional = tn.skip(tokenizer_1.Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_cannot_be_optional, identifier.range);\r\n }\r\n }\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer, identifier.range);\r\n }\r\n if (isOptional) {\r\n this.error(diagnostics_1.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer, identifier.range);\r\n }\r\n else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!initializer)\r\n return null;\r\n }\r\n return ast_1.Node.createParameter(identifier, type, initializer, isRest\r\n ? ast_1.ParameterKind.REST\r\n : isOptional\r\n ? ast_1.ParameterKind.OPTIONAL\r\n : ast_1.ParameterKind.DEFAULT, tokenizer_1.Range.join(startRange, tn.range()));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseFunction = function (tn, modifiers, decorators) {\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range(tn.pos));\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters = null;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n if (!tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"(\");\r\n return null;\r\n }\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters)\r\n return null;\r\n var isSetter = ast_1.hasModifier(ast_1.ModifierKind.SET, modifiers);\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter, identifier.range); // recoverable\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer, identifier.range); // recoverable\r\n }\r\n }\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, modifiers);\r\n if (isGetter && parameters.length) {\r\n this.error(diagnostics_1.DiagnosticCode.A_get_accessor_cannot_have_parameters, identifier.range); // recoverable\r\n }\r\n var returnType = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n returnType = this.parseType(tn, isSetter);\r\n if (!returnType)\r\n return null;\r\n }\r\n else if (!isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range(tn.pos)); // recoverable\r\n }\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n var statements = null;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n statements = new Array();\r\n if (isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n }\r\n else if (!isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, tn.range(tn.pos));\r\n }\r\n var ret = ast_1.Node.createFunctionDeclaration(identifier, typeParameters, parameters, returnType, statements, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseClass = function (tn, modifiers, decorators) {\r\n // at 'class':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n var startPos = decorators && decorators.length\r\n ? decorators[0].range.start\r\n : modifiers && modifiers.length\r\n ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n var extendsType = null;\r\n if (tn.skip(tokenizer_1.Token.EXTENDS)) {\r\n extendsType = this.parseType(tn);\r\n if (!extendsType)\r\n return null;\r\n }\r\n var implementsTypes = new Array();\r\n if (tn.skip(tokenizer_1.Token.IMPLEMENTS)) {\r\n do {\r\n var type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n implementsTypes.push(type);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n }\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseClassMember(tn, isDeclare);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (!tn.skip(tokenizer_1.Token.CLOSEBRACE));\r\n }\r\n return ast_1.Node.createClassDeclaration(identifier, typeParameters, extendsType, implementsTypes, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseClassMember = function (tn, parentIsDeclare) {\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n var startPos = tn.pos;\r\n var decorators = new Array();\r\n while (tn.skip(tokenizer_1.Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator)\r\n break;\r\n decorators.push(decorator);\r\n }\r\n var modifiers = null;\r\n if (tn.skip(tokenizer_1.Token.PUBLIC)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PUBLIC, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.PRIVATE)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PRIVATE, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.PROTECTED)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PROTECTED, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.STATIC)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.STATIC, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.ABSTRACT)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.READONLY)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.READONLY, tn.range()), modifiers);\r\n }\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n tn.mark();\r\n var isGetter = false;\r\n var isSetter = false;\r\n if (isGetter = tn.skip(tokenizer_1.Token.GET)) {\r\n if (tn.peek(true, true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.GET, tn.range()), modifiers);\r\n }\r\n else {\r\n tn.reset();\r\n isGetter = false;\r\n }\r\n }\r\n else if (isSetter = tn.skip(tokenizer_1.Token.SET)) {\r\n if (tn.peek(true, true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.SET, tn.range()), modifiers);\r\n }\r\n else {\r\n tn.reset();\r\n isSetter = false;\r\n }\r\n }\r\n var isConstructor = tn.skip(tokenizer_1.Token.CONSTRUCTOR);\r\n if (isConstructor || tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = isConstructor\r\n ? ast_1.Node.createConstructorExpression(tn.range())\r\n : ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n if (isConstructor) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration, tn.range()); // recoverable\r\n }\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters)\r\n return null;\r\n if (isGetter && parameters.length) {\r\n this.error(diagnostics_1.DiagnosticCode.A_get_accessor_cannot_have_parameters, identifier.range);\r\n }\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter, identifier.range);\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer, identifier.range);\r\n }\r\n }\r\n var returnType = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n if (identifier.kind == ast_1.NodeKind.CONSTRUCTOR) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration, tn.range());\r\n }\r\n else if (isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation, tn.range());\r\n }\r\n returnType = this.parseType(tn, identifier.kind == ast_1.NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType)\r\n return null;\r\n }\r\n else if (!isSetter && identifier.kind != ast_1.NodeKind.CONSTRUCTOR) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range()); // recoverable\r\n }\r\n var statements = null;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n if (parentIsDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n }\r\n else if (!parentIsDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, tn.range()); // recoverable\r\n }\r\n var retMethod = ast_1.Node.createMethodDeclaration(identifier, typeParameters, parameters, returnType, statements, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return retMethod;\r\n }\r\n else if (isConstructor) {\r\n this.error(diagnostics_1.DiagnosticCode.Constructor_implementation_is_missing, identifier.range);\r\n }\r\n else if (isGetter || isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, identifier.range);\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n }\r\n else {\r\n var modifier;\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.ABSTRACT, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"abstract\"); // recoverable\r\n }\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.GET, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"get\"); // recoverable\r\n }\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.SET, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"set\"); // recoverable\r\n }\r\n var type = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range()); // recoverable\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer)\r\n return null;\r\n }\r\n var retField = ast_1.Node.createFieldDeclaration(identifier, type, initializer, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return retField;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseNamespace = function (tn, modifiers, decorators) {\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var member = this.parseTopLevelStatement(tn, true);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n }\r\n var ret = ast_1.Node.createNamespaceDeclaration(identifier, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExport = function (tn, modifiers) {\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseExportMember(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n var path = null;\r\n if (tn.skip(tokenizer_1.Token.FROM)) {\r\n if (tn.skip(tokenizer_1.Token.STRINGLITERAL)) {\r\n path = ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n var ret = ast_1.Node.createExportStatement(members, path, modifiers, tn.range(startPos, tn.pos));\r\n if (ret.normalizedPath && !this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExportMember = function (tn) {\r\n // before: Identifier ('as' Identifier)?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier = null;\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createExportMember(identifier, asIdentifier, asIdentifier\r\n ? tokenizer_1.Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseImport = function (tn) {\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n var startPos = tn.tokenPos;\r\n var members = null;\r\n var namespaceName = null;\r\n var skipFrom = false;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseImportDeclaration(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n }\r\n else if (tn.skip(tokenizer_1.Token.ASTERISK)) {\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n namespaceName = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"as\");\r\n return null;\r\n }\r\n }\r\n else {\r\n skipFrom = true;\r\n }\r\n if (skipFrom || tn.skip(tokenizer_1.Token.FROM)) {\r\n if (tn.skip(tokenizer_1.Token.STRINGLITERAL)) {\r\n var path = ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n var ret;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = ast_1.Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n ret = ast_1.Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n if (!this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, tn.range());\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"from\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseImportDeclaration = function (tn) {\r\n // before: Identifier ('as' Identifier)?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier = null;\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createImportDeclaration(identifier, asIdentifier, asIdentifier\r\n ? tokenizer_1.Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExportImport = function (tn, startRange) {\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var ret = ast_1.Node.createExportImportStatement(identifier, asIdentifier, tokenizer_1.Range.join(startRange, tn.range()));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"=\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseStatement = function (tn, topLevel) {\r\n // at previous token\r\n if (topLevel === void 0) { topLevel = false; }\r\n tn.mark();\r\n var token = tn.next();\r\n switch (token) {\r\n case tokenizer_1.Token.BREAK:\r\n return this.parseBreak(tn);\r\n case tokenizer_1.Token.CONST:\r\n return this.parseVariable(tn, [\r\n ast_1.Node.createModifier(ast_1.ModifierKind.CONST, tn.range())\r\n ], null);\r\n case tokenizer_1.Token.CONTINUE:\r\n return this.parseContinue(tn);\r\n case tokenizer_1.Token.DO:\r\n return this.parseDoStatement(tn);\r\n case tokenizer_1.Token.FOR:\r\n return this.parseForStatement(tn);\r\n case tokenizer_1.Token.IF:\r\n return this.parseIfStatement(tn);\r\n case tokenizer_1.Token.LET:\r\n return this.parseVariable(tn, [\r\n ast_1.Node.createModifier(ast_1.ModifierKind.LET, tn.range())\r\n ], null);\r\n case tokenizer_1.Token.VAR:\r\n return this.parseVariable(tn, null, null);\r\n case tokenizer_1.Token.OPENBRACE:\r\n return this.parseBlockStatement(tn, topLevel);\r\n case tokenizer_1.Token.RETURN:\r\n if (topLevel) {\r\n this.error(diagnostics_1.DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body, tn.range()); // recoverable\r\n }\r\n return this.parseReturn(tn);\r\n case tokenizer_1.Token.SEMICOLON:\r\n return ast_1.Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n case tokenizer_1.Token.SWITCH:\r\n return this.parseSwitchStatement(tn);\r\n case tokenizer_1.Token.THROW:\r\n return this.parseThrowStatement(tn);\r\n case tokenizer_1.Token.TRY:\r\n return this.parseTryStatement(tn);\r\n case tokenizer_1.Token.TYPE:\r\n return this.parseTypeDeclaration(tn, null);\r\n case tokenizer_1.Token.WHILE:\r\n return this.parseWhileStatement(tn);\r\n default:\r\n tn.reset();\r\n return this.parseExpressionStatement(tn);\r\n }\r\n };\r\n Parser.prototype.parseBlockStatement = function (tn, topLevel) {\r\n // at '{': Statement* '}' ';'?\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn, topLevel);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n var ret = ast_1.Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseBreak = function (tn) {\r\n // at 'break': Identifier? ';'?\r\n var identifier = null;\r\n if (tn.peek(true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = ast_1.Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseContinue = function (tn) {\r\n // at 'continue': Identifier? ';'?\r\n var identifier = null;\r\n if (tn.peek(true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = ast_1.Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseDoStatement = function (tn) {\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.WHILE)) {\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var ret = ast_1.Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"while\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExpressionStatement = function (tn) {\r\n // at previous token\r\n var expr = this.parseExpression(tn);\r\n if (!expr)\r\n return null;\r\n var ret = ast_1.Node.createExpressionStatement(expr);\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseForStatement = function (tn) {\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.LET) || tn.skip(tokenizer_1.Token.CONST) || tn.skip(tokenizer_1.Token.VAR)) {\r\n initializer = this.parseVariable(tn, null, null);\r\n }\r\n else if (!tn.skip(tokenizer_1.Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer)\r\n return null;\r\n }\r\n if (tn.token == tokenizer_1.Token.SEMICOLON) {\r\n var condition = null;\r\n if (!tn.skip(tokenizer_1.Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition)\r\n return null;\r\n }\r\n if (tn.token == tokenizer_1.Token.SEMICOLON) {\r\n var incrementor = null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n }\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n return ast_1.Node.createForStatement(initializer, condition\r\n ? condition.expression\r\n : null, incrementor, statement, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \";\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \";\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseIfStatement = function (tn) {\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n var elseStatement = null;\r\n if (tn.skip(tokenizer_1.Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement)\r\n return null;\r\n }\r\n return ast_1.Node.createIfStatement(condition, statement, elseStatement, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseSwitchStatement = function (tn) {\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var cases = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var case_ = this.parseSwitchCase(tn);\r\n if (!case_)\r\n return null;\r\n cases.push(case_);\r\n }\r\n var ret = ast_1.Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseSwitchCase = function (tn) {\r\n var startPos = tn.tokenPos;\r\n var statements, statement;\r\n // 'case' Expression ':' Statement*\r\n if (tn.skip(tokenizer_1.Token.CASE)) {\r\n var label = this.parseExpression(tn);\r\n if (!label)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != tokenizer_1.Token.CASE && tn.nextToken != tokenizer_1.Token.DEFAULT && tn.nextToken != tokenizer_1.Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n return ast_1.Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n }\r\n // 'default' ':' Statement*\r\n }\r\n else if (tn.skip(tokenizer_1.Token.DEFAULT)) {\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != tokenizer_1.Token.CASE && tn.nextToken != tokenizer_1.Token.DEFAULT && tn.nextToken != tokenizer_1.Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n return ast_1.Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._case_or_default_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseThrowStatement = function (tn) {\r\n // at 'throw': Expression ';'?\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression)\r\n return null;\r\n var ret = ast_1.Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseTryStatement = function (tn) {\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n var startPos = tn.tokenPos;\r\n var stmt;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n statements.push(stmt);\r\n }\r\n var catchVariable = null;\r\n var catchStatements = null;\r\n var finallyStatements = null;\r\n if (tn.skip(tokenizer_1.Token.CATCH)) {\r\n if (!tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n return null;\r\n }\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n catchVariable = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n if (!tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(tokenizer_1.Token.FINALLY)) {\r\n if (!tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"catch\");\r\n return null;\r\n }\r\n var ret = ast_1.Node.createTryStatement(statements, catchVariable, catchStatements, finallyStatements, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseTypeDeclaration = function (tn, modifiers, decorators) {\r\n // at 'type': Identifier '=' Type ';'?\r\n if (modifiers === void 0) { modifiers = null; }\r\n if (decorators === void 0) { decorators = null; }\r\n var startPos = decorators && decorators.length ? decorators[0].range.start\r\n : modifiers && modifiers.length ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var name = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n var type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n var ret = ast_1.Node.createTypeDeclaration(name, type, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"=\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseWhileStatement = function (tn) {\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var expression = this.parseExpression(tn);\r\n if (!expression)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n var ret = ast_1.Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n Parser.prototype.parseExpressionStart = function (tn) {\r\n var token = tn.next(true);\r\n var startPos = tn.tokenPos;\r\n var expr = null;\r\n if (token == tokenizer_1.Token.NULL) {\r\n return ast_1.Node.createNullExpression(tn.range());\r\n }\r\n if (token == tokenizer_1.Token.TRUE) {\r\n return ast_1.Node.createTrueExpression(tn.range());\r\n }\r\n if (token == tokenizer_1.Token.FALSE) {\r\n return ast_1.Node.createFalseExpression(tn.range());\r\n }\r\n var p = determinePrecedenceStart(token);\r\n if (p != -1 /* INVALID */) {\r\n var operand;\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n // NewExpression\r\n if (token == tokenizer_1.Token.NEW) {\r\n operand = this.parseExpression(tn, 18 /* CALL */);\r\n if (!operand)\r\n return null;\r\n if (operand.kind == ast_1.NodeKind.CALL) {\r\n return ast_1.Node.createNewExpression(operand.expression, operand.typeArguments, operand.arguments, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, tn.range());\r\n }\r\n return null;\r\n }\r\n else {\r\n operand = this.parseExpression(tn, p);\r\n if (!operand)\r\n return null;\r\n }\r\n // UnaryPrefixExpression\r\n if (token == tokenizer_1.Token.PLUS_PLUS || token == tokenizer_1.Token.MINUS_MINUS) {\r\n if (operand.kind != ast_1.NodeKind.IDENTIFIER &&\r\n operand.kind != ast_1.NodeKind.ELEMENTACCESS &&\r\n operand.kind != ast_1.NodeKind.PROPERTYACCESS) {\r\n this.error(diagnostics_1.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, operand.range);\r\n }\r\n }\r\n return ast_1.Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n switch (token) {\r\n // ParenthesizedExpression\r\n case tokenizer_1.Token.OPENPAREN:\r\n expr = this.parseExpression(tn);\r\n if (!expr)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n return ast_1.Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n // ArrayLiteralExpression\r\n case tokenizer_1.Token.OPENBRACKET:\r\n var elementExpressions = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n do {\r\n if (tn.peek() == tokenizer_1.Token.COMMA) {\r\n expr = null; // omitted\r\n }\r\n else {\r\n expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (tn.peek() == tokenizer_1.Token.CLOSEBRACKET)\r\n break;\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n // AssertionExpression (unary prefix)\r\n case tokenizer_1.Token.LESSTHAN:\r\n var toType = this.parseType(tn);\r\n if (!toType)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \">\");\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, 18 /* CALL */);\r\n if (!expr)\r\n return null;\r\n return ast_1.Node.createAssertionExpression(0 /* PREFIX */, expr, toType, tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.IDENTIFIER:\r\n return ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.THIS:\r\n return ast_1.Node.createThisExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.CONSTRUCTOR:\r\n return ast_1.Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.SUPER:\r\n return ast_1.Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.STRINGLITERAL:\r\n return ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.INTEGERLITERAL:\r\n return ast_1.Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.FLOATLITERAL:\r\n return ast_1.Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case tokenizer_1.Token.SLASH:\r\n var regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(tokenizer_1.Token.SLASH)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"/\");\r\n return null;\r\n }\r\n return ast_1.Node.createRegexpLiteralExpression(regexpPattern, tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos));\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Expression_expected, tn.range());\r\n return null;\r\n }\r\n };\r\n Parser.prototype.tryParseTypeArgumentsBeforeArguments = function (tn) {\r\n // at '<': Type (',' Type)* '>' '('\r\n tn.mark();\r\n if (!tn.skip(tokenizer_1.Token.LESSTHAN))\r\n return null;\r\n var typeArguments = new Array();\r\n do {\r\n var type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset();\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (tn.skip(tokenizer_1.Token.GREATERTHAN) && tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset();\r\n return null;\r\n };\r\n Parser.prototype.parseArguments = function (tn) {\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n var args = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n do {\r\n var expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n args.push(expr);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n }\r\n return args;\r\n };\r\n Parser.prototype.parseExpression = function (tn, precedence) {\r\n if (precedence === void 0) { precedence = 0; }\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr)\r\n return null;\r\n var startPos = expr.range.start;\r\n // CallExpression\r\n var typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn); // skips '(' on success\r\n // there might be better ways to distinguish a LESSTHAN from a CALL with type arguments\r\n if (typeArguments || tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var args = this.parseArguments(tn);\r\n if (!args)\r\n return null;\r\n expr = ast_1.Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos));\r\n }\r\n var token;\r\n var next = null;\r\n var nextPrecedence;\r\n while ((nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence) {\r\n tn.next();\r\n switch (token) {\r\n // AssertionExpression\r\n case tokenizer_1.Token.AS:\r\n var toType = this.parseType(tn);\r\n if (!toType)\r\n return null;\r\n expr = ast_1.Node.createAssertionExpression(1 /* AS */, expr, toType, tn.range(startPos, tn.pos));\r\n break;\r\n // ElementAccessExpression\r\n case tokenizer_1.Token.OPENBRACKET:\r\n next = this.parseExpression(tn);\r\n if (!next)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n return null;\r\n }\r\n expr = ast_1.Node.createElementAccessExpression(expr, next, tn.range(startPos, tn.pos));\r\n break;\r\n // UnaryPostfixExpression\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n if (expr.kind != ast_1.NodeKind.IDENTIFIER &&\r\n expr.kind != ast_1.NodeKind.ELEMENTACCESS &&\r\n expr.kind != ast_1.NodeKind.PROPERTYACCESS) {\r\n this.error(diagnostics_1.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, expr.range);\r\n }\r\n expr = ast_1.Node.createUnaryPostfixExpression(token, expr, tn.range(startPos, tn.pos));\r\n break;\r\n // TernaryExpression\r\n case tokenizer_1.Token.QUESTION:\r\n var ifThen = this.parseExpression(tn);\r\n if (!ifThen)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.COLON)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n return null;\r\n }\r\n var ifElse = this.parseExpression(tn);\r\n if (!ifElse)\r\n return null;\r\n expr = ast_1.Node.createTernaryExpression(expr, ifThen, ifElse, tn.range(startPos, tn.pos));\r\n break;\r\n // CommaExpression\r\n case tokenizer_1.Token.COMMA:\r\n var commaExprs = [expr];\r\n do {\r\n expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n expr = ast_1.Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n default:\r\n next = this.parseExpression(tn, isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1);\r\n if (!next)\r\n return null;\r\n // PropertyAccessExpression\r\n if (token == tokenizer_1.Token.DOT) {\r\n if (next.kind == ast_1.NodeKind.IDENTIFIER) {\r\n expr = ast_1.Node.createPropertyAccessExpression(expr, next, tn.range(startPos, tn.pos));\r\n }\r\n else if (next.kind == ast_1.NodeKind.CALL) {\r\n var propertyCall = next;\r\n if (propertyCall.expression.kind == ast_1.NodeKind.IDENTIFIER) {\r\n propertyCall.expression = ast_1.Node.createPropertyAccessExpression(expr, propertyCall.expression, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, propertyCall.expression.range);\r\n return null;\r\n }\r\n expr = propertyCall;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, next.range);\r\n return null;\r\n }\r\n // BinaryExpression\r\n }\r\n else {\r\n expr = ast_1.Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n };\r\n return Parser;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Parser = Parser;\r\n/** Operator precedence from least to largest. */\r\nvar Precedence;\r\n(function (Precedence) {\r\n Precedence[Precedence[\"COMMA\"] = 0] = \"COMMA\";\r\n Precedence[Precedence[\"SPREAD\"] = 1] = \"SPREAD\";\r\n Precedence[Precedence[\"YIELD\"] = 2] = \"YIELD\";\r\n Precedence[Precedence[\"ASSIGNMENT\"] = 3] = \"ASSIGNMENT\";\r\n Precedence[Precedence[\"CONDITIONAL\"] = 4] = \"CONDITIONAL\";\r\n Precedence[Precedence[\"LOGICAL_OR\"] = 5] = \"LOGICAL_OR\";\r\n Precedence[Precedence[\"LOGICAL_AND\"] = 6] = \"LOGICAL_AND\";\r\n Precedence[Precedence[\"BITWISE_OR\"] = 7] = \"BITWISE_OR\";\r\n Precedence[Precedence[\"BITWISE_XOR\"] = 8] = \"BITWISE_XOR\";\r\n Precedence[Precedence[\"BITWISE_AND\"] = 9] = \"BITWISE_AND\";\r\n Precedence[Precedence[\"EQUALITY\"] = 10] = \"EQUALITY\";\r\n Precedence[Precedence[\"RELATIONAL\"] = 11] = \"RELATIONAL\";\r\n Precedence[Precedence[\"SHIFT\"] = 12] = \"SHIFT\";\r\n Precedence[Precedence[\"ADDITIVE\"] = 13] = \"ADDITIVE\";\r\n Precedence[Precedence[\"MULTIPLICATIVE\"] = 14] = \"MULTIPLICATIVE\";\r\n Precedence[Precedence[\"EXPONENTIATED\"] = 15] = \"EXPONENTIATED\";\r\n Precedence[Precedence[\"UNARY_PREFIX\"] = 16] = \"UNARY_PREFIX\";\r\n Precedence[Precedence[\"UNARY_POSTFIX\"] = 17] = \"UNARY_POSTFIX\";\r\n Precedence[Precedence[\"CALL\"] = 18] = \"CALL\";\r\n Precedence[Precedence[\"MEMBERACCESS\"] = 19] = \"MEMBERACCESS\";\r\n Precedence[Precedence[\"GROUPING\"] = 20] = \"GROUPING\";\r\n Precedence[Precedence[\"INVALID\"] = -1] = \"INVALID\";\r\n})(Precedence = exports.Precedence || (exports.Precedence = {}));\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.DOT_DOT_DOT:\r\n return 1 /* SPREAD */;\r\n case tokenizer_1.Token.YIELD:\r\n return 2 /* YIELD */;\r\n case tokenizer_1.Token.EXCLAMATION:\r\n case tokenizer_1.Token.TILDE:\r\n case tokenizer_1.Token.PLUS:\r\n case tokenizer_1.Token.MINUS:\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n case tokenizer_1.Token.TYPEOF:\r\n case tokenizer_1.Token.VOID:\r\n case tokenizer_1.Token.DELETE:\r\n return 16 /* UNARY_PREFIX */;\r\n case tokenizer_1.Token.NEW:\r\n return 19 /* MEMBERACCESS */;\r\n default:\r\n return -1 /* INVALID */;\r\n }\r\n}\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.COMMA:\r\n return 0 /* COMMA */;\r\n case tokenizer_1.Token.EQUALS:\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n return 3 /* ASSIGNMENT */;\r\n case tokenizer_1.Token.QUESTION:\r\n return 4 /* CONDITIONAL */;\r\n case tokenizer_1.Token.BAR_BAR:\r\n return 5 /* LOGICAL_OR */;\r\n case tokenizer_1.Token.AMPERSAND_AMPERSAND:\r\n return 6 /* LOGICAL_AND */;\r\n case tokenizer_1.Token.BAR:\r\n return 7 /* BITWISE_OR */;\r\n case tokenizer_1.Token.CARET:\r\n return 8 /* BITWISE_XOR */;\r\n case tokenizer_1.Token.AMPERSAND:\r\n return 9 /* BITWISE_AND */;\r\n case tokenizer_1.Token.EQUALS_EQUALS:\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS:\r\n case tokenizer_1.Token.EQUALS_EQUALS_EQUALS:\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS_EQUALS:\r\n return 10 /* EQUALITY */;\r\n case tokenizer_1.Token.AS:\r\n case tokenizer_1.Token.IN:\r\n case tokenizer_1.Token.INSTANCEOF:\r\n case tokenizer_1.Token.LESSTHAN:\r\n case tokenizer_1.Token.GREATERTHAN:\r\n case tokenizer_1.Token.LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_EQUALS:\r\n return 11 /* RELATIONAL */;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n return 12 /* SHIFT */;\r\n case tokenizer_1.Token.PLUS:\r\n case tokenizer_1.Token.MINUS:\r\n return 13 /* ADDITIVE */;\r\n case tokenizer_1.Token.ASTERISK:\r\n case tokenizer_1.Token.SLASH:\r\n case tokenizer_1.Token.PERCENT:\r\n return 14 /* MULTIPLICATIVE */;\r\n case tokenizer_1.Token.ASTERISK_ASTERISK:\r\n return 15 /* EXPONENTIATED */;\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n return 17 /* UNARY_POSTFIX */;\r\n case tokenizer_1.Token.DOT:\r\n case tokenizer_1.Token.NEW:\r\n case tokenizer_1.Token.OPENBRACKET:\r\n return 19 /* MEMBERACCESS */;\r\n default:\r\n return -1 /* INVALID */;\r\n }\r\n}\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.EQUALS:\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n case tokenizer_1.Token.QUESTION:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// assemblyscript.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8abb22f57846a456c1cd","import {\r\n Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n None = _BinaryenTypeNone(),\r\n I32 = _BinaryenTypeInt32(),\r\n I64 = _BinaryenTypeInt64(),\r\n F32 = _BinaryenTypeFloat32(),\r\n F64 = _BinaryenTypeFloat64(),\r\n Unreachable = _BinaryenTypeUnreachable(),\r\n Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n Invalid = _BinaryenInvalidId(),\r\n Block = _BinaryenBlockId(),\r\n If = _BinaryenIfId(),\r\n Loop = _BinaryenLoopId(),\r\n Break = _BinaryenBreakId(),\r\n Switch = _BinaryenSwitchId(),\r\n Call = _BinaryenCallId(),\r\n CallImport = _BinaryenCallImportId(),\r\n CallIndirect = _BinaryenCallIndirectId(),\r\n GetLocal = _BinaryenGetLocalId(),\r\n SetLocal = _BinaryenSetLocalId(),\r\n GetGlobal = _BinaryenGetGlobalId(),\r\n SetGlobal = _BinaryenSetGlobalId(),\r\n Load = _BinaryenLoadId(),\r\n Store = _BinaryenStoreId(),\r\n Const = _BinaryenConstId(),\r\n Unary = _BinaryenUnaryId(),\r\n Binary = _BinaryenBinaryId(),\r\n Select = _BinaryenSelectId(),\r\n Drop = _BinaryenDropId(),\r\n Return = _BinaryenReturnId(),\r\n Host = _BinaryenHostId(),\r\n Nop = _BinaryenNopId(),\r\n Unreachable = _BinaryenUnreachableId(),\r\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n AtomicRMW = _BinaryenAtomicRMWId(),\r\n AtomicWait = _BinaryenAtomicWaitId(),\r\n AtomicWake = _BinaryenAtomicWakeId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n ClzI32 = _BinaryenClzInt32(),\r\n CtzI32 = _BinaryenCtzInt32(),\r\n PopcntI32 = _BinaryenPopcntInt32(),\r\n NegF32 = _BinaryenNegFloat32(),\r\n AbsF32 = _BinaryenAbsFloat32(),\r\n CeilF32 = _BinaryenCeilFloat32(),\r\n FloorF32 = _BinaryenFloorFloat32(),\r\n TruncF32 = _BinaryenTruncFloat32(),\r\n NearestF32 = _BinaryenNearestFloat32(),\r\n SqrtF32 = _BinaryenSqrtFloat32(),\r\n EqzI32 = _BinaryenEqZInt32(),\r\n ClzI64 = _BinaryenClzInt64(),\r\n CtzI64 = _BinaryenCtzInt64(),\r\n PopcntI64 = _BinaryenPopcntInt64(),\r\n NegF64 = _BinaryenNegFloat64(),\r\n AbsF64 = _BinaryenAbsFloat64(),\r\n CeilF64 = _BinaryenCeilFloat64(),\r\n FloorF64 = _BinaryenFloorFloat64(),\r\n TruncF64 = _BinaryenTruncFloat64(),\r\n NearestF64 = _BinaryenNearestFloat64(),\r\n SqrtF64 = _BinaryenSqrtFloat64(),\r\n EqzI64 = _BinaryenEqZInt64(),\r\n ExtendI32 = _BinaryenExtendSInt32(),\r\n ExtendU32 = _BinaryenExtendUInt32(),\r\n WrapI64 = _BinaryenWrapInt64(),\r\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n PromoteF32 = _BinaryenPromoteFloat32(),\r\n DemoteF64 = _BinaryenDemoteFloat64(),\r\n ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n ReinterpretI64 = _BinaryenReinterpretInt64()\r\n\r\n // see: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#new-sign-extending-operators\r\n // ExtendI8ToI32 =_BinaryenExtendS8Int32()\r\n // ExtendI16ToI32 = _BinaryenExtendS16Int32()\r\n // ExtendI8ToI64 = _BinaryenExtendS8Int64() // operand is I64\r\n // ExtendI16ToI64 = _BinaryenExtendS16Int64()\r\n // ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n AddI32 = _BinaryenAddInt32(),\r\n SubI32 = _BinaryenSubInt32(),\r\n MulI32 = _BinaryenMulInt32(),\r\n DivI32 = _BinaryenDivSInt32(),\r\n DivU32 = _BinaryenDivUInt32(),\r\n RemI32 = _BinaryenRemSInt32(),\r\n RemU32 = _BinaryenRemUInt32(),\r\n AndI32 = _BinaryenAndInt32(),\r\n OrI32 = _BinaryenOrInt32(),\r\n XorI32 = _BinaryenXorInt32(),\r\n ShlI32 = _BinaryenShlInt32(),\r\n ShrU32 = _BinaryenShrUInt32(),\r\n ShrI32 = _BinaryenShrSInt32(),\r\n RotlI32 = _BinaryenRotLInt32(),\r\n RotrI32 = _BinaryenRotRInt32(),\r\n EqI32 = _BinaryenEqInt32(),\r\n NeI32 = _BinaryenNeInt32(),\r\n LtI32 = _BinaryenLtSInt32(),\r\n LtU32 = _BinaryenLtUInt32(),\r\n LeI32 = _BinaryenLeSInt32(),\r\n LeU32 = _BinaryenLeUInt32(),\r\n GtI32 = _BinaryenGtSInt32(),\r\n GtU32 = _BinaryenGtUInt32(),\r\n GeI32 = _BinaryenGeSInt32(),\r\n GeU32 = _BinaryenGeUInt32(),\r\n AddI64 = _BinaryenAddInt64(),\r\n SubI64 = _BinaryenSubInt64(),\r\n MulI64 = _BinaryenMulInt64(),\r\n DivI64 = _BinaryenDivSInt64(),\r\n DivU64 = _BinaryenDivUInt64(),\r\n RemI64 = _BinaryenRemSInt64(),\r\n RemU64 = _BinaryenRemUInt64(),\r\n AndI64 = _BinaryenAndInt64(),\r\n OrI64 = _BinaryenOrInt64(),\r\n XorI64 = _BinaryenXorInt64(),\r\n ShlI64 = _BinaryenShlInt64(),\r\n ShrU64 = _BinaryenShrUInt64(),\r\n ShrI64 = _BinaryenShrSInt64(),\r\n RotlI64 = _BinaryenRotLInt64(),\r\n RotrI64 = _BinaryenRotRInt64(),\r\n EqI64 = _BinaryenEqInt64(),\r\n NeI64 = _BinaryenNeInt64(),\r\n LtI64 = _BinaryenLtSInt64(),\r\n LtU64 = _BinaryenLtUInt64(),\r\n LeI64 = _BinaryenLeSInt64(),\r\n LeU64 = _BinaryenLeUInt64(),\r\n GtI64 = _BinaryenGtSInt64(),\r\n GtU64 = _BinaryenGtUInt64(),\r\n GeI64 = _BinaryenGeSInt64(),\r\n GeU64 = _BinaryenGeUInt64(),\r\n AddF32 = _BinaryenAddFloat32(),\r\n SubF32 = _BinaryenSubFloat32(),\r\n MulF32 = _BinaryenMulFloat32(),\r\n DivF32 = _BinaryenDivFloat32(),\r\n CopysignF32 = _BinaryenCopySignFloat32(),\r\n MinF32 = _BinaryenMinFloat32(),\r\n MaxF32 = _BinaryenMaxFloat32(),\r\n EqF32 = _BinaryenEqFloat32(),\r\n NeF32 = _BinaryenNeFloat32(),\r\n LtF32 = _BinaryenLtFloat32(),\r\n LeF32 = _BinaryenLeFloat32(),\r\n GtF32 = _BinaryenGtFloat32(),\r\n GeF32 = _BinaryenGeFloat32(),\r\n AddF64 = _BinaryenAddFloat64(),\r\n SubF64 = _BinaryenSubFloat64(),\r\n MulF64 = _BinaryenMulFloat64(),\r\n DivF64 = _BinaryenDivFloat64(),\r\n CopysignF64 = _BinaryenCopySignFloat64(),\r\n MinF64 = _BinaryenMinFloat64(),\r\n MaxF64 = _BinaryenMaxFloat64(),\r\n EqF64 = _BinaryenEqFloat64(),\r\n NeF64 = _BinaryenNeFloat64(),\r\n LtF64 = _BinaryenLtFloat64(),\r\n LeF64 = _BinaryenLeFloat64(),\r\n GtF64 = _BinaryenGtFloat64(),\r\n GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n PageSize = _BinaryenPageSize(),\r\n CurrentMemory = _BinaryenCurrentMemory(),\r\n GrowMemory = _BinaryenGrowMemory(),\r\n HasFeature = _BinaryenHasFeature(),\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n Add = _BinaryenAtomicRMWAdd(),\r\n Sub = _BinaryenAtomicRMWSub(),\r\n And = _BinaryenAtomicRMWAnd(),\r\n Or = _BinaryenAtomicRMWOr(),\r\n Xor = _BinaryenAtomicRMWXor(),\r\n Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n buffer: Uint8Array;\r\n offset: I64;\r\n\r\n static create(buffer: Uint8Array, offset: I64) {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n }\r\n}\r\n\r\nexport class Module {\r\n\r\n ref: ModuleRef;\r\n out: usize;\r\n\r\n static readonly MAX_MEMORY_WASM32: Index = 0xffff;\r\n // TODO: static readonly MAX_MEMORY_WASM64\r\n\r\n static create(): Module {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.out = allocate_memory(16);\r\n return module;\r\n }\r\n\r\n static createFrom(buffer: Uint8Array): Module {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.out = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n return module;\r\n } finally {\r\n free_memory(changetype(cArr));\r\n }\r\n }\r\n\r\n private constructor() { }\r\n\r\n // types\r\n\r\n addFunctionType(\r\n name: string,\r\n result: NativeType,\r\n paramTypes: NativeType[]\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes.length);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n getFunctionTypeBySignature(\r\n result: NativeType,\r\n paramTypes: NativeType[]\r\n ): FunctionTypeRef {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes.length);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n // constants\r\n\r\n createI32(value: i32): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF32(value: f32): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF64(value: f64): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n // expressions\r\n\r\n createUnary(\r\n op: UnaryOp,\r\n expr: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n }\r\n\r\n createBinary(\r\n op: BinaryOp,\r\n left: ExpressionRef,\r\n right: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n }\r\n\r\n createHost(\r\n op: HostOp,\r\n name: string | null = null,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createGetLocal(\r\n index: i32,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n }\r\n\r\n createTeeLocal(\r\n index: i32,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n }\r\n\r\n createGetGlobal(\r\n name: string,\r\n type: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createLoad(\r\n bytes: Index,\r\n signed: bool,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n }\r\n\r\n createStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n }\r\n\r\n createAtomicLoad(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n }\r\n\r\n createAtomicStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicRMW(\r\n op: AtomicRMWOp,\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicCmpxchg(\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n replacement: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n }\r\n\r\n createAtomicWait(\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n timeout: ExpressionRef,\r\n expectedType: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n }\r\n\r\n createAtomicWake(\r\n ptr: ExpressionRef,\r\n wakeCount: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n }\r\n\r\n // statements\r\n\r\n createSetLocal(\r\n index: Index,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n }\r\n\r\n createSetGlobal(\r\n name: string,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createBlock(\r\n label: string | null,\r\n children: ExpressionRef[],\r\n type: NativeType = NativeType.None\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n var cArr = allocI32Array(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createBreak(\r\n label: string | null,\r\n condition: ExpressionRef = 0,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createDrop(\r\n expression: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenDrop(this.ref, expression);\r\n }\r\n\r\n createLoop(\r\n label: string | null,\r\n body: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createIf(\r\n condition: ExpressionRef,\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createNop(): ExpressionRef {\r\n return _BinaryenNop(this.ref);\r\n }\r\n\r\n createReturn(\r\n expression: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenReturn(this.ref, expression);\r\n }\r\n\r\n createSelect(\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef,\r\n condition: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createSwitch(\r\n names: string[],\r\n defaultName: string | null,\r\n condition: ExpressionRef,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var strs = new Array(names.length);\r\n for (var i = 0, k: i32 = names.length; i < k; ++i) {\r\n strs[i] = allocString(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = allocString(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, k, cStr, condition, value);\r\n } finally {\r\n free_memory(cStr);\r\n free_memory(cArr);\r\n for (i = k - 1; i >= 0; --i) free_memory(strs[i]);\r\n }\r\n }\r\n\r\n createCall(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createCallImport(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createUnreachable(): ExpressionRef {\r\n return _BinaryenUnreachable(this.ref);\r\n }\r\n\r\n // meta\r\n\r\n addGlobal(\r\n name: string,\r\n type: NativeType,\r\n mutable: bool,\r\n initializer: ExpressionRef\r\n ): GlobalRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunction(\r\n name: string,\r\n type: FunctionTypeRef,\r\n varTypes: NativeType[],\r\n body: ExpressionRef\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes.length, body);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n removeFunction(name: string): void {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunctionExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addTableExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addMemoryExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addGlobalExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n removeExport(externalName: string): void {\r\n var cStr = allocString(externalName);\r\n try {\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunctionImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n functionType: FunctionTypeRef\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addTableImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addMemoryImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addGlobalImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n globalType: NativeType\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n removeImport(internalName: string): void {\r\n var cStr = allocString(internalName);\r\n try {\r\n _BinaryenRemoveImport(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n setMemory(\r\n initial: Index,\r\n maximum: Index,\r\n segments: MemorySegment[],\r\n target: Target,\r\n exportName: string | null = null\r\n ): void {\r\n var cStr = allocString(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var buffer = segments[i].buffer;\r\n var offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n } finally {\r\n free_memory(cArr3);\r\n free_memory(cArr2);\r\n free_memory(cArr1);\r\n for (i = k - 1; i >= 0; --i) free_memory(segs[i]);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n setFunctionTable(funcs: FunctionRef[]): void {\r\n var cArr = allocI32Array(funcs);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n setStart(func: FunctionRef): void {\r\n _BinaryenSetStart(this.ref, func);\r\n }\r\n\r\n setOptimizeLevel(level: i32 = 2): void {\r\n _BinaryenSetOptimizeLevel(level);\r\n }\r\n\r\n setShrinkLevel(level: i32 = 1): void {\r\n _BinaryenSetShrinkLevel(level);\r\n }\r\n\r\n setDebugInfo(on: bool = false): void {\r\n _BinaryenSetDebugInfo(on);\r\n }\r\n\r\n optimize(func: FunctionRef = 0): void {\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n } else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n }\r\n\r\n runPasses(passes: string[], func: FunctionRef = 0): void {\r\n var k = passes.length;\r\n var names = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, k);\r\n } else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, k);\r\n }\r\n } finally {\r\n free_memory(cArr);\r\n for (; i >= 0; --i) free_memory(names[i]);\r\n }\r\n }\r\n\r\n validate(): bool {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n }\r\n\r\n interpret(): void {\r\n _BinaryenModuleInterpret(this.ref);\r\n }\r\n\r\n toBinary(sourceMapUrl: string | null): Binary {\r\n var out = this.out;\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr: usize = 0;\r\n var sourceMapPtr: usize = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n var binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n var ret = new Binary();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n } finally {\r\n if (cStr) free_memory(cStr);\r\n if (binaryPtr) free_memory(binaryPtr);\r\n if (sourceMapPtr) free_memory(sourceMapPtr);\r\n }\r\n }\r\n\r\n toText(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n toAsmjs(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n dispose(): void {\r\n if (!this.ref) return; // sic\r\n _BinaryenModuleDispose(this.ref);\r\n free_memory(this.out);\r\n }\r\n\r\n createRelooper(): Relooper {\r\n return Relooper.create(this);\r\n }\r\n\r\n cloneExpression(expr: ExpressionRef,\r\n noSideEffects: bool = false,\r\n maxDepth: i32 = i32.MAX_VALUE\r\n ): ExpressionRef { // currently supports side effect free expressions only\r\n if (maxDepth < 0) return 0;\r\n maxDepth -= 1;\r\n\r\n var nested1: ExpressionRef,\r\n nested2: ExpressionRef;\r\n\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n\r\n case ExpressionId.Const:\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n case NativeType.I64:\r\n return this.createI64(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n case NativeType.F32:\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n case NativeType.F64:\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n\r\n case ExpressionId.GetLocal:\r\n return _BinaryenGetLocal(this.ref,\r\n _BinaryenGetLocalGetIndex(expr),\r\n _BinaryenExpressionGetType(expr)\r\n );\r\n\r\n case ExpressionId.GetGlobal:\r\n var globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName) break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n\r\n case ExpressionId.Load:\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n : _BinaryenLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenLoadGetAlign(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n );\r\n\r\n case ExpressionId.Unary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n\r\n case ExpressionId.Binary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n return 0;\r\n }\r\n\r\n // source map generation\r\n\r\n addDebugInfoFile(name: string): Index {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n getDebugInfoFile(index: Index): string | null {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n }\r\n\r\n setDebugLocation(\r\n func: FunctionRef,\r\n expr: ExpressionRef,\r\n fileIndex: Index,\r\n lineNumber: Index,\r\n columnNumber: Index\r\n ): void {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n }\r\n}\r\n\r\nexport class Relooper {\r\n\r\n module: Module;\r\n ref: RelooperRef;\r\n\r\n static create(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate();\r\n return relooper;\r\n }\r\n\r\n static createStub(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = 0;\r\n return relooper;\r\n }\r\n\r\n private constructor() {}\r\n\r\n addBlock(code: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlock(this.ref, code);\r\n }\r\n\r\n addBranch(from: RelooperBlockRef, to: RelooperBlockRef, condition: ExpressionRef = 0, code: ExpressionRef = 0): void {\r\n _RelooperAddBranch(from, to, condition, code);\r\n }\r\n\r\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n }\r\n\r\n addBranchForSwitch(from: RelooperBlockRef, to: RelooperBlockRef, indexes: i32[], code: ExpressionRef = 0): void {\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n }\r\n}\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n if (!u8s) return 0;\r\n var ptr = allocate_memory(u8s.length);\r\n var idx = ptr;\r\n for (var i = 0, k = u8s.length; i < k; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n if (!i32s) return 0;\r\n var ptr = allocate_memory(i32s.length << 2);\r\n var idx = ptr;\r\n for (var i = 0, k = i32s.length; i < k; ++i) {\r\n var val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx , ( val & 0xff) as u8);\r\n store(idx + 1, ((val >> 8) & 0xff) as u8);\r\n store(idx + 2, ((val >> 16) & 0xff) as u8);\r\n store(idx + 3, ( val >>> 24 ) as u8);\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n var len = 0;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n } else if (u <= 0x7FF) {\r\n len += 2;\r\n } else if (u <= 0xFFFF) {\r\n len += 3;\r\n } else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n } else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n } else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n if (str == null) return 0;\r\n var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n var idx = ptr;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u as u8);\r\n } else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else {\r\n store(idx++, (0xFC | (u >>> 30) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\n\r\nexport function readInt(ptr: usize): i32 {\r\n return (\r\n load(ptr ) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24)\r\n );\r\n}\r\n\r\nexport function readBuffer(ptr: usize, length: usize): Uint8Array {\r\n var ret = new Uint8Array(length);\r\n for (var i: usize = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n if (!ptr) return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp: u32;\r\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n } else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n } else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nclass Binary {\r\n /** WebAssembly binary. */\r\n output: Uint8Array;\r\n /** Source map, if generated. */\r\n sourceMap: string | null;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/module.ts","import {\r\n Range\r\n} from \"./ast\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nimport {\r\n isLineBreak\r\n} from \"./util/charcode\";\r\n\r\nexport {\r\n DiagnosticCode,\r\n diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nexport enum DiagnosticCategory {\r\n INFO,\r\n WARNING,\r\n ERROR\r\n}\r\n\r\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return \"INFO\";\r\n case DiagnosticCategory.WARNING: return \"WARNING\";\r\n case DiagnosticCategory.ERROR: return \"ERROR\";\r\n default: return \"\";\r\n }\r\n}\r\n\r\nconst colorBlue: string = \"\\u001b[93m\";\r\nconst colorYellow: string = \"\\u001b[93m\";\r\nconst colorRed: string = \"\\u001b[91m\";\r\nconst colorReset: string = \"\\u001b[0m\";\r\n\r\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return colorBlue;\r\n case DiagnosticCategory.WARNING: return colorYellow;\r\n case DiagnosticCategory.ERROR: return colorRed;\r\n default: return \"\";\r\n }\r\n}\r\n\r\nexport class DiagnosticMessage {\r\n\r\n code: i32;\r\n category: DiagnosticCategory;\r\n message: string;\r\n range: Range | null = null;\r\n\r\n constructor(code: i32, category: DiagnosticCategory, message: string) {\r\n this.code = code;\r\n this.category = category;\r\n this.message = message;\r\n }\r\n\r\n static create(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n var message = diagnosticCodeToString(code);\r\n if (arg0 != null) message = message.replace(\"{0}\", arg0);\r\n if (arg1 != null) message = message.replace(\"{1}\", arg1);\r\n return new DiagnosticMessage(code, category, message);\r\n }\r\n\r\n static createInfo(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n }\r\n\r\n static createWarning(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n }\r\n\r\n static createError(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n }\r\n\r\n withRange(range: Range): this {\r\n this.range = range;\r\n return this;\r\n }\r\n\r\n toString(): string {\r\n if (this.range) {\r\n return (\r\n diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \\\"\" +\r\n this.message +\r\n \"\\\" in \" +\r\n this.range.source.normalizedPath +\r\n \" @ \" +\r\n this.range.start.toString(10) +\r\n \",\" +\r\n this.range.end.toString(10)\r\n );\r\n }\r\n return (\r\n diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \" +\r\n this.message\r\n );\r\n }\r\n}\r\n\r\nexport function formatDiagnosticMessage(\r\n message: DiagnosticMessage,\r\n useColors: bool = false,\r\n showContext: bool = false\r\n): string {\r\n // format context first (uses same string builder)\r\n var context = \"\";\r\n if (message.range && showContext) {\r\n context = formatDiagnosticContext(message.range, useColors);\r\n }\r\n\r\n // general information\r\n var sb: string[] = [];\r\n if (useColors) sb.push(diagnosticCategoryToColor(message.category));\r\n sb.push(diagnosticCategoryToString(message.category));\r\n if (useColors) sb.push(colorReset);\r\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n sb.push(message.code.toString(10));\r\n sb.push(\": \");\r\n sb.push(message.message);\r\n\r\n // range information if available\r\n if (message.range) {\r\n var range = message.range;\r\n if (showContext) {\r\n sb.push(\"\\n\");\r\n sb.push(context);\r\n }\r\n sb.push(\"\\n\");\r\n sb.push(\" in \");\r\n sb.push(range.source.normalizedPath);\r\n sb.push(\"(\");\r\n sb.push(range.line.toString(10));\r\n sb.push(\",\");\r\n sb.push(range.column.toString(10));\r\n sb.push(\")\");\r\n }\r\n return sb.join(\"\");\r\n}\r\n\r\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\r\n var text = range.source.text;\r\n var len = text.length;\r\n var start = range.start;\r\n var end = range.end;\r\n while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) {\r\n start--;\r\n }\r\n while (end < len && !isLineBreak(text.charCodeAt(end))) {\r\n end++;\r\n }\r\n var sb: string[] = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors) sb.push(colorRed);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n } else {\r\n while (start++ < range.end) {\r\n sb.push(\"~\");\r\n }\r\n }\r\n if (useColors) sb.push(colorReset);\r\n return sb.join(\"\");\r\n}\r\n\r\nexport abstract class DiagnosticEmitter {\r\n\r\n diagnostics: DiagnosticMessage[];\r\n // silentDiagnostics: bool = false;\r\n\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n\r\n emitDiagnostic(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ) {\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n }\r\n\r\n error(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1);\r\n }\r\n\r\n info(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1);\r\n }\r\n\r\n warning(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/diagnostics.ts","import {\r\n Options\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Type,\r\n typesToString\r\n} from \"./types\";\r\n\r\nimport {\r\n ModifierKind,\r\n Node,\r\n NodeKind,\r\n Source,\r\n Range,\r\n TypeNode,\r\n TypeParameter,\r\n Decorator,\r\n DecoratorKind,\r\n\r\n Expression,\r\n AssertionExpression,\r\n ElementAccessExpression,\r\n IdentifierExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n StringLiteralExpression,\r\n CallExpression,\r\n\r\n ClassDeclaration,\r\n DeclarationStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportMember,\r\n ExportStatement,\r\n FieldDeclaration,\r\n FunctionDeclaration,\r\n ImportDeclaration,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n MethodDeclaration,\r\n NamespaceDeclaration,\r\n TypeDeclaration,\r\n VariableLikeDeclarationStatement,\r\n VariableStatement,\r\n\r\n hasDecorator,\r\n hasModifier\r\n} from \"./ast\";\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n FunctionRef,\r\n} from \"./module\";\r\n\r\n/** Path delimiter inserted between file system levels. */\r\nexport const PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexport const PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexport const GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexport const SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexport const INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexport const STATIC_DELIMITER = \".\";\r\n/** Substitution used to indicate a library directory. */\r\nexport const LIBRARY_SUBST = \"(lib)\";\r\n/** Library directory prefix. */\r\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\r\n\r\nclass QueuedExport {\r\n isReExport: bool;\r\n referencedName: string;\r\n member: ExportMember;\r\n}\r\n\r\nclass QueuedImport {\r\n internalName: string;\r\n referencedName: string;\r\n referencedNameAlt: string;\r\n declaration: ImportDeclaration;\r\n}\r\n\r\nconst noTypesYet = new Map();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n /** Array of source files. */\r\n sources: Source[];\r\n /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */\r\n diagnosticsOffset: i32 = 0;\r\n /** Compiler options. */\r\n options: Options;\r\n /** Elements by internal name. */\r\n elements: Map = new Map();\r\n /** Types by internal name. */\r\n types: Map = noTypesYet;\r\n /** Declared type aliases. */\r\n typeAliases: Map = new Map();\r\n /** Exports of individual files by exported name. Not global exports. */\r\n exports: Map = new Map();\r\n\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.sources = [];\r\n }\r\n\r\n /** Initializes the program and its elements prior to compilation. */\r\n initialize(options: Options): void {\r\n this.options = options;\r\n\r\n this.types = new Map([\r\n [\"i8\", Type.i8],\r\n [\"i16\", Type.i16],\r\n [\"i32\", Type.i32],\r\n [\"i64\", Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", Type.u8],\r\n [\"u16\", Type.u16],\r\n [\"u32\", Type.u32],\r\n [\"u64\", Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", Type.bool],\r\n [\"f32\", Type.f32],\r\n [\"f64\", Type.f64],\r\n [\"void\", Type.void],\r\n [\"number\", Type.f64],\r\n [\"boolean\", Type.bool]\r\n ]);\r\n\r\n var queuedExports = new Map();\r\n var queuedImports = new Array();\r\n var queuedDerivedClasses = new Array();\r\n\r\n // build initial lookup maps of internal names to declarations\r\n for (var i = 0, k = this.sources.length; i < k; ++i) {\r\n var source = this.sources[i];\r\n var statements = source.statements;\r\n for (var j = 0, l = statements.length; j < l; ++j) {\r\n var statement = statements[j];\r\n switch (statement.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n this.initializeClass(\r\n statement,\r\n queuedDerivedClasses\r\n );\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(statement);\r\n break;\r\n\r\n case NodeKind.EXPORT:\r\n this.initializeExports(\r\n statement,\r\n queuedExports\r\n );\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(statement);\r\n break;\r\n\r\n case NodeKind.IMPORT:\r\n this.initializeImports(\r\n statement,\r\n queuedExports,\r\n queuedImports\r\n );\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(statement);\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(\r\n statement,\r\n queuedDerivedClasses\r\n );\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n this.initializeTypeAlias(statement);\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n var element: Element | null;\r\n\r\n // queued imports should be resolvable now through traversing exports and\r\n // queued exports\r\n for (i = 0; i < queuedImports.length;) {\r\n var queuedImport = queuedImports[i];\r\n element = this.tryResolveImport(\r\n queuedImport.referencedName,\r\n queuedExports\r\n );\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n element = this.tryResolveImport(\r\n queuedImport.referencedNameAlt,\r\n queuedExports\r\n );\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedImport.declaration.range,\r\n (queuedImport.declaration.parent).path.value,\r\n queuedImport.declaration.externalName.text\r\n );\r\n ++i;\r\n }\r\n }\r\n }\r\n\r\n // queued exports should be resolvable now that imports are finalized\r\n for (var [exportName, queuedExport] of queuedExports) {\r\n var currentExport: QueuedExport | null = queuedExport; // nullable below\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.exports.get(currentExport.referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n currentExport.member.externalName\r\n );\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.referencedName);\r\n if (!currentExport) {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.member.externalName.range,\r\n ((\r\n queuedExport.member.parent\r\n ).path).value,\r\n queuedExport.member.externalName.text\r\n );\r\n }\r\n } else {\r\n if (\r\n // normal export\r\n (element = this.elements.get(currentExport.referencedName)) ||\r\n // library re-export\r\n (element = this.elements.get(currentExport.member.name.text))\r\n ) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n currentExport.member.externalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n queuedExport.member.range, queuedExport.member.name.text\r\n );\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n\r\n // resolve base prototypes of derived classes\r\n for (i = 0, k = queuedDerivedClasses.length; i < k; ++i) {\r\n var derivedDeclaration = queuedDerivedClasses[i].declaration;\r\n var derivedType = assert(derivedDeclaration.extendsType);\r\n var resolved = this.resolveIdentifier(derivedType.name, null);\r\n if (resolved) {\r\n if (resolved.element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n derivedType.range\r\n );\r\n continue;\r\n }\r\n queuedDerivedClasses[i].basePrototype = (\r\n resolved.element\r\n );\r\n }\r\n }\r\n }\r\n\r\n /** Tries to resolve an import by traversing exports and queued exports. */\r\n private tryResolveImport(\r\n referencedName: string,\r\n queuedExports: Map\r\n ): Element | null {\r\n var element: Element | null;\r\n do {\r\n if (element = this.exports.get(referencedName)) {\r\n return element;\r\n }\r\n var queuedExport = queuedExports.get(referencedName);\r\n if (!queuedExport) return null;\r\n if (queuedExport.isReExport) {\r\n referencedName = queuedExport.referencedName;\r\n continue;\r\n }\r\n return this.elements.get(queuedExport.referencedName);\r\n } while (true);\r\n }\r\n\r\n private checkInternalDecorators(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n ): void {\r\n var isBuiltin: bool = hasDecorator(\"builtin\", declaration.decorators);\r\n if (isBuiltin) {\r\n element.set(ElementFlags.BUILTIN);\r\n }\r\n if (\r\n hasDecorator(\"global\", declaration.decorators) ||\r\n (\r\n declaration.range.source.isLibrary &&\r\n element.is(ElementFlags.EXPORTED) &&\r\n (\r\n assert(declaration.parent).kind == NodeKind.SOURCE ||\r\n (\r\n declaration.parent).kind == NodeKind.VARIABLE &&\r\n assert((declaration.parent).parent).kind == NodeKind.SOURCE\r\n )\r\n )\r\n ) {\r\n element.set(ElementFlags.GLOBAL);\r\n if (this.elements.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, element.internalName\r\n );\r\n } else {\r\n this.elements.set(declaration.name.text, element);\r\n this.exports.set(declaration.name.text, element);\r\n if (isBuiltin) {\r\n element.internalName = declaration.name.text;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeClass(\r\n declaration: ClassDeclaration,\r\n queuedDerivedClasses: ClassPrototype[],\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new ClassPrototype(\r\n this,\r\n declaration.name.text,\r\n internalName,\r\n declaration\r\n );\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (hasDecorator(\"unmanaged\", declaration.decorators)) {\r\n prototype.isUnmanaged = true;\r\n if (declaration.implementsTypes && declaration.implementsTypes.length) {\r\n this.error(\r\n DiagnosticCode.Structs_cannot_implement_interfaces,\r\n Range.join(\r\n declaration.name.range,\r\n declaration.implementsTypes[declaration.implementsTypes.length - 1]\r\n .range\r\n )\r\n );\r\n }\r\n } else if (declaration.implementsTypes.length) {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n // remember classes that extend another one\r\n if (declaration.extendsType) {\r\n queuedDerivedClasses.push(prototype);\r\n }\r\n\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n\r\n // otherwise add to file-level exports if exported\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n\r\n case NodeKind.METHODDECLARATION:\r\n var isGetter = hasModifier(\r\n ModifierKind.GET,\r\n memberDeclaration.modifiers\r\n );\r\n if (\r\n isGetter ||\r\n hasModifier(ModifierKind.SET, memberDeclaration.modifiers)\r\n ) {\r\n this.initializeAccessor(\r\n memberDeclaration,\r\n prototype,\r\n isGetter\r\n );\r\n } else {\r\n this.initializeMethod(\r\n memberDeclaration,\r\n prototype\r\n );\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"class member expected\");\r\n }\r\n }\r\n\r\n // check and possibly register string type\r\n if (\r\n prototype.is(ElementFlags.GLOBAL) &&\r\n declaration.name.text === \"String\" &&\r\n !this.types.has(\"string\")\r\n ) {\r\n var instance = prototype.resolve(null);\r\n if (instance) {\r\n this.types.set(\"string\", instance.type);\r\n }\r\n }\r\n }\r\n\r\n private initializeField(\r\n declaration: FieldDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n\r\n // static fields become global variables\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n var staticField = new Global(\r\n this, name, internalName, declaration, Type.void\r\n );\r\n classPrototype.members.set(name, staticField);\r\n this.elements.set(internalName, staticField);\r\n\r\n // instance fields are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instanceField = new FieldPrototype(\r\n classPrototype,\r\n name, internalName,\r\n declaration\r\n );\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n }\r\n\r\n private initializeMethod(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype: FunctionPrototype | null = null;\r\n\r\n // static methods become global functions\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n name, internalName,\r\n declaration,\r\n null\r\n );\r\n classPrototype.members.set(name, prototype);\r\n this.elements.set(internalName, prototype);\r\n\r\n // instance methods are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n name, internalName,\r\n declaration,\r\n classPrototype\r\n );\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(\r\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n declaration.name.range\r\n );\r\n } else {\r\n prototype.set(ElementFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n } else {\r\n classPrototype.instanceMembers.set(name, prototype);\r\n }\r\n }\r\n\r\n this.checkOperators(declaration.decorators, prototype, classPrototype);\r\n }\r\n\r\n private checkOperators(\r\n decorators: Decorator[] | null,\r\n prototype: FunctionPrototype,\r\n classPrototype: ClassPrototype\r\n ) {\r\n // handle operator annotations. operators are either instance methods taking\r\n // a second argument of the instance's type or static methods taking two\r\n // arguments of the instance's type. return values vary depending on the\r\n // operation.\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n if (decorator.decoratorKind == DecoratorKind.OPERATOR) {\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n continue;\r\n }\r\n var numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n var firstArg = (decorator.arguments)[0];\r\n if (\r\n firstArg.kind == NodeKind.LITERAL &&\r\n (firstArg).literalKind == LiteralKind.STRING\r\n ) {\r\n switch ((firstArg).value) {\r\n\r\n case \"[]\":\r\n classPrototype.fnIndexedGet = prototype.simpleName;\r\n break;\r\n\r\n case \"[]=\":\r\n classPrototype.fnIndexedSet = prototype.simpleName;\r\n break;\r\n\r\n case \"+\":\r\n classPrototype.fnConcat = prototype.simpleName;\r\n break;\r\n\r\n case \"==\":\r\n classPrototype.fnEquals = prototype.simpleName;\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"1\", numArgs.toString(0)\r\n );\r\n }\r\n } else if (decorator.decoratorKind != DecoratorKind.CUSTOM) {\r\n // methods support built-in @operator only\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeAccessor(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype,\r\n isGetter: bool\r\n ): void {\r\n var propertyName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n\r\n var propertyElement = this.elements.get(internalPropertyName);\r\n if (propertyElement) {\r\n if (\r\n propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? (propertyElement).getterPrototype\r\n : (propertyElement).setterPrototype\r\n )\r\n ) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n propertyElement = new Property(\r\n this,\r\n propertyName, internalPropertyName,\r\n classPrototype\r\n );\r\n }\r\n\r\n var name = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + propertyName;\r\n\r\n // static accessors become global functions\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n var staticName = classPrototype.internalName + STATIC_DELIMITER + name;\r\n if (this.elements.has(staticName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n var staticPrototype = new FunctionPrototype(\r\n this,\r\n name, staticName,\r\n declaration,\r\n null\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = staticPrototype;\r\n } else {\r\n (propertyElement).setterPrototype = staticPrototype;\r\n }\r\n if (!classPrototype.members) {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(propertyName, propertyElement); // check above\r\n this.elements.set(internalPropertyName, propertyElement);\r\n\r\n // instance accessors are remembered until resolved\r\n } else {\r\n var instanceName = classPrototype.internalName + INSTANCE_DELIMITER + name;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instancePrototype = new FunctionPrototype(\r\n this,\r\n name, instanceName,\r\n declaration,\r\n classPrototype\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = instancePrototype;\r\n } else {\r\n (propertyElement).setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(name, propertyElement);\r\n this.elements.set(internalPropertyName, propertyElement);\r\n }\r\n }\r\n\r\n private initializeEnum(\r\n declaration: EnumDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var enm = new Enum(this, declaration.name.text, internalName, declaration);\r\n enm.namespace = namespace;\r\n this.elements.set(internalName, enm);\r\n\r\n this.checkInternalDecorators(enm, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, enm);\r\n } else if (enm.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, enm);\r\n }\r\n\r\n var values = declaration.values;\r\n for (var i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], enm);\r\n }\r\n }\r\n\r\n private initializeEnumValue(\r\n declaration: EnumValueDeclaration,\r\n enm: Enum\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n }\r\n\r\n private initializeExports(\r\n statement: ExportStatement,\r\n queuedExports: Map\r\n ): void {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n }\r\n\r\n private setExportAndCheckLibrary(\r\n name: string,\r\n element: Element,\r\n identifier: IdentifierExpression\r\n ): void {\r\n this.exports.set(name, element);\r\n if (identifier.range.source.isLibrary) { // add global alias\r\n if (this.elements.has(identifier.text)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n identifier.range, identifier.text\r\n );\r\n } else {\r\n element.internalName = identifier.text;\r\n this.elements.set(identifier.text, element);\r\n }\r\n }\r\n }\r\n\r\n private initializeExport(\r\n member: ExportMember,\r\n internalPath: string | null,\r\n queuedExports: Map\r\n ): void {\r\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n if (this.exports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n var referencedName: string;\r\n var referencedElement: Element | null;\r\n var queuedExport: QueuedExport | null;\r\n\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the element exists\r\n if (referencedElement = this.elements.get(referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.referencedName = referencedName; // -> internal name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n\r\n // export external element\r\n } else {\r\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the export exists\r\n referencedElement = this.elements.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // walk already known queued exports\r\n var seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.exports.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n referencedName = queuedExport.referencedName;\r\n if (seen.has(queuedExport)) break;\r\n seen.add(queuedExport);\r\n } else {\r\n referencedElement = this.elements.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.referencedName = referencedName; // -> export name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n }\r\n\r\n private initializeFunction(\r\n declaration: FunctionDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new FunctionPrototype(\r\n this,\r\n declaration.name.text, internalName,\r\n declaration,\r\n null\r\n );\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n }\r\n\r\n private initializeImports(\r\n statement: ImportStatement,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(\r\n declarations[i],\r\n statement.internalPath,\r\n queuedExports, queuedImports\r\n );\r\n }\r\n } else if (statement.namespaceName) {\r\n var internalName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n statement.namespaceName.text\r\n );\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n statement.namespaceName.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n this.error( // TODO\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n }\r\n }\r\n\r\n private initializeImport(\r\n declaration: ImportDeclaration,\r\n internalPath: string,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var referencedName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n // resolve right away if the exact export exists\r\n var element: Element | null;\r\n if (element = this.exports.get(referencedName)) {\r\n this.elements.set(internalName, element);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n var indexPart = PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.internalName = internalName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (\r\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text\r\n );\r\n } else {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (\r\n internalPath +\r\n indexPart +\r\n PATH_DELIMITER +\r\n declaration.externalName.text\r\n );\r\n }\r\n queuedImport.declaration = declaration;\r\n queuedImports.push(queuedImport);\r\n }\r\n\r\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new InterfacePrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n\r\n case NodeKind.METHODDECLARATION:\r\n var isGetter = hasModifier(ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter || hasModifier(ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n }\r\n\r\n private initializeNamespace(\r\n declaration: NamespaceDeclaration,\r\n queuedExtendingClasses: ClassPrototype[],\r\n parentNamespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n\r\n var namespace = this.elements.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, declaration.name.text, internalName, declaration);\r\n namespace.namespace = parentNamespace;\r\n this.elements.set(internalName, namespace);\r\n this.checkInternalDecorators(namespace, declaration);\r\n }\r\n\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(declaration.name.text, namespace);\r\n } else if (namespace.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, namespace);\r\n }\r\n\r\n var members = declaration.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n this.initializeClass(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n members[i].range\r\n );\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n\r\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.types.has(name) || this.typeAliases.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n this.typeAliases.set(name, declaration.alias);\r\n }\r\n\r\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n var declarations = statement.declarations;\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n\r\n var global = new Global(\r\n this,\r\n declaration.name.text,\r\n internalName,\r\n declaration,\r\n Type.void // resolved later on\r\n );\r\n global.namespace = namespace;\r\n this.elements.set(internalName, global);\r\n\r\n this.checkInternalDecorators(global, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, global);\r\n } else if (global.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n } else {\r\n this.exports.set(internalName, global);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Resolves a {@link TypeNode} to a concrete {@link Type}. */\r\n resolveType(\r\n node: TypeNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportNotFound: bool = true\r\n ): Type | null {\r\n var globalName = node.name.text;\r\n var localName = node.range.source.internalPath + PATH_DELIMITER + node.name.text;\r\n\r\n var element: Element | null;\r\n\r\n // check file-global / program-global element\r\n if ((element = this.elements.get(localName)) || (element = this.elements.get(globalName))) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n var instance = (element).resolveInclTypeArguments(\r\n node.typeArguments,\r\n contextualTypeArguments,\r\n null\r\n ); // reports\r\n return instance ? instance.type : null;\r\n }\r\n }\r\n\r\n // resolve parameters\r\n var k = node.typeArguments.length;\r\n var paramTypes = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var paramType = this.resolveType( // reports\r\n node.typeArguments[i],\r\n contextualTypeArguments,\r\n reportNotFound\r\n );\r\n if (!paramType) return null;\r\n paramTypes[i] = paramType;\r\n }\r\n\r\n if (k) { // can't be a placeholder if it has parameters\r\n var instanceKey = typesToString(paramTypes);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n } else if (contextualTypeArguments) {\r\n var placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType) return placeholderType;\r\n }\r\n\r\n var type: Type | null;\r\n\r\n // check file-global / program-global type\r\n if ((type = this.types.get(localName)) || (type = this.types.get(globalName))) {\r\n return type;\r\n }\r\n\r\n // check type alias\r\n var alias = this.typeAliases.get(globalName);\r\n if (alias && (type = this.resolveType(alias, null, reportNotFound))) {\r\n return type;\r\n }\r\n\r\n if (reportNotFound) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n node.name.range, globalName\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves an array of type parameters to concrete types. */\r\n resolveTypeArguments(\r\n typeParameters: TypeParameter[],\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): Type[] | null {\r\n var parameterCount = typeParameters.length;\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (parameterCount != argumentCount) {\r\n if (argumentCount) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n Range.join(\r\n (typeArgumentNodes)[0].range,\r\n (typeArgumentNodes)[argumentCount - 1].range\r\n ),\r\n parameterCount.toString(10), argumentCount.toString(10)\r\n );\r\n } else if (alternativeReportNode) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\"\r\n );\r\n }\r\n return null;\r\n }\r\n var typeArguments = new Array(parameterCount);\r\n for (var i = 0; i < parameterCount; ++i) {\r\n var type = this.resolveType( // reports\r\n (typeArgumentNodes)[i],\r\n contextualTypeArguments,\r\n true\r\n );\r\n if (!type) return null;\r\n // TODO: check extendsType\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n }\r\n\r\n /** Resolves an identifier to the element it refers to. */\r\n resolveIdentifier(\r\n identifier: IdentifierExpression,\r\n contextualFunction: Function | null,\r\n contextualEnum: Enum | null = null\r\n ): ResolvedElement | null {\r\n var name = identifier.text;\r\n\r\n var element: Element | null;\r\n var namespace: Element | null;\r\n\r\n // check siblings\r\n if (contextualEnum) {\r\n\r\n if (\r\n contextualEnum.members &&\r\n (element = contextualEnum.members.get(name)) &&\r\n element.kind == ElementKind.ENUMVALUE\r\n ) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n } else if (contextualFunction) {\r\n\r\n // check locals\r\n if (element = contextualFunction.flow.getScopedLocal(name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n // search contextual parent namespaces if applicable\r\n if (namespace = contextualFunction.prototype.namespace) {\r\n do {\r\n if (element = this.elements.get(namespace.internalName + STATIC_DELIMITER + name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n } while (namespace = namespace.namespace);\r\n }\r\n }\r\n\r\n // search current file\r\n if (element = this.elements.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n // search global scope\r\n if (element = this.elements.get(name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n identifier.range, name\r\n );\r\n return null;\r\n }\r\n\r\n /** Resolves a property access to the element it refers to. */\r\n resolvePropertyAccess(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualFunction: Function\r\n ): ResolvedElement | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n if (!resolvedElement) return null;\r\n var target = resolvedElement.element;\r\n\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n var targetType: Type;\r\n var member: Element | null;\r\n\r\n // Resolve variable-likes to their class type first\r\n switch (target.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n if (!(targetType = (target).type).classType) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, targetType.toString()\r\n );\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n\r\n case ElementKind.PROPERTY:\r\n var getter = assert((target).getterPrototype).resolve(); // reports\r\n if (!getter) return null;\r\n if (!(targetType = getter.returnType).classType) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, targetType.toString()\r\n );\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n }\r\n\r\n // Look up the member within\r\n switch (target.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS:\r\n do {\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n // check inherited static members on the base prototype while target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if ((target).basePrototype) {\r\n target = (target).basePrototype;\r\n } else {\r\n break;\r\n }\r\n // or inherited instance members on the cbase class while target is a class instance\r\n } else if (target.kind == ElementKind.CLASS) {\r\n if ((target).base) {\r\n target = (target).base;\r\n } else {\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n\r\n default: // enums or other namespace-like elements\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveElementAccess(elementAccess: ElementAccessExpression, contextualFunction: Function): ResolvedElement | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = elementAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction);\r\n if (!resolvedElement) return null;\r\n var target = resolvedElement.element;\r\n switch (target.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n var type = (target).type;\r\n if (type.classType) {\r\n var indexedGetName = (target = type.classType).prototype.fnIndexedGet;\r\n var indexedGet: Element | null;\r\n if (\r\n indexedGetName != null &&\r\n target.members &&\r\n (indexedGet = target.members.get(indexedGetName)) &&\r\n indexedGet.kind == ElementKind.FUNCTION_PROTOTYPE\r\n ) {\r\n return resolvedElement.set(indexedGet).withTarget(type.classType, targetExpression);\r\n }\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n targetExpression.range, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveExpression(expression: Expression, contextualFunction: Function): ResolvedElement | null {\r\n var classType: Class | null;\r\n\r\n while (expression.kind == NodeKind.PARENTHESIZED) {\r\n expression = (expression).expression;\r\n }\r\n\r\n switch (expression.kind) {\r\n\r\n case NodeKind.ASSERTION:\r\n var type = this.resolveType((expression).toType); // reports\r\n if (type && (classType = type.classType)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n return null;\r\n\r\n case NodeKind.BINARY:\r\n // TODO: string concatenation, mostly\r\n throw new Error(\"not implemented\");\r\n\r\n case NodeKind.THIS: // -> Class\r\n if (classType = contextualFunction.instanceMethodOf) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n return null;\r\n\r\n case NodeKind.SUPER: // -> Class\r\n if ((classType = contextualFunction.instanceMethodOf) && (classType = classType.base)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n return null;\r\n\r\n case NodeKind.IDENTIFIER:\r\n return this.resolveIdentifier(expression, contextualFunction);\r\n\r\n case NodeKind.PROPERTYACCESS:\r\n return this.resolvePropertyAccess(expression, contextualFunction);\r\n\r\n case NodeKind.ELEMENTACCESS:\r\n return this.resolveElementAccess(expression, contextualFunction);\r\n\r\n case NodeKind.CALL:\r\n var resolved = this.resolveExpression((expression).expression, contextualFunction);\r\n if (resolved) {\r\n var element = resolved.element;\r\n if (element && element.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = (element).resolveInclTypeArguments(\r\n (expression).typeArguments,\r\n null,\r\n expression\r\n );\r\n if (instance && instance.returnType.classType) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(instance.returnType.classType);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return null;\r\n }\r\n}\r\n\r\n/** Common result structure returned when calling any of the resolve functions on a {@link Program}. */\r\nexport class ResolvedElement {\r\n\r\n /** The target element, if a property or element access */\r\n target: Element | null;\r\n /** The target element's expression, if a property or element access. */\r\n targetExpression: Expression | null;\r\n /** The element being accessed. */\r\n element: Element;\r\n\r\n /** Clears the target and sets the resolved element. */\r\n set(element: Element): this {\r\n this.target = null;\r\n this.targetExpression = null;\r\n this.element = element;\r\n return this;\r\n }\r\n\r\n /** Sets the resolved target in addition to the previously set element. */\r\n withTarget(target: Element, targetExpression: Expression): this {\r\n this.target = target;\r\n this.targetExpression = targetExpression;\r\n return this;\r\n }\r\n}\r\n\r\n// Cached result structure instance\r\nvar resolvedElement: ResolvedElement | null;\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n /** A {@link Global}. */\r\n GLOBAL,\r\n /** A {@link Local}. */\r\n LOCAL,\r\n /** An {@link Enum}. */\r\n ENUM,\r\n /** An {@link EnumValue}. */\r\n ENUMVALUE,\r\n /** A {@link FunctionPrototype}. */\r\n FUNCTION_PROTOTYPE,\r\n /** A {@link Function}. */\r\n FUNCTION,\r\n /** A {@link ClassPrototype}. */\r\n CLASS_PROTOTYPE,\r\n /** A {@link Class}. */\r\n CLASS,\r\n /** An {@link InterfacePrototype}. */\r\n INTERFACE_PROTOTYPE,\r\n /** An {@link Interface}. */\r\n INTERFACE,\r\n /** A {@link FieldPrototype}. */\r\n FIELD_PROTOTYPE,\r\n /** A {@link Field}. */\r\n FIELD,\r\n /** A {@link Property}. */\r\n PROPERTY,\r\n /** A {@link Namespace}. */\r\n NAMESPACE\r\n}\r\n\r\n/** Indicates traits of an {@link Element}. */\r\nexport enum ElementFlags {\r\n /** No flags set. */\r\n NONE = 0,\r\n /** Is compiled. */\r\n COMPILED = 1 << 0,\r\n /** Is an import. */\r\n IMPORTED = 1 << 1,\r\n /** Is an export. */\r\n EXPORTED = 1 << 2,\r\n /** Is built-in. */\r\n BUILTIN = 1 << 3,\r\n /** Is declared. */\r\n DECLARED = 1 << 4,\r\n /** Is generic. */\r\n GENERIC = 1 << 5,\r\n /** Is constant. */\r\n CONSTANT = 1 << 6,\r\n /** Has a constant value and is therefore inlined. */\r\n INLINED = 1 << 7,\r\n /** Is instance member. */\r\n INSTANCE = 1 << 8,\r\n /** Is getter. */\r\n GETTER = 1 << 9,\r\n /** Is setter. */\r\n SETTER = 1 << 10,\r\n /** Is global. */\r\n GLOBAL = 1 << 11,\r\n /** Is read-only. */\r\n READONLY = 1 << 12,\r\n /** Is a public member. */\r\n PUBLIC = 1 << 13,\r\n /** Is a protected member. */\r\n PROTECTED = 1 << 14,\r\n /** Is a private member. */\r\n PRIVATE = 1 << 15,\r\n /** Is an abstract member. */\r\n ABSTRACT = 1 << 16,\r\n /** Is a constructor. */\r\n CONSTRUCTOR = 1 << 17,\r\n /** Is an unmanaged class with limited capabilites. */\r\n UNMANAGED = 1 << 18,\r\n /** Is scoped. */\r\n SCOPED = 1 << 19,\r\n /** Is the start function. */\r\n START = 1 << 20\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n /** Specific element kind. */\r\n kind: ElementKind;\r\n /** Containing {@link Program}. */\r\n program: Program;\r\n /** Simple name. */\r\n simpleName: string;\r\n /** Internal name referring to this element. */\r\n internalName: string;\r\n /** Element flags. */\r\n flags: ElementFlags = ElementFlags.NONE;\r\n /** Namespaced member elements. */\r\n members: Map | null = null;\r\n /** Parent namespace, if applicable. */\r\n namespace: Element | null = null;\r\n\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n protected constructor(program: Program, simpleName: string, internalName: string) {\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n\r\n /** Tests if this element has a specific flag or flags. */\r\n is(flag: ElementFlags): bool { return (this.flags & flag) == flag; }\r\n\r\n /** Sets a specific flag or flags. */\r\n set(flag: ElementFlags): void { this.flags |= flag; }\r\n}\r\n\r\n/** A namespace. */\r\nexport class Namespace extends Element {\r\n\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n kind = ElementKind.NAMESPACE;\r\n\r\n /** Declaration reference. */\r\n declaration: NamespaceDeclaration; // more specific\r\n\r\n /** Constructs a new namespace. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: NamespaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n kind = ElementKind.ENUM;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumDeclaration;\r\n\r\n /** Constructs a new enum. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n case ModifierKind.CONST: this.set(ElementFlags.CONSTANT); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n kind = ElementKind.ENUMVALUE;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumValueDeclaration;\r\n /** Parent enum. */\r\n enum: Enum;\r\n /** Constant value, if applicable. */\r\n constantValue: i32 = 0;\r\n\r\n constructor(\r\n enm: Enum,\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumValueDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.enum = enm;\r\n this.declaration = declaration;\r\n }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n NONE,\r\n INTEGER,\r\n FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n // kind varies\r\n\r\n /** Declaration reference. */\r\n declaration: VariableLikeDeclarationStatement;\r\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n type: Type;\r\n /** Constant value kind. */\r\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n /** Constant integer value, if applicable. */\r\n constantIntegerValue: I64;\r\n /** Constant float value, if applicable. */\r\n constantFloatValue: f64;\r\n\r\n withConstantIntegerValue(lo: i32, hi: i32): this {\r\n this.constantValueKind = ConstantValueKind.INTEGER;\r\n this.constantIntegerValue = i64_new(lo, hi);\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n }\r\n\r\n withConstantFloatValue(value: f64): this {\r\n this.constantValueKind = ConstantValueKind.FLOAT;\r\n this.constantFloatValue = value;\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n kind = ElementKind.GLOBAL;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: VariableLikeDeclarationStatement,\r\n type: Type\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.IMPORT:\r\n this.set(ElementFlags.IMPORTED);\r\n break;\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.CONST:\r\n this.set(ElementFlags.CONSTANT);\r\n break;\r\n\r\n case ModifierKind.LET:\r\n this.set(ElementFlags.SCOPED);\r\n break;\r\n\r\n case ModifierKind.DECLARE:\r\n this.set(ElementFlags.DECLARED);\r\n break;\r\n\r\n case ModifierKind.READONLY:\r\n this.set(this.declaration.initializer\r\n ? ElementFlags.CONSTANT | ElementFlags.READONLY\r\n : ElementFlags.READONLY\r\n );\r\n break;\r\n\r\n case ModifierKind.PUBLIC:\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.STATIC:\r\n break; // static fields become globals\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n this.type = type; // resolved later if `void`\r\n }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n // not an Element on its own\r\n\r\n /** Parameter name. */\r\n name: string;\r\n /** Parameter type. */\r\n type: Type;\r\n /** Parameter initializer. */\r\n initializer: Expression | null;\r\n\r\n /** Constructs a new function parameter. */\r\n constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n kind = ElementKind.LOCAL;\r\n\r\n /** Local index. */\r\n index: i32;\r\n\r\n constructor(program: Program, simpleName: string, index: i32, type: Type) {\r\n super(program, simpleName, simpleName);\r\n this.index = index;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FunctionDeclaration;\r\n /** If an instance method, the class prototype reference. */\r\n classPrototype: ClassPrototype | null;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. */\r\n classTypeArguments: Type[] | null = null;\r\n\r\n /** Constructs a new function prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FunctionDeclaration,\r\n classPrototype: ClassPrototype | null = null\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.IMPORT:\r\n this.set(ElementFlags.IMPORTED);\r\n break;\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.DECLARE:\r\n this.set(ElementFlags.DECLARED);\r\n break;\r\n\r\n case ModifierKind.GET:\r\n this.set(ElementFlags.GETTER);\r\n break;\r\n\r\n case ModifierKind.SET:\r\n this.set(ElementFlags.SETTER);\r\n break;\r\n\r\n case ModifierKind.STATIC:\r\n case ModifierKind.ABSTRACT:\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.PUBLIC:\r\n break; // already handled\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (this.declaration.typeParameters.length) {\r\n this.set(ElementFlags.GENERIC);\r\n }\r\n if (this.classPrototype = classPrototype) {\r\n this.set(ElementFlags.INSTANCE);\r\n }\r\n }\r\n\r\n resolve(\r\n functionTypeArguments: Type[] | null = null,\r\n contextualTypeArguments: Map | null = null\r\n ): Function | null {\r\n var instanceKey = functionTypeArguments ? typesToString(functionTypeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n var declaration = this.declaration;\r\n\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n for (var [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n\r\n var i: i32, k: i32;\r\n\r\n // inherit class type arguments if a partially resolved instance method (classTypeArguments is set)\r\n if (this.classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n var classDeclaration = (this.classPrototype).declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n if ((k = this.classTypeArguments.length) != classTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(classTypeParameters[i].name.text, this.classTypeArguments[i]);\r\n }\r\n }\r\n\r\n // override call specific contextual type arguments\r\n var functionTypeParameters = declaration.typeParameters;\r\n if (functionTypeArguments && (k = functionTypeArguments.length)) {\r\n if (k != functionTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(functionTypeParameters[i].name.text, functionTypeArguments[i]);\r\n }\r\n }\r\n\r\n // resolve parameters\r\n // TODO: 'this' type\r\n k = declaration.parameters.length;\r\n var parameters = new Array(k);\r\n var parameterTypes = new Array(k);\r\n var typeNode: TypeNode | null;\r\n for (i = 0; i < k; ++i) {\r\n var parameterDeclaration = declaration.parameters[i];\r\n typeNode = assert(parameterDeclaration.type);\r\n var parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (parameterType) {\r\n parameters[i] = new Parameter(parameterDeclaration.name.text, parameterType, parameterDeclaration.initializer);\r\n parameterTypes[i] = parameterType;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n var classInstance: Class | null = null;\r\n if (this.classPrototype) {\r\n classInstance = this.classPrototype.resolve(this.classTypeArguments, contextualTypeArguments); // reports\r\n if (!classInstance) return null;\r\n }\r\n\r\n // resolve return type\r\n // TODO: 'this' type\r\n var returnType: Type;\r\n if (this.is(ElementFlags.SETTER) || this.is(ElementFlags.CONSTRUCTOR)) {\r\n returnType = Type.void; // not annotated\r\n } else {\r\n typeNode = assert(declaration.returnType);\r\n var type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (type) {\r\n returnType = type;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n instance = new Function(this, internalName, functionTypeArguments, parameters, returnType, classInstance);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n return instance;\r\n }\r\n\r\n resolveInclTypeArguments(\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(\r\n this.declaration.typeParameters,\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n }\r\n\r\n resolvePartial(classTypeArguments: Type[] | null): FunctionPrototype | null {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n if (classTypeArguments && classTypeArguments.length) {\r\n var partialPrototype = new FunctionPrototype(\r\n this.program,\r\n this.simpleName,\r\n this.internalName,\r\n this.declaration,\r\n this.classPrototype\r\n );\r\n partialPrototype.flags = this.flags;\r\n partialPrototype.classTypeArguments = classTypeArguments;\r\n return partialPrototype;\r\n }\r\n return this; // no need to clone\r\n }\r\n\r\n toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n kind = ElementKind.FUNCTION;\r\n\r\n /** Prototype reference. */\r\n prototype: FunctionPrototype;\r\n /** Concrete type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Concrete function parameters. Excluding `this` if an instance method. */\r\n parameters: Parameter[] | null;\r\n /** Concrete return type. */\r\n returnType: Type;\r\n /** If an instance method, the concrete class it is a member of. */\r\n instanceMethodOf: Class | null;\r\n /** Map of locals by name. */\r\n locals: Map = new Map();\r\n /** List of additional non-parameter locals. */\r\n additionalLocals: Type[] = [];\r\n /** Current break context label. */\r\n breakContext: string | null = null;\r\n /** Contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Current control flow. */\r\n flow: Flow;\r\n /** Remembered debug locations. */\r\n debugLocations: Range[] | null = null;\r\n\r\n private nextBreakId: i32 = 0;\r\n private breakStack: i32[] | null = null;\r\n\r\n /** Constructs a new concrete function. */\r\n constructor(\r\n prototype: FunctionPrototype,\r\n internalName: string,\r\n typeArguments: Type[] | null,\r\n parameters: Parameter[] | null,\r\n returnType: Type,\r\n instanceMethodOf: Class | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.typeArguments = typeArguments;\r\n this.parameters = parameters || [];\r\n this.returnType = returnType;\r\n this.instanceMethodOf = instanceMethodOf;\r\n this.flags = prototype.flags;\r\n if (!(prototype.is(ElementFlags.BUILTIN) || prototype.is(ElementFlags.DECLARED))) {\r\n var localIndex = 0;\r\n if (instanceMethodOf) {\r\n assert(this.is(ElementFlags.INSTANCE)); // internal error\r\n this.locals.set(\"this\", new Local(prototype.program, \"this\", localIndex++, instanceMethodOf.type));\r\n if (instanceMethodOf.contextualTypeArguments) {\r\n if (!this.contextualTypeArguments) {\r\n this.contextualTypeArguments = new Map();\r\n }\r\n for (var [inheritedName, inheritedType] of instanceMethodOf.contextualTypeArguments) {\r\n this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n } else {\r\n assert(!this.is(ElementFlags.INSTANCE)); // internal error\r\n }\r\n for (var i = 0, k = this.parameters.length; i < k; ++i) {\r\n var parameter = this.parameters[i];\r\n var parameterName = assert(parameter.name, \"parameter must be named\"); // not a builtin or declared\r\n this.locals.set(\r\n parameterName,\r\n new Local(\r\n prototype.program,\r\n parameterName,\r\n localIndex++,\r\n parameter.type\r\n )\r\n );\r\n }\r\n }\r\n this.flow = Flow.create(this);\r\n }\r\n\r\n /** Adds a local of the specified type, with an optional name. */\r\n addLocal(type: Type, name: string | null = null): Local {\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = (this.parameters ? this.parameters.length : 0) + this.additionalLocals.length;\r\n if (this.is(ElementFlags.INSTANCE)) localIndex++; // plus 'this'\r\n var local = new Local(\r\n this.prototype.program,\r\n name\r\n ? name\r\n : \"var$\" + localIndex.toString(10),\r\n localIndex,\r\n type\r\n );\r\n if (name) {\r\n if (this.locals.has(name)) throw new Error(\"duplicate local name\");\r\n this.locals.set(name, local);\r\n }\r\n this.additionalLocals.push(type);\r\n return local;\r\n }\r\n\r\n private tempI32s: Local[] | null = null;\r\n private tempI64s: Local[] | null = null;\r\n private tempF32s: Local[] | null = null;\r\n private tempF64s: Local[] | null = null;\r\n\r\n /** Gets a free temporary local of the specified type. */\r\n getTempLocal(type: Type): Local {\r\n var temps: Local[] | null;\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s; break;\r\n case NativeType.I64: temps = this.tempI64s; break;\r\n case NativeType.F32: temps = this.tempF32s; break;\r\n case NativeType.F64: temps = this.tempF64s; break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps && temps.length) {\r\n var ret = temps.pop();\r\n ret.type = type;\r\n return ret;\r\n }\r\n return this.addLocal(type);\r\n }\r\n\r\n /** Frees the temporary local for reuse. */\r\n freeTempLocal(local: Local): void {\r\n var temps: Local[];\r\n assert(local.type != null); // internal error\r\n switch ((local.type).toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s || (this.tempI32s = []); break;\r\n case NativeType.I64: temps = this.tempI64s || (this.tempI64s = []); break;\r\n case NativeType.F32: temps = this.tempF32s || (this.tempF32s = []); break;\r\n case NativeType.F64: temps = this.tempF64s || (this.tempF64s = []); break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n temps.push(local);\r\n }\r\n\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n getAndFreeTempLocal(type: Type): Local {\r\n var temps: Local[];\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s || (this.tempI32s = []); break;\r\n case NativeType.I64: temps = this.tempI64s || (this.tempI64s = []); break;\r\n case NativeType.F32: temps = this.tempF32s || (this.tempF32s = []); break;\r\n case NativeType.F64: temps = this.tempF64s || (this.tempF64s = []); break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps.length > 0) {\r\n return temps[temps.length - 1];\r\n }\r\n var local: Local = this.addLocal(type);\r\n temps.push(local);\r\n return local;\r\n }\r\n\r\n /** Enters a(nother) break context. */\r\n enterBreakContext(): string {\r\n var id = this.nextBreakId++;\r\n if (!this.breakStack) {\r\n this.breakStack = [ id ];\r\n } else {\r\n this.breakStack.push(id);\r\n }\r\n return this.breakContext = id.toString(10);\r\n }\r\n\r\n /** Leaves the current break context. */\r\n leaveBreakContext(): void {\r\n assert(this.breakStack != null);\r\n var length = (this.breakStack).length;\r\n assert(length > 0);\r\n (this.breakStack).pop();\r\n if (length > 1) {\r\n this.breakContext = (this.breakStack)[length - 2].toString(10);\r\n } else {\r\n this.breakContext = null;\r\n this.breakStack = null;\r\n }\r\n }\r\n\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n finalize(module: Module, ref: FunctionRef): void {\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakContext = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n var debugLocations = this.debugLocations;\r\n if (debugLocations) {\r\n for (var i = 0, k = debugLocations.length; i < k; ++i) {\r\n var debugLocation = debugLocations[i];\r\n module.setDebugLocation(\r\n ref,\r\n debugLocation.debugInfoRef,\r\n debugLocation.source.debugInfoIndex,\r\n debugLocation.line,\r\n debugLocation.column\r\n );\r\n }\r\n }\r\n }\r\n this.debugLocations = null;\r\n }\r\n\r\n /** Returns the TypeScript representation of this function. */\r\n toString(): string { return this.prototype.simpleName; }\r\n\r\n /** Returns the function type TypeScript representation of this function.*/\r\n toTypeString(): string { throw new Error(\"not implemented\"); }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FieldDeclaration;\r\n /** Parent class prototype. */\r\n classPrototype: ClassPrototype;\r\n\r\n /** Constructs a new field prototype. */\r\n constructor(\r\n classPrototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FieldDeclaration\r\n ) {\r\n super(classPrototype.program, simpleName, internalName);\r\n this.classPrototype = classPrototype;\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.READONLY:\r\n this.set(ElementFlags.READONLY);\r\n break;\r\n\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.PUBLIC:\r\n case ModifierKind.STATIC:\r\n break; // already handled\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Whether the field is read-only or not. */\r\n get isReadonly(): bool {\r\n return (this.flags & ElementFlags.READONLY) != 0;\r\n }\r\n set isReadonly(is: bool) {\r\n if (is) {\r\n this.flags |= ElementFlags.READONLY;\r\n } else {\r\n this.flags &= ~ElementFlags.READONLY;\r\n }\r\n }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n kind = ElementKind.FIELD;\r\n\r\n /** Field prototype reference. */\r\n prototype: FieldPrototype;\r\n /** Field memory offset, if an instance field. */\r\n memoryOffset: i32 = -1;\r\n\r\n /** Constructs a new field. */\r\n constructor(prototype: FieldPrototype, internalName: string, type: Type) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n kind = ElementKind.PROPERTY;\r\n\r\n /** Parent class prototype. */\r\n parent: ClassPrototype;\r\n /** Getter prototype. */\r\n getterPrototype: FunctionPrototype | null = null;\r\n /** Setter prototype. */\r\n setterPrototype: FunctionPrototype | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n parent: ClassPrototype\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: ClassDeclaration;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Instance member prototypes. */\r\n instanceMembers: Map | null = null;\r\n /** Base class prototype, if applicable. */\r\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n constructorPrototype: FunctionPrototype | null = null;\r\n\r\n /** Overloaded indexed get method, if any. */\r\n fnIndexedGet: string | null = null;\r\n /** Overloaded indexed set method, if any. */\r\n fnIndexedSet: string | null = null;\r\n /** Overloaded concatenation method, if any. */\r\n fnConcat: string | null = null;\r\n /** Overloaded equality comparison method, if any. */\r\n fnEquals: string | null = null;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: ClassDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (this.declaration.typeParameters.length) {\r\n this.set(ElementFlags.GENERIC);\r\n }\r\n }\r\n\r\n /** Whether an unamanaged class or not. */\r\n get isUnmanaged(): bool {\r\n return (this.flags & ElementFlags.UNMANAGED) != 0;\r\n }\r\n set isUnmanaged(is: bool) {\r\n if (is) {\r\n this.flags |= ElementFlags.UNMANAGED;\r\n } else {\r\n this.flags &= ~ElementFlags.UNMANAGED;\r\n }\r\n }\r\n\r\n resolve(typeArguments: Type[] | null, contextualTypeArguments: Map | null = null): Class | null {\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n for (var [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n\r\n var declaration = this.declaration;\r\n var baseClass: Class | null = null;\r\n if (declaration.extendsType) {\r\n var baseClassType = this.program.resolveType(declaration.extendsType, null); // reports\r\n if (!baseClassType) return null;\r\n if (!(baseClass = baseClassType.classType)) {\r\n this.program.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n declaration.extendsType.range\r\n );\r\n return null;\r\n }\r\n if (baseClass.prototype.isUnmanaged != this.isUnmanaged) {\r\n this.program.error(\r\n DiagnosticCode.Structs_cannot_extend_classes_and_vice_versa,\r\n Range.join(declaration.name.range, declaration.extendsType.range)\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n // override call specific contextual type arguments if provided\r\n var i: i32, k: i32;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n } else if (declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(this, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n\r\n var memoryOffset: u32 = 0;\r\n if (baseClass) {\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n if (baseClass.members) {\r\n if (!instance.members) instance.members = new Map();\r\n for (var inheritedMember of baseClass.members.values()) {\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n }\r\n\r\n if (this.constructorPrototype) {\r\n var partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports\r\n if (partialConstructor) {\r\n instance.constructorInstance = partialConstructor.resolve(); // reports\r\n }\r\n // TODO: ^ doesn't know the return type, hence returns null\r\n }\r\n\r\n if (this.instanceMembers) {\r\n for (var member of this.instanceMembers.values()) {\r\n switch (member.kind) {\r\n\r\n case ElementKind.FIELD_PROTOTYPE: // fields are layed out in advance\r\n if (!instance.members) instance.members = new Map();\r\n var fieldDeclaration = (member).declaration;\r\n if (!fieldDeclaration.type) {\r\n throw new Error(\"type expected\"); // TODO: check if parent class defines a type\r\n }\r\n var fieldType = this.program.resolveType( // reports\r\n fieldDeclaration.type,\r\n instance.contextualTypeArguments\r\n );\r\n if (fieldType) {\r\n var fieldInstance = new Field(member, (member).internalName, fieldType);\r\n switch (fieldType.byteSize) { // align\r\n case 1: break;\r\n case 2: if (memoryOffset & 1) ++memoryOffset; break;\r\n case 4: if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break;\r\n case 8: if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break;\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n }\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE: // instance methods remain partially resolved prototypes until compiled\r\n if (!instance.members) instance.members = new Map();\r\n var methodPrototype = (member).resolvePartial(typeArguments); // reports\r\n if (methodPrototype) {\r\n instance.members.set(member.simpleName, methodPrototype);\r\n }\r\n break;\r\n\r\n case ElementKind.PROPERTY: // instance properties are cloned with partially resolved getters and setters\r\n if (!instance.members) instance.members = new Map();\r\n assert((member).getterPrototype);\r\n var instanceProperty = new Property(this.program, member.simpleName, member.internalName, this);\r\n instanceProperty.getterPrototype = (\r\n ((member).getterPrototype).resolvePartial(\r\n typeArguments\r\n )\r\n );\r\n if ((member).setterPrototype) {\r\n instanceProperty.setterPrototype = (\r\n ((member).setterPrototype).resolvePartial(\r\n typeArguments\r\n )\r\n );\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n\r\n default:\r\n throw new Error(\"instance member expected\");\r\n }\r\n }\r\n }\r\n instance.currentMemoryOffset = memoryOffset; // sizeof() is its byte size in memory\r\n return instance;\r\n }\r\n\r\n resolveInclTypeArguments(\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null,\r\n alternativeReportNode: Node | null\r\n ): Class | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(\r\n this.declaration.typeParameters,\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n } else {\r\n assert(typeArgumentNodes == null || !typeArgumentNodes.length);\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n kind = ElementKind.CLASS;\r\n\r\n /** Prototype reference. */\r\n prototype: ClassPrototype;\r\n /** Resolved type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Resolved class type. */\r\n type: Type;\r\n /** Base class, if applicable. */\r\n base: Class | null;\r\n /** Contextual type arguments for fields and methods. */\r\n contextualTypeArguments: Map | null = null;\r\n /** Current member memory offset. */\r\n currentMemoryOffset: u32 = 0;\r\n /** Constructor instance. */\r\n constructorInstance: Function | null = null;\r\n\r\n /** Constructs a new class. */\r\n constructor(\r\n prototype: ClassPrototype,\r\n internalName: string,\r\n typeArguments: Type[] | null = null,\r\n base: Class | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.typeArguments = typeArguments;\r\n this.type = prototype.program.options.usizeType.asClass(this);\r\n this.base = base;\r\n\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n if (base.contextualTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (var [baseName, baseType] of base.contextualTypeArguments) {\r\n this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n }\r\n\r\n // apply instance-specific contextual type arguments\r\n var declaration = this.prototype.declaration;\r\n var i: i32, k: i32;\r\n if (declaration) { // irrelevant for built-ins\r\n var typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n } else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n }\r\n\r\n toString(): string {\r\n return this.prototype.simpleName;\r\n }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: InterfaceDeclaration; // more specific\r\n\r\n /** Constructs a new interface prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: InterfaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName, declaration);\r\n }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n kind = ElementKind.INTERFACE;\r\n\r\n /** Prototype reference. */\r\n prototype: InterfacePrototype; // more specific\r\n /** Base interface, if applcable. */\r\n base: Interface | null; // more specific\r\n\r\n /** Constructs a new interface. */\r\n constructor(\r\n prototype: InterfacePrototype,\r\n internalName: string,\r\n typeArguments: Type[] = [],\r\n base: Interface | null = null\r\n ) {\r\n super(prototype, internalName, typeArguments, base);\r\n }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n /** No specific conditions. */\r\n NONE = 0,\r\n /** This branch always returns. */\r\n RETURNS = 1 << 0,\r\n /** This branch possibly throws. */\r\n POSSIBLY_THROWS = 1 << 1,\r\n /** This branch possible breaks. */\r\n POSSIBLY_BREAKS = 1 << 2,\r\n /** This branch possible continues. */\r\n POSSIBLY_CONTINUES = 1 << 3\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n /** Parent flow. */\r\n parent: Flow | null;\r\n /** Flow flags indicating specific conditions. */\r\n flags: FlowFlags;\r\n /** Function this flow belongs to. */\r\n currentFunction: Function;\r\n /** The label we break to when encountering a continue statement. */\r\n continueLabel: string | null;\r\n /** The label we break to when encountering a break statement. */\r\n breakLabel: string | null;\r\n /** Scoped local variables. */\r\n scopedLocals: Map | null = null;\r\n\r\n /** Creates the parent flow of the specified function. */\r\n static create(currentFunction: Function): Flow {\r\n var parentFlow = new Flow();\r\n parentFlow.parent = null;\r\n parentFlow.flags = FlowFlags.NONE;\r\n parentFlow.currentFunction = currentFunction;\r\n parentFlow.continueLabel = null;\r\n parentFlow.breakLabel = null;\r\n return parentFlow;\r\n }\r\n\r\n private constructor() { }\r\n\r\n /** Tests if this flow has the specified flag or flags. */\r\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n\r\n /** Sets the specified flag or flags. */\r\n set(flag: FlowFlags): void { this.flags |= flag; }\r\n\r\n /** Enters a new branch or scope and returns the new flow. */\r\n enterBranchOrScope(): Flow {\r\n var branchFlow = new Flow();\r\n branchFlow.parent = this;\r\n branchFlow.flags = this.flags;\r\n branchFlow.currentFunction = this.currentFunction;\r\n branchFlow.continueLabel = this.continueLabel;\r\n branchFlow.breakLabel = this.breakLabel;\r\n return branchFlow;\r\n }\r\n\r\n /** Leaves the current branch or scope and returns the parent flow. */\r\n leaveBranchOrScope(): Flow {\r\n var parent = assert(this.parent);\r\n\r\n // Free block-scoped locals\r\n if (this.scopedLocals) {\r\n for (var scopedLocal of this.scopedLocals.values()) {\r\n this.currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n this.scopedLocals = null;\r\n }\r\n\r\n // Propagate flags to parent\r\n if (this.is(FlowFlags.POSSIBLY_THROWS)) {\r\n parent.set(FlowFlags.POSSIBLY_THROWS);\r\n }\r\n if (this.is(FlowFlags.POSSIBLY_BREAKS) && parent.breakLabel == this.breakLabel) {\r\n parent.set(FlowFlags.POSSIBLY_BREAKS);\r\n }\r\n if (this.is(FlowFlags.POSSIBLY_CONTINUES) && parent.continueLabel == this.continueLabel) {\r\n parent.set(FlowFlags.POSSIBLY_CONTINUES);\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n /** Adds a new scoped local of the specified name. */\r\n addScopedLocal(name: string, type: Type, reportNode: Node): void {\r\n var scopedLocal = this.currentFunction.getTempLocal(type);\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else if (this.scopedLocals.has(name)) {\r\n this.currentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n return;\r\n }\r\n this.scopedLocals.set(name, scopedLocal);\r\n }\r\n\r\n /** Gets the local of the specified name in the current scope. */\r\n getScopedLocal(name: string): Local | null {\r\n var local: Local | null;\r\n var current: Flow | null = this;\r\n do {\r\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n return local;\r\n }\r\n } while (current = current.parent);\r\n return this.currentFunction.locals.get(name);\r\n }\r\n\r\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n finalize(): bool {\r\n assert(this.parent == null, \"must be the topmost parent flow\");\r\n this.continueLabel = null;\r\n this.breakLabel = null;\r\n return this.is(FlowFlags.RETURNS);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/program.ts","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 3\n// module chunks = 0","import {\r\n compileCall as compileBuiltinCall,\r\n compileGetConstant as compileBuiltinGetConstant,\r\n compileAllocate as compileBuiltinAllocate\r\n} from \"./builtins\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module,\r\n MemorySegment,\r\n ExpressionRef,\r\n UnaryOp,\r\n BinaryOp,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionId\r\n} from \"./module\";\r\n\r\nimport {\r\n Program,\r\n ClassPrototype,\r\n Class,\r\n Element,\r\n ElementKind,\r\n Enum,\r\n Field,\r\n FunctionPrototype,\r\n Function,\r\n Global,\r\n Local,\r\n Namespace,\r\n EnumValue,\r\n Property,\r\n VariableLikeElement,\r\n FlowFlags,\r\n ElementFlags,\r\n ConstantValueKind,\r\n Parameter,\r\n\r\n PATH_DELIMITER,\r\n LIBRARY_PREFIX\r\n} from \"./program\";\r\n\r\nimport {\r\n Token\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n TypeNode,\r\n Source,\r\n Range,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DoStatement,\r\n EmptyStatement,\r\n EnumDeclaration,\r\n ExportStatement,\r\n ExpressionStatement,\r\n FunctionDeclaration,\r\n ForStatement,\r\n IfStatement,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n ModifierKind,\r\n NamespaceDeclaration,\r\n ReturnStatement,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n VariableDeclaration,\r\n VariableStatement,\r\n WhileStatement,\r\n\r\n Expression,\r\n AssertionExpression,\r\n BinaryExpression,\r\n CallExpression,\r\n CommaExpression,\r\n ElementAccessExpression,\r\n FloatLiteralExpression,\r\n IdentifierExpression,\r\n IntegerLiteralExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n NewExpression,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n TernaryExpression,\r\n ArrayLiteralExpression,\r\n StringLiteralExpression,\r\n UnaryPostfixExpression,\r\n UnaryPrefixExpression,\r\n\r\n hasModifier\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n\r\n typesToNativeTypes\r\n} from \"./types\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n /** WebAssembly with 32-bit pointers. */\r\n WASM32,\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n target: Target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n noTreeShaking: bool = false;\r\n /** If true, replaces assertions with nops. */\r\n noAssert: bool = false;\r\n /** If true, does not set up a memory. */\r\n noMemory: bool = false;\r\n /** Static memory start offset. */\r\n memoryBase: u32 = 0;\r\n /** Memory allocation implementation to use. */\r\n allocateImpl: string = \"allocate_memory\";\r\n /** Memory freeing implementation to use. */\r\n freeImpl: string = \"free_memory\";\r\n /** If true, generates information necessary for source maps. */\r\n sourceMap: bool = false;\r\n\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get isWasm64(): bool {\r\n return this.target == Target.WASM64;\r\n }\r\n\r\n /** Gets the unsigned size type matching the target. */\r\n get usizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n }\r\n\r\n /** Gets the signed size type matching the target. */\r\n get isizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n }\r\n\r\n /** Gets the native size type matching the target. */\r\n get nativeSizeType(): NativeType {\r\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n }\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n /** No conversion. */\r\n NONE,\r\n /** Implicit conversion. */\r\n IMPLICIT,\r\n /** Explicit conversion. */\r\n EXPLICIT\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Provided options. */\r\n options: Options;\r\n /** Module instance being compiled. */\r\n module: Module;\r\n\r\n /** Start function being compiled. */\r\n startFunction: Function;\r\n /** Start function statements. */\r\n startFunctionBody: ExpressionRef[] = new Array();\r\n\r\n /** Current function in compilation. */\r\n currentFunction: Function;\r\n /** Current enum in compilation. */\r\n currentEnum: Enum | null = null;\r\n /** Current type in compilation. */\r\n currentType: Type = Type.void;\r\n\r\n /** Counting memory offset. */\r\n memoryOffset: I64;\r\n /** Memory segments being compiled. */\r\n memorySegments: MemorySegment[] = new Array();\r\n /** Map of already compiled static string segments. */\r\n stringSegments: Map = new Map();\r\n\r\n /** Already processed file names. */\r\n files: Set = new Set();\r\n\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n static compile(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n }\r\n\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n constructor(program: Program, options: Options | null = null) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n this.options = options ? options : new Options();\r\n this.memoryOffset = i64_new(\r\n max(this.options.memoryBase, this.options.usizeType.byteSize) // leave space for `null`\r\n );\r\n this.module = Module.create();\r\n }\r\n\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n compile(): Module {\r\n\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n this.program.initialize(this.options);\r\n\r\n // set up the start function wrapping top-level statements, of all files.\r\n var startFunctionPrototype = assert(this.program.elements.get(\"start\"));\r\n assert(startFunctionPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n var startFunctionInstance = new Function(\r\n startFunctionPrototype,\r\n startFunctionPrototype.internalName,\r\n null, // not generic\r\n null, // no parameters\r\n Type.void\r\n );\r\n startFunctionInstance.set(ElementFlags.START);\r\n this.currentFunction = this.startFunction = startFunctionInstance;\r\n\r\n var sources = this.program.sources;\r\n\r\n // compile entry file(s) while traversing to reachable elements\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) {\r\n this.compileSource(sources[i]);\r\n }\r\n }\r\n\r\n // compile the start function if not empty\r\n if (this.startFunctionBody.length) {\r\n var typeRef = this.module.getFunctionTypeBySignature(NativeType.None, []);\r\n if (!typeRef) typeRef = this.module.addFunctionType(\"v\", NativeType.None, []);\r\n var ref: FunctionRef;\r\n this.module.setStart(\r\n ref = this.module.addFunction(\r\n this.startFunction.prototype.internalName,\r\n typeRef,\r\n typesToNativeTypes(this.startFunction.additionalLocals),\r\n this.module.createBlock(null, this.startFunctionBody)\r\n )\r\n );\r\n this.startFunction.finalize(this.module, ref);\r\n }\r\n\r\n // set up static memory segments and the heap base pointer\r\n if (!this.options.noMemory) {\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, this.options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n if (this.options.isWasm64) {\r\n this.module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n false,\r\n this.module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n );\r\n } else {\r\n this.module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n this.module.createI32(i64_low(memoryOffset))\r\n );\r\n }\r\n\r\n // determine initial page size\r\n var pages = i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0));\r\n this.module.setMemory(\r\n i64_low(pages),\r\n Module.MAX_MEMORY_WASM32 /* TODO: not WASM64 compatible yet */,\r\n this.memorySegments,\r\n this.options.target,\r\n \"memory\"\r\n );\r\n }\r\n return this.module;\r\n }\r\n\r\n // sources\r\n\r\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n var sources = this.program.sources;\r\n\r\n var source: Source;\r\n var expected = normalizedPathWithoutExtension + \".ts\";\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n expected = normalizedPathWithoutExtension + \"/index.ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n expected = LIBRARY_PREFIX + normalizedPathWithoutExtension + \".ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n reportNode.range, normalizedPathWithoutExtension\r\n );\r\n }\r\n\r\n compileSource(source: Source): void {\r\n var files = this.files;\r\n if (files.has(source.normalizedPath)) return;\r\n files.add(source.normalizedPath);\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (var i = 0, k = statements.length; i < k; ++i) {\r\n var statement = statements[i];\r\n switch (statement.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) &&\r\n !(statement).typeParameters.length\r\n ) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) &&\r\n !(statement).typeParameters.length\r\n ) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n\r\n case NodeKind.IMPORT:\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n\r\n case NodeKind.VARIABLE: // global, always compiled as initializers might have side effects\r\n var variableInit = this.compileVariableStatement(statement);\r\n if (variableInit) startFunctionBody.push(variableInit);\r\n break;\r\n\r\n case NodeKind.EXPORT:\r\n if ((statement).normalizedPath != null) {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n\r\n // otherwise a top-level statement that is part of the start function's body\r\n default:\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = this.startFunction;\r\n var expr = this.compileStatement(statement);\r\n this.startFunctionBody.push(expr);\r\n this.currentFunction = previousFunction;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // globals\r\n\r\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.GLOBAL) {\r\n throw new Error(\"global expected\");\r\n }\r\n if (!this.compileGlobal(element)) { // reports\r\n return null;\r\n }\r\n return element;\r\n }\r\n\r\n compileGlobal(global: Global): bool {\r\n if (global.is(ElementFlags.COMPILED) || global.is(ElementFlags.BUILTIN)) {\r\n return true;\r\n }\r\n\r\n var declaration = global.declaration;\r\n var initExpr: ExpressionRef = 0;\r\n if (global.type == Type.void) { // infer type\r\n if (declaration.type) {\r\n var resolvedType = this.program.resolveType(declaration.type); // reports\r\n if (!resolvedType) return false;\r\n if (resolvedType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.type.range, \"*\", resolvedType.toString()\r\n );\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n initExpr = this.compileExpression( // reports\r\n declaration.initializer,\r\n Type.void,\r\n ConversionKind.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.initializer.range, this.currentType.toString(), \"\"\r\n );\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n var nativeType = global.type.toNativeType();\r\n\r\n if (global.is(ElementFlags.DECLARED)) {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n this.module.addGlobalImport(\r\n global.internalName,\r\n global.namespace\r\n ? global.namespace.simpleName\r\n : \"env\",\r\n global.simpleName,\r\n nativeType\r\n );\r\n global.set(ElementFlags.COMPILED);\r\n return true;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n declaration.range\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n var initializeInStart = false;\r\n\r\n if (global.is(ElementFlags.INLINED)) {\r\n initExpr = this.compileInlineConstant(global, global.type);\r\n } else {\r\n if (declaration.initializer) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(declaration.initializer, global.type);\r\n }\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n initializeInStart = true;\r\n }\r\n } else {\r\n initializeInStart = true;\r\n }\r\n }\r\n } else {\r\n initExpr = global.type.toNativeZero(this.module);\r\n }\r\n }\r\n\r\n var internalName = global.internalName;\r\n if (initializeInStart) {\r\n this.module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(this.module));\r\n var setExpr = this.module.createSetGlobal(internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n } else {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n var exprType = _BinaryenExpressionGetType(initExpr);\r\n switch (exprType) {\r\n\r\n case NativeType.I32:\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI32(initExpr), 0);\r\n break;\r\n\r\n case NativeType.I64:\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(\r\n _BinaryenConstGetValueI64Low(initExpr),\r\n _BinaryenConstGetValueI64High(initExpr)\r\n );\r\n break;\r\n\r\n case NativeType.F32:\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = _BinaryenConstGetValueF32(initExpr);\r\n break;\r\n\r\n case NativeType.F64:\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = _BinaryenConstGetValueF64(initExpr);\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n global.set(ElementFlags.INLINED);\r\n if (declaration.isTopLevel) { // might be re-exported\r\n this.module.addGlobal(internalName, nativeType, !global.is(ElementFlags.CONSTANT), initExpr);\r\n }\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addGlobalExport(global.internalName, declaration.programLevelInternalName);\r\n }\r\n } else {\r\n this.module.addGlobal(internalName, nativeType, !global.is(ElementFlags.CONSTANT), initExpr);\r\n }\r\n }\r\n global.set(ElementFlags.COMPILED);\r\n return true;\r\n }\r\n\r\n // enums\r\n\r\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.ENUM) throw new Error(\"enum expected\");\r\n return this.compileEnum(element) ? element : null;\r\n }\r\n\r\n compileEnum(element: Enum): bool {\r\n if (element.is(ElementFlags.COMPILED)) return true;\r\n\r\n // members might reference each other, triggering another compile\r\n element.set(ElementFlags.COMPILED);\r\n\r\n this.currentEnum = element;\r\n var previousValue: EnumValue | null = null;\r\n if (element.members) {\r\n for (var member of element.members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n var initInStart = false;\r\n var val = member;\r\n var valueDeclaration = val.declaration;\r\n val.set(ElementFlags.COMPILED);\r\n if (val.is(ElementFlags.INLINED)) {\r\n if (element.declaration.isTopLevelExport) {\r\n this.module.addGlobal(\r\n val.internalName,\r\n NativeType.I32,\r\n false, // constant\r\n this.module.createI32(val.constantValue)\r\n );\r\n }\r\n } else {\r\n var initExpr: ExpressionRef;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(valueDeclaration.value, Type.i32);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n if (element.is(ElementFlags.CONSTANT)) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n } else if (previousValue == null) {\r\n initExpr = this.module.createI32(0);\r\n } else if (previousValue.is(ElementFlags.INLINED)) {\r\n initExpr = this.module.createI32(previousValue.constantValue + 1);\r\n } else {\r\n // in TypeScript this errors with TS1061, but actually we can do:\r\n initExpr = this.module.createBinary(BinaryOp.AddI32,\r\n this.module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n this.module.createI32(1)\r\n );\r\n if (element.is(ElementFlags.CONSTANT)) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n if (initInStart) {\r\n this.module.addGlobal(\r\n val.internalName,\r\n NativeType.I32,\r\n true, // mutable\r\n this.module.createI32(0)\r\n );\r\n var setExpr = this.module.createSetGlobal(val.internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n } else {\r\n this.module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\r\n if (_BinaryenExpressionGetType(initExpr) == NativeType.I32) {\r\n val.constantValue = _BinaryenConstGetValueI32(initExpr);\r\n val.set(ElementFlags.INLINED);\r\n } else {\r\n throw new Error(\"i32 expected\");\r\n }\r\n }\r\n }\r\n previousValue = val;\r\n\r\n // export values if the enum is exported\r\n if (element.declaration.range.source.isEntry && element.declaration.isTopLevelExport) {\r\n if (member.is(ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(member.internalName, member.internalName);\r\n } else if (valueDeclaration) {\r\n this.warning(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n valueDeclaration.range\r\n );\r\n }\r\n }\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n }\r\n\r\n // functions\r\n\r\n compileFunctionDeclaration(\r\n declaration: FunctionDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null\r\n ): Function | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n throw new Error(\"function expected\");\r\n }\r\n return this.compileFunctionUsingTypeArguments( // reports\r\n element,\r\n typeArguments,\r\n contextualTypeArguments,\r\n (element).declaration.name\r\n );\r\n }\r\n\r\n compileFunctionUsingTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n typeArguments,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!instance) return null;\r\n return this.compileFunction(instance) ? instance : null;\r\n }\r\n\r\n compileFunction(instance: Function): bool {\r\n if (instance.is(ElementFlags.COMPILED)) return true;\r\n\r\n assert(!instance.is(ElementFlags.BUILTIN) || instance.simpleName == \"abort\");\r\n\r\n var declaration = instance.prototype.declaration;\r\n if (instance.is(ElementFlags.DECLARED)) {\r\n if (declaration.statements) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n declaration.name.range\r\n );\r\n return false;\r\n }\r\n } else if (!declaration.statements) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n declaration.name.range\r\n );\r\n return false;\r\n }\r\n\r\n // might trigger compilation of other functions referring to this one\r\n instance.set(ElementFlags.COMPILED);\r\n\r\n // compile statements\r\n var stmts: ExpressionRef[] | null = null;\r\n if (!instance.is(ElementFlags.DECLARED)) {\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = instance;\r\n var statements = assert(declaration.statements, \"implementation expected\");\r\n stmts = this.compileStatements(statements);\r\n // make sure the top-level branch or all child branches return\r\n var allBranchesReturn = this.currentFunction.flow.finalize();\r\n if (instance.returnType != Type.void && !allBranchesReturn) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n assert(declaration.returnType, \"return type expected\").range\r\n );\r\n }\r\n this.currentFunction = previousFunction;\r\n }\r\n\r\n // create the function type\r\n var numParameters = instance.parameters ? instance.parameters.length : 0;\r\n var numParametersInclThis = instance.instanceMethodOf ? numParameters + 1 : numParameters;\r\n var paramIndex = 0;\r\n\r\n var nativeResultType = instance.returnType.toNativeType();\r\n var nativeParamTypes = new Array(numParametersInclThis);\r\n var signatureNameParts = new Array(numParametersInclThis + 1);\r\n\r\n if (instance.instanceMethodOf) {\r\n nativeParamTypes[paramIndex] = this.options.isWasm64 ? NativeType.I64 : NativeType.I32;\r\n signatureNameParts[paramIndex++] = instance.instanceMethodOf.type.toSignatureString();\r\n }\r\n if (instance.parameters) {\r\n for (var i = 0; i < numParameters; ++i) {\r\n nativeParamTypes[paramIndex] = instance.parameters[i].type.toNativeType();\r\n signatureNameParts[paramIndex++] = instance.parameters[i].type.toSignatureString();\r\n }\r\n }\r\n signatureNameParts[paramIndex] = instance.returnType.toSignatureString();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeResultType, nativeParamTypes);\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(\r\n signatureNameParts.join(\"\"),\r\n nativeResultType,\r\n nativeParamTypes\r\n );\r\n }\r\n\r\n // create the function\r\n var ref: FunctionRef;\r\n if (instance.is(ElementFlags.DECLARED)) {\r\n ref = this.module.addFunctionImport(\r\n instance.internalName,\r\n instance.prototype.namespace\r\n ? instance.prototype.namespace.simpleName\r\n : \"env\",\r\n instance.simpleName,\r\n typeRef\r\n );\r\n } else {\r\n ref = this.module.addFunction(\r\n instance.internalName,\r\n typeRef,\r\n typesToNativeTypes(instance.additionalLocals),\r\n this.module.createBlock(null, stmts, NativeType.None)\r\n );\r\n }\r\n\r\n // check module export\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addFunctionExport(instance.internalName, declaration.name.text);\r\n }\r\n\r\n instance.finalize(this.module, ref);\r\n return true;\r\n }\r\n\r\n // namespaces\r\n\r\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n switch (member.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n var variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit) this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n\r\n compileNamespace(ns: Namespace): void {\r\n if (!ns.members) return;\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var element of ns.members.values()) {\r\n switch (element.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (element).is(ElementFlags.EXPORTED)\r\n ) && !(element).is(ElementFlags.GENERIC)\r\n ) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n\r\n case ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (\r\n (\r\n noTreeShaking || (element).is(ElementFlags.EXPORTED)\r\n ) && !(element).is(ElementFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n\r\n case ElementKind.GLOBAL:\r\n this.compileGlobal(element);\r\n break;\r\n\r\n case ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // exports\r\n\r\n compileExportStatement(statement: ExportStatement): void {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n var internalExportName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n member.externalName.text\r\n );\r\n var element = this.program.exports.get(internalExportName);\r\n if (!element) continue; // reported in Program#initialize\r\n\r\n switch (element.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n if (!(element).is(ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n\r\n case ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (\r\n !(element).is(ElementFlags.GENERIC) &&\r\n statement.range.source.isEntry\r\n ) {\r\n var functionInstance = this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n null,\r\n (element).declaration.name\r\n );\r\n if (functionInstance) {\r\n var functionDeclaration = functionInstance.prototype.declaration;\r\n if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n this.module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case ElementKind.GLOBAL:\r\n if (this.compileGlobal(element) && statement.range.source.isEntry) {\r\n var globalDeclaration = (element).declaration;\r\n if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n if ((element).is(ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(element.internalName, member.externalName.text);\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n member.range\r\n );\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // classes\r\n\r\n compileClassDeclaration(\r\n declaration: ClassDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n throw new Error(\"class expected\");\r\n }\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n }\r\n\r\n compileClassUsingTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n if (!instance) return;\r\n this.compileClass(instance);\r\n }\r\n\r\n compileClass(instance: Class): bool {\r\n if (instance.is(ElementFlags.COMPILED)) return true;\r\n instance.set(ElementFlags.COMPILED);\r\n return true;\r\n }\r\n\r\n compileInterfaceDeclaration(\r\n declaration: InterfaceDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n // memory\r\n\r\n /** Adds a static memory segment with the specified data. */\r\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n }\r\n\r\n // statements\r\n\r\n compileStatement(statement: Statement): ExpressionRef {\r\n var expr: ExpressionRef;\r\n switch (statement.kind) {\r\n\r\n case NodeKind.BLOCK:\r\n expr = this.compileBlockStatement(statement);\r\n break;\r\n\r\n case NodeKind.BREAK:\r\n expr = this.compileBreakStatement(statement);\r\n break;\r\n\r\n case NodeKind.CONTINUE:\r\n expr = this.compileContinueStatement(statement);\r\n break;\r\n\r\n case NodeKind.DO:\r\n expr = this.compileDoStatement(statement);\r\n break;\r\n\r\n case NodeKind.EMPTY:\r\n expr = this.compileEmptyStatement(statement);\r\n break;\r\n\r\n case NodeKind.EXPRESSION:\r\n expr = this.compileExpressionStatement(statement);\r\n break;\r\n\r\n case NodeKind.FOR:\r\n expr = this.compileForStatement(statement);\r\n break;\r\n\r\n case NodeKind.IF:\r\n expr = this.compileIfStatement(statement);\r\n break;\r\n\r\n case NodeKind.RETURN:\r\n expr = this.compileReturnStatement(statement);\r\n break;\r\n\r\n case NodeKind.SWITCH:\r\n expr = this.compileSwitchStatement(statement);\r\n break;\r\n\r\n case NodeKind.THROW:\r\n expr = this.compileThrowStatement(statement);\r\n break;\r\n\r\n case NodeKind.TRY:\r\n expr = this.compileTryStatement(statement);\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n var variableInit = this.compileVariableStatement(statement);\r\n expr = variableInit ? variableInit : this.module.createNop();\r\n break;\r\n\r\n case NodeKind.WHILE:\r\n expr = this.compileWhileStatement(statement);\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n if (this.currentFunction == this.startFunction) {\r\n return this.module.createNop();\r\n }\r\n // fall-through: must be top-level; function bodies are not guaranteed to be evaluated\r\n\r\n default:\r\n throw new Error(\"statement expected\");\r\n }\r\n\r\n this.addDebugLocation(expr, statement.range);\r\n return expr;\r\n }\r\n\r\n compileStatements(statements: Statement[]): ExpressionRef[] {\r\n var k = statements.length;\r\n var stmts = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n stmts[i] = this.compileStatement(statements[i]);\r\n }\r\n return stmts; // array of 0-es in noEmit-mode\r\n }\r\n\r\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n var statements = statement.statements;\r\n\r\n // NOTE that we could optimize this to a NOP if empty or unwrap a single\r\n // statement, but that's not what the source told us to do and left to the\r\n // optimizer.\r\n\r\n // Not actually a branch, but can contain its own scoped variables.\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n\r\n var stmt = this.module.createBlock(null, this.compileStatements(statements), NativeType.None);\r\n var stmtReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n if (stmtReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n }\r\n return stmt;\r\n }\r\n\r\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var breakLabel = this.currentFunction.flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_BREAKS);\r\n return this.module.createBreak(breakLabel);\r\n }\r\n\r\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var continueLabel = this.currentFunction.flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_CONTINUES);\r\n return this.module.createBreak(continueLabel);\r\n }\r\n\r\n compileDoStatement(statement: DoStatement): ExpressionRef {\r\n\r\n // A do statement does not initiate a new branch because it is executed at\r\n // least once, but has its own break and continue labels.\r\n var label = this.currentFunction.enterBreakContext();\r\n var previousBreakLabel = this.currentFunction.flow.breakLabel;\r\n var previousContinueLabel = this.currentFunction.flow.continueLabel;\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n\r\n // Reset to the previous break and continue labels, if any.\r\n this.currentFunction.flow.breakLabel = previousBreakLabel;\r\n this.currentFunction.flow.continueLabel = previousContinueLabel;\r\n\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n this.currentFunction.leaveBreakContext();\r\n\r\n return this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel,\r\n this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel, condition)\r\n ], NativeType.None))\r\n ], NativeType.None);\r\n }\r\n\r\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n return this.module.createNop();\r\n }\r\n\r\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE);\r\n if (this.currentType != Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = Type.void;\r\n }\r\n return expr;\r\n }\r\n\r\n compileForStatement(statement: ForStatement): ExpressionRef {\r\n\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var context = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + context;\r\n\r\n // Compile in correct order\r\n var initializer = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : this.module.createNop();\r\n var condition = statement.condition\r\n ? this.compileExpression(statement.condition, Type.i32)\r\n : this.module.createI32(1);\r\n var incrementor = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, Type.void)\r\n : this.module.createNop();\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = !statement.condition && this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n // TODO: check other always-true conditions as well, not just omitted\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n\r\n var expr = this.module.createBlock(breakLabel, [\r\n initializer,\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n incrementor,\r\n this.module.createBreak(continueLabel)\r\n ], NativeType.None))\r\n ], NativeType.None))\r\n ], NativeType.None);\r\n\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n }\r\n\r\n compileIfStatement(statement: IfStatement): ExpressionRef {\r\n\r\n // The condition doesn't initiate a branch yet\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n // Each arm initiates a branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var ifTrue = this.compileStatement(statement.ifTrue);\r\n var ifTrueReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n\r\n var ifFalse: ExpressionRef = 0;\r\n var ifFalseReturns = false;\r\n if (statement.ifFalse) {\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n ifFalse = this.compileStatement(statement.ifFalse);\r\n ifFalseReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n }\r\n if (ifTrueReturns && ifFalseReturns) { // not necessary to append a hint\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n }\r\n return this.module.createIf(condition, ifTrue, ifFalse);\r\n }\r\n\r\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n var expression: ExpressionRef = 0;\r\n if (statement.value) {\r\n expression = this.compileExpression(statement.value, this.currentFunction.returnType);\r\n }\r\n\r\n // Remember that this flow returns\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n\r\n return this.module.createReturn(expression);\r\n }\r\n\r\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n\r\n // Everything within a switch uses the same break context\r\n var context = this.currentFunction.enterBreakContext();\r\n\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = this.currentFunction.getTempLocal(Type.i32);\r\n var k = statement.cases.length;\r\n\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + k);\r\n breaks[0] = this.module.createSetLocal( // initializer\r\n tempLocal.index,\r\n this.compileExpression(statement.condition, Type.i32)\r\n );\r\n\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (var i = 0; i < k; ++i) {\r\n var case_ = statement.cases[i];\r\n if (case_.label) {\r\n breaks[breakIndex++] = this.module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n this.module.createBinary(BinaryOp.EqI32,\r\n this.module.createGetLocal(tempLocal.index, NativeType.I32),\r\n this.compileExpression(case_.label, Type.i32)\r\n )\r\n );\r\n } else {\r\n defaultIndex = i;\r\n }\r\n }\r\n\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = this.module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\"\r\n ) + \"|\" + context);\r\n\r\n // nest blocks in order\r\n var currentBlock = this.module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n var alwaysReturns = true;\r\n for (i = 0; i < k; ++i) {\r\n case_ = statement.cases[i];\r\n var l = case_.statements.length;\r\n var body = new Array(1 + l);\r\n body[0] = currentBlock;\r\n\r\n // Each switch case initiates a new branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n\r\n var fallsThrough = i != k - 1;\r\n var nextLabel = !fallsThrough ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n for (var j = 0; j < l; ++j) {\r\n body[j + 1] = this.compileStatement(case_.statements[j]);\r\n }\r\n if (!(fallsThrough || this.currentFunction.flow.is(FlowFlags.RETURNS))) {\r\n alwaysReturns = false; // ignore fall-throughs\r\n }\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n\r\n currentBlock = this.module.createBlock(nextLabel, body, NativeType.None);\r\n }\r\n this.currentFunction.leaveBreakContext();\r\n\r\n // If the switch has a default and always returns, propagate that\r\n if (defaultIndex >= 0 && alwaysReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n // Binaryen understands that so we don't need a hint\r\n }\r\n return currentBlock;\r\n }\r\n\r\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n\r\n // Remember that this branch possibly throws\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_THROWS);\r\n\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n\r\n // TODO: requires exception-handling spec.\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileTryStatement(statement: TryStatement): ExpressionRef {\r\n throw new Error(\"not implemented\");\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n }\r\n\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n var declarations = statement.declarations;\r\n\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (\r\n this.currentFunction == this.startFunction &&\r\n statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n )) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n\r\n // other variables become locals\r\n var initializers = new Array();\r\n for (i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var name = declaration.name.text;\r\n var type: Type | null = null;\r\n var init: ExpressionRef = 0;\r\n if (declaration.type) {\r\n type = this.program.resolveType( // reports\r\n declaration.type,\r\n this.currentFunction.contextualTypeArguments\r\n );\r\n if (!type) continue;\r\n if (declaration.initializer) {\r\n init = this.compileExpression(declaration.initializer, type); // reports\r\n }\r\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n init = this.compileExpression( // reports\r\n declaration.initializer,\r\n Type.void,\r\n ConversionKind.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.range, this.currentType.toString(), \"\"\r\n );\r\n continue;\r\n }\r\n type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n continue;\r\n }\r\n if (hasModifier(ModifierKind.CONST, declaration.modifiers)) {\r\n if (init) {\r\n init = this.precomputeExpressionRef(init);\r\n if (_BinaryenExpressionGetId(init) == ExpressionId.Const) {\r\n var local = new Local(this.program, name, -1, type);\r\n switch (_BinaryenExpressionGetType(init)) {\r\n case NativeType.I32:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI32(init), 0);\r\n break;\r\n case NativeType.I64:\r\n local = local.withConstantIntegerValue(\r\n _BinaryenConstGetValueI64Low(init),\r\n _BinaryenConstGetValueI64High(init)\r\n );\r\n break;\r\n case NativeType.F32:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF32(init));\r\n break;\r\n case NativeType.F64:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF64(init));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n var scopedLocals = this.currentFunction.flow.scopedLocals;\r\n if (!scopedLocals) scopedLocals = this.currentFunction.flow.scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return 0;\r\n }\r\n scopedLocals.set(name, local);\r\n return 0;\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n declaration.range\r\n );\r\n }\r\n }\r\n if (hasModifier(ModifierKind.LET, declaration.modifiers)) { // here: not top-level\r\n this.currentFunction.flow.addScopedLocal(name, type, declaration.name); // reports\r\n } else {\r\n this.currentFunction.addLocal(type, name); // reports\r\n }\r\n if (init) {\r\n initializers.push(this.compileAssignmentWithValue(declaration.name, init));\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, NativeType.None)\r\n : 0;\r\n }\r\n\r\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n\r\n // The condition does not yet initialize a branch\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n // Statements initiate a new branch with its own break context\r\n var label = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = false && this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n // TODO: evaluate possible always-true conditions\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n\r\n var expr = this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel,\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel)\r\n ], NativeType.None))\r\n )\r\n ], NativeType.None);\r\n\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n }\r\n\r\n // expressions\r\n\r\n /** Compiles an inlined constant value of a variable-like element. */\r\n compileInlineConstant(element: VariableLikeElement, contextualType: Type): ExpressionRef {\r\n assert(element.is(ElementFlags.INLINED));\r\n\r\n switch (\r\n element.type.is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n element.type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = element.type).kind\r\n ) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n var shift = element.type.computeSmallIntegerShift(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0\r\n );\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n var mask = element.type.computeSmallIntegerMask(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0\r\n );\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return element.constantValueKind == ConstantValueKind.INTEGER\r\n ? this.module.createI64(\r\n i64_low(element.constantIntegerValue),\r\n i64_high(element.constantIntegerValue)\r\n )\r\n : this.module.createI64(0);\r\n\r\n case TypeKind.F32:\r\n return this.module.createF32((element).constantFloatValue);\r\n\r\n case TypeKind.F64:\r\n return this.module.createF64((element).constantFloatValue);\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n }\r\n\r\n compileExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind = ConversionKind.IMPLICIT,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n this.currentType = contextualType;\r\n\r\n var expr: ExpressionRef;\r\n switch (expression.kind) {\r\n\r\n case NodeKind.ASSERTION:\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.BINARY:\r\n expr = this.compileBinaryExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n\r\n case NodeKind.CALL:\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.COMMA:\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.ELEMENTACCESS:\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.FALSE:\r\n case NodeKind.NULL:\r\n case NodeKind.THIS:\r\n case NodeKind.TRUE:\r\n expr = this.compileIdentifierExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.LITERAL:\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.NEW:\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.PARENTHESIZED:\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.PROPERTYACCESS:\r\n expr = this.compilePropertyAccessExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.TERNARY:\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.UNARYPOSTFIX:\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.UNARYPREFIX:\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n\r\n default:\r\n throw new Error(\"expression expected\");\r\n }\r\n\r\n if (conversionKind != ConversionKind.NONE && this.currentType != contextualType) {\r\n expr = this.convertExpression(expr, this.currentType, contextualType, conversionKind, expression);\r\n this.currentType = contextualType;\r\n }\r\n\r\n this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n }\r\n\r\n precomputeExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind = ConversionKind.IMPLICIT\r\n ): ExpressionRef {\r\n return this.precomputeExpressionRef(this.compileExpression(expression, contextualType, conversionKind));\r\n }\r\n\r\n precomputeExpressionRef(expr: ExpressionRef): ExpressionRef {\r\n var nativeType = this.currentType.toNativeType();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeType, []);\r\n var typeRefAdded = false;\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(this.currentType.toSignatureString(), nativeType, []);\r\n typeRefAdded = true;\r\n }\r\n var funcRef = this.module.addFunction(\"__precompute\", typeRef, [], expr);\r\n this.module.runPasses([ \"precompute\" ], funcRef);\r\n var ret = _BinaryenFunctionGetBody(funcRef);\r\n this.module.removeFunction(\"__precompute\");\r\n if (typeRefAdded) {\r\n // TODO: also remove the function type somehow if no longer used or make the C-API accept\r\n // a `null` typeRef, using an implicit type.\r\n }\r\n return ret;\r\n }\r\n\r\n convertExpression(\r\n expr: ExpressionRef,\r\n fromType: Type,\r\n toType: Type,\r\n conversionKind: ConversionKind,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n if (conversionKind == ConversionKind.NONE) {\r\n assert(false, \"concrete type expected\");\r\n return expr;\r\n }\r\n\r\n // void to any\r\n if (fromType.kind == TypeKind.VOID) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // any to void\r\n if (toType.kind == TypeKind.VOID) {\r\n return this.module.createDrop(expr);\r\n }\r\n\r\n var mod = this.module;\r\n var losesInformation = false;\r\n\r\n if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n // float to float\r\n if (toType.is(TypeFlags.FLOAT)) {\r\n if (fromType.kind == TypeKind.F32) {\r\n\r\n // f32 to f64\r\n if (toType.kind == TypeKind.F64) {\r\n expr = mod.createUnary(UnaryOp.PromoteF32, expr);\r\n }\r\n\r\n // otherwise f32 to f32\r\n\r\n // f64 to f32\r\n } else if (toType.kind == TypeKind.F32) {\r\n losesInformation = true;\r\n expr = mod.createUnary(UnaryOp.DemoteF64, expr);\r\n }\r\n\r\n // otherwise f64 to f64\r\n\r\n // float to int\r\n } else if (toType.is(TypeFlags.INTEGER)) {\r\n losesInformation = true;\r\n\r\n // f32 to int\r\n if (fromType.kind == TypeKind.F32) {\r\n if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n\r\n // f64 to int\r\n } else {\r\n if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // float to void\r\n } else {\r\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n expr = this.module.createDrop(expr);\r\n }\r\n\r\n // int to float\r\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n // int to f32\r\n if (toType.kind == TypeKind.F32) {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF32\r\n : UnaryOp.ConvertU64ToF32,\r\n expr\r\n );\r\n } else {\r\n losesInformation = !fromType.is(TypeFlags.SMALL);\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF32\r\n : UnaryOp.ConvertU32ToF32,\r\n expr\r\n );\r\n }\r\n\r\n // int to f64\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF64\r\n : UnaryOp.ConvertU64ToF64,\r\n expr\r\n );\r\n } else {\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF64\r\n : UnaryOp.ConvertU32ToF64,\r\n expr\r\n );\r\n }\r\n }\r\n\r\n // int to int\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n\r\n // i64 to i32\r\n if (!toType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n\r\n // i32 to i64\r\n } else if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(toType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32, expr);\r\n\r\n // i32 or smaller to even smaller or same size int with change of sign\r\n } else if (\r\n toType.is(TypeFlags.SMALL) &&\r\n (\r\n fromType.size > toType.size ||\r\n (\r\n fromType.size == toType.size &&\r\n fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED)\r\n )\r\n )\r\n ) {\r\n losesInformation = true;\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n\r\n // otherwise (smaller) i32/u32 to (same size) i32/u32\r\n }\r\n\r\n if (losesInformation && conversionKind == ConversionKind.IMPLICIT) {\r\n this.error(\r\n DiagnosticCode.Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n var toType = this.program.resolveType( // reports\r\n expression.toType,\r\n this.currentFunction.contextualTypeArguments\r\n );\r\n if (!toType) return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT);\r\n }\r\n\r\n compileBinaryExpression(\r\n expression: BinaryExpression,\r\n contextualType: Type,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n var left: ExpressionRef;\r\n var right: ExpressionRef;\r\n var condition: ExpressionRef;\r\n var expr: ExpressionRef;\r\n\r\n var compound = false;\r\n var possiblyOverflows = false;\r\n var tempLocal: Local | null = null;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.LESSTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.LtI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.LtI64, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.LtU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.LtU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.LtF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.LtF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.GtI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.GtI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.GtU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.GtU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.GtF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.GtF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.LESSTHAN_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.LeI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeI64\r\n : BinaryOp.LeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.LeI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.LeU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeU64\r\n : BinaryOp.LeU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.LeU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.LeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.LeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.GREATERTHAN_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.GeI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeI64\r\n : BinaryOp.GeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.GeI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.GeU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeU64\r\n : BinaryOp.GeU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.GeU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.GeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.GeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n // TODO?\r\n case Token.EQUALS_EQUALS:\r\n\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.EqI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.EqI64\r\n : BinaryOp.EqI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.EqI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.EqF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.EqF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n // TODO?\r\n case Token.EXCLAMATION_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.NeI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.NeI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.NeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.NeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EQUALS:\r\n return this.compileAssignment(expression.left, expression.right, contextualType);\r\n\r\n case Token.PLUS_EQUALS:\r\n compound = true;\r\n case Token.PLUS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.AddI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AddI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.AddF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.AddF64, left, right);\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.MINUS_EQUALS:\r\n compound = true;\r\n case Token.MINUS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.SubI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.SubF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.SubF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.ASTERISK_EQUALS:\r\n compound = true;\r\n case Token.ASTERISK:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n // fall-through\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.MulI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.MulI64\r\n : BinaryOp.MulI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.MulI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.MulF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.MulF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.SLASH_EQUALS:\r\n compound = true;\r\n case Token.SLASH:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // TODO: when can division remain unwrapped? does it overflow?\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.DivI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivI64\r\n : BinaryOp.DivI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.DivI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.DivU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivU64\r\n : BinaryOp.DivU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.DivU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.DivF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.DivF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.PERCENT_EQUALS:\r\n compound = true;\r\n case Token.PERCENT:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // TODO: when can remainder remain unwrapped? may it overflow?\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.RemI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemI64\r\n : BinaryOp.RemI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.RemI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.RemU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemU64\r\n : BinaryOp.RemU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.RemU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n // TODO: internal fmod, possibly simply imported from JS\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n expr = this.module.createUnreachable();\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n compound = true;\r\n case Token.LESSTHAN_LESSTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n expr = this.module.createBinary(BinaryOp.ShlI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShlI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShlI64\r\n : BinaryOp.ShlI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // must wrap small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n default:\r\n // assumes signed shr on signed small integers does not overflow\r\n expr = this.module.createBinary(BinaryOp.ShrI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.ShrI64, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrI64\r\n : BinaryOp.ShrI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n // assumes unsigned shr on unsigned small integers does not overflow\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.ShrU32, left, right);\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShrU64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType == Type.void\r\n ? Type.u64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // modifies low bits of small integers if unsigned\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n possiblyOverflows = true;\r\n // fall-through\r\n default:\r\n // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = this.module.createBinary(BinaryOp.ShrU32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShrU64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.AMPERSAND_EQUALS:\r\n compound = true;\r\n case Token.AMPERSAND:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.AndI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AndI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AndI64\r\n : BinaryOp.AndI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.BAR_EQUALS:\r\n compound = true;\r\n case Token.BAR:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.OrI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.OrI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.OrI64\r\n : BinaryOp.OrI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.CARET_EQUALS:\r\n compound = true;\r\n case Token.CARET:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.XorI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.XorI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n // logical (no overloading)\r\n\r\n case Token.AMPERSAND_AMPERSAND: // left && right\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false\r\n );\r\n\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER);\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(\r\n condition, // left\r\n right, // ? right\r\n expr // : cloned left\r\n );\r\n }\r\n\r\n // otherwise make use of the temp. local\r\n else {\r\n expr = this.module.createIf(\r\n condition,\r\n right,\r\n this.module.createGetLocal(\r\n assert(tempLocal, \"tempLocal must be set\").index,\r\n this.currentType.toNativeType()\r\n )\r\n );\r\n }\r\n break;\r\n\r\n case Token.BAR_BAR: // left || right\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false\r\n );\r\n\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER); // if right did\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(\r\n condition, // left\r\n expr, // ? cloned left\r\n right // : right\r\n );\r\n }\r\n\r\n // otherwise make use of the temp. local\r\n else {\r\n expr = this.module.createIf(\r\n condition,\r\n this.module.createGetLocal(\r\n assert(tempLocal, \"tempLocal must be set\").index,\r\n this.currentType.toNativeType()\r\n ),\r\n right\r\n );\r\n }\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"not implemented\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER), \"small integer type expected\");\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.left, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n // to compile just the value, we need to know the target's type\r\n var element = resolved.element;\r\n var elementType: Type;\r\n switch (element.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field compiled as a global\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void, \"concrete type expected\");\r\n // fall-through\r\n\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n elementType = (element).type;\r\n break;\r\n\r\n case ElementKind.PROPERTY:\r\n var setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (!setterInstance) return this.module.createUnreachable();\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n elementType = (setterInstance.parameters)[0].type;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == NodeKind.ELEMENTACCESS) { // @operator(\"[]\")\r\n assert(\r\n resolved.target &&\r\n resolved.target.kind == ElementKind.CLASS &&\r\n element.simpleName == (resolved.target).prototype.fnIndexedGet\r\n );\r\n var resolvedIndexedSet = (element).resolve(null);\r\n if (resolvedIndexedSet) {\r\n elementType = resolvedIndexedSet.returnType;\r\n break;\r\n }\r\n }\r\n // fall-through\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // now compile the value and do the assignment\r\n this.currentType = elementType;\r\n return this.compileAssignmentWithValue(\r\n expression,\r\n this.compileExpression(valueExpression, elementType),\r\n contextualType != Type.void\r\n );\r\n }\r\n\r\n compileAssignmentWithValue(\r\n expression: Expression,\r\n valueWithCorrectType: ExpressionRef,\r\n tee: bool = false\r\n ): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n var tempLocal: Local;\r\n var targetExpr: ExpressionRef;\r\n switch (element.kind) {\r\n\r\n case ElementKind.LOCAL:\r\n this.currentType = tee ? (element).type : Type.void;\r\n if ((element).is(ElementFlags.CONSTANT)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return tee\r\n ? this.module.createTeeLocal((element).index, valueWithCorrectType)\r\n : this.module.createSetLocal((element).index, valueWithCorrectType);\r\n\r\n case ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void, \"concrete type expected\");\r\n this.currentType = tee ? (element).type : Type.void;\r\n if ((element).is(ElementFlags.CONSTANT)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range,\r\n (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n if (!tee) {\r\n return this.module.createSetGlobal((element).internalName, valueWithCorrectType);\r\n }\r\n var globalNativeType = (element).type.toNativeType();\r\n return this.module.createBlock(null, [ // emulated teeGlobal\r\n this.module.createSetGlobal((element).internalName, valueWithCorrectType),\r\n this.module.createGetGlobal((element).internalName, globalNativeType)\r\n ], globalNativeType);\r\n\r\n case ElementKind.FIELD:\r\n if ((element).prototype.isReadonly) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n assert(resolved.targetExpression != null, \"target expression expected\");\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType, \"class type expected\");\r\n this.currentType = tee ? (element).type : Type.void;\r\n var elementNativeType = (element).type.toNativeType();\r\n if (!tee) {\r\n return this.module.createStore(\r\n (element).type.size >> 3,\r\n targetExpr,\r\n valueWithCorrectType,\r\n elementNativeType,\r\n (element).memoryOffset\r\n );\r\n }\r\n tempLocal = this.currentFunction.getAndFreeTempLocal((element).type);\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, valueWithCorrectType),\r\n this.module.createStore(\r\n (element).type.size >> 3,\r\n targetExpr,\r\n this.module.createGetLocal(tempLocal.index, elementNativeType),\r\n elementNativeType,\r\n (element).memoryOffset\r\n ),\r\n this.module.createGetLocal(tempLocal.index, elementNativeType)\r\n ], elementNativeType);\r\n\r\n case ElementKind.PROPERTY:\r\n var setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (setterInstance) {\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n if (!tee) {\r\n if (setterInstance.is(ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n this.currentType = Type.void;\r\n return this.makeCall(setterInstance, [ targetExpr, valueWithCorrectType ]);\r\n } else {\r\n this.currentType = Type.void;\r\n return this.makeCall(setterInstance, [ valueWithCorrectType ]);\r\n }\r\n }\r\n var getterPrototype = (element).getterPrototype;\r\n assert(getterPrototype != null);\r\n var getterInstance = (getterPrototype).resolve(); // reports\r\n if (getterInstance) {\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n if (setterInstance.is(ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(getterInstance.returnType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [\r\n this.module.createTeeLocal(tempLocal.index, targetExpr), valueWithCorrectType\r\n ]),\r\n this.makeCall(getterInstance, [\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ])\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n } else {\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [ valueWithCorrectType ]),\r\n this.makeCall(getterInstance)\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n }\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n }\r\n return this.module.createUnreachable();\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == NodeKind.ELEMENTACCESS) { // @operator(\"[]\")\r\n assert(resolved.target && resolved.target.kind == ElementKind.CLASS);\r\n var resolvedIndexedGet = (element).resolve();\r\n if (!resolvedIndexedGet) return this.module.createUnreachable();\r\n var indexedSetName = (resolved.target).prototype.fnIndexedSet;\r\n var indexedSet: Element | null;\r\n if (\r\n indexedSetName != null &&\r\n (resolved.target).members &&\r\n (indexedSet = (>(resolved.target).members).get(indexedSetName)) &&\r\n indexedSet.kind == ElementKind.FUNCTION_PROTOTYPE\r\n ) { // @operator(\"[]=\")\r\n var resolvedIndexedSet = (indexedSet).resolve();\r\n if (!resolvedIndexedSet) return this.module.createUnreachable();\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n var elementExpr = this.compileExpression(\r\n (expression).elementExpression,\r\n Type.i32\r\n );\r\n if (!tee) {\r\n this.currentType = resolvedIndexedSet.returnType;\r\n return this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n this.currentType = resolvedIndexedGet.returnType;\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n this.module.createTeeLocal(tempLocal.index, valueWithCorrectType)\r\n ]),\r\n // TODO: could be different from an actual __get (needs 2 temp locals)\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ], this.currentType.toNativeType());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, (resolved.target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n // fall-through\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression.expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n if (element.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, element.internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n var functionPrototype = element;\r\n var functionInstance: Function | null = null;\r\n\r\n // TODO: generalize?\r\n if (functionPrototype.is(ElementFlags.BUILTIN)) {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (expression.typeArguments) {\r\n var k = expression.typeArguments.length;\r\n resolvedTypeArguments = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var resolvedType = this.program.resolveType( // reports\r\n expression.typeArguments[i],\r\n this.currentFunction.contextualTypeArguments,\r\n true\r\n );\r\n if (!resolvedType) return this.module.createUnreachable();\r\n resolvedTypeArguments[i] = resolvedType;\r\n }\r\n }\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n resolvedTypeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n\r\n // TODO: infer type arguments from parameter types if omitted\r\n functionInstance = functionPrototype.resolveInclTypeArguments( // reports\r\n expression.typeArguments,\r\n this.currentFunction.contextualTypeArguments,\r\n expression\r\n );\r\n if (!functionInstance) return this.module.createUnreachable();\r\n\r\n // TODO: generalize? (see above)\r\n /* if (functionInstance.is(ElementFlags.BUILTIN)) {\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n functionInstance.typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n } */\r\n\r\n var numArguments = expression.arguments.length;\r\n var numArgumentsInclThis = functionInstance.instanceMethodOf\r\n ? numArguments + 1\r\n : numArguments;\r\n var argumentIndex = 0;\r\n\r\n var args = new Array(numArgumentsInclThis);\r\n if (functionInstance.instanceMethodOf) {\r\n assert(resolved.targetExpression != null);\r\n args[argumentIndex++] = resolved.targetExpression;\r\n }\r\n for (i = 0; i < numArguments; ++i) {\r\n args[argumentIndex++] = expression.arguments[i];\r\n }\r\n return this.compileCall(functionInstance, args, expression);\r\n }\r\n\r\n /**\r\n * Compiles a call to a function. If an instance method, `this` is the first element in\r\n * `argumentExpressions` or can be specified explicitly as the last argument.\r\n */\r\n compileCall(\r\n functionInstance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n\r\n // validate and compile arguments\r\n var parameters = functionInstance.parameters;\r\n\r\n var numParameters = parameters ? parameters.length : 0;\r\n var numParametersInclThis = functionInstance.instanceMethodOf != null\r\n ? numParameters + 1\r\n : numParameters;\r\n var numArgumentsInclThis = argumentExpressions.length;\r\n var numArguments = functionInstance.instanceMethodOf != null\r\n ? numArgumentsInclThis - 1\r\n : numArgumentsInclThis;\r\n if (thisArg) numArgumentsInclThis++;\r\n\r\n if (numArgumentsInclThis > numParametersInclThis) { // too many arguments\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, numParameters.toString(10), numArguments.toString(10)\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var operands = new Array(numParametersInclThis);\r\n var operandIndex = 0;\r\n var argumentIndex = 0;\r\n if (functionInstance.instanceMethodOf) {\r\n if (thisArg) {\r\n operands[operandIndex++] = thisArg;\r\n } else {\r\n operands[operandIndex++] = this.compileExpression(\r\n argumentExpressions[argumentIndex++],\r\n functionInstance.instanceMethodOf.type\r\n );\r\n }\r\n }\r\n if (parameters) {\r\n for (; operandIndex < numParametersInclThis; ++operandIndex) {\r\n\r\n // argument has been provided\r\n if (numArgumentsInclThis > operandIndex) {\r\n operands[operandIndex] = this.compileExpression(\r\n argumentExpressions[argumentIndex++],\r\n parameters[operandIndex + numParameters - numParametersInclThis].type\r\n );\r\n\r\n // argument has been omitted\r\n } else {\r\n var initializer = parameters[operandIndex + numParameters - numParametersInclThis].initializer;\r\n if (initializer) { // fall back to provided initializer\r\n operands[operandIndex] = this.compileExpression(\r\n initializer,\r\n parameters[operandIndex + numParameters - numParametersInclThis].type\r\n );\r\n // FIXME: here, the initializer is compiled in the caller's scope.\r\n // a solution could be to use a stub for each possible overload, calling the\r\n // full function with optional arguments being part of the stub's body.\r\n\r\n } else { // too few arguments\r\n this.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range,\r\n (operandIndex + numParameters - numParametersInclThis).toString(10),\r\n numArguments.toString(10)\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.currentType = functionInstance.returnType;\r\n return this.makeCall(functionInstance, operands);\r\n }\r\n\r\n /** Makes a call operation as is. */\r\n makeCall(functionInstance: Function, operands: ExpressionRef[] | null = null): ExpressionRef {\r\n if (!(functionInstance.is(ElementFlags.COMPILED) || this.compileFunction(functionInstance))) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // imported function\r\n if (functionInstance.is(ElementFlags.DECLARED)) {\r\n return this.module.createCallImport(\r\n functionInstance.internalName,\r\n operands,\r\n functionInstance.returnType.toNativeType()\r\n );\r\n }\r\n\r\n // internal function\r\n return this.module.createCall(\r\n functionInstance.internalName,\r\n operands,\r\n functionInstance.returnType.toNativeType()\r\n );\r\n }\r\n\r\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n var expressions = expression.expressions;\r\n var k = expressions.length;\r\n var exprs = new Array(k--);\r\n for (var i = 0; i < k; ++i) {\r\n exprs[i] = this.compileExpression(expressions[i], Type.void); // drop all\r\n }\r\n exprs[i] = this.compileExpression(expressions[i], contextualType); // except last\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n }\r\n\r\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveElementAccess(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n assert(\r\n resolved.element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n resolved.target &&\r\n resolved.target.kind == ElementKind.CLASS\r\n );\r\n var instance = (resolved.element).resolve(\r\n null,\r\n (resolved.target).contextualTypeArguments\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n return this.compileCall(instance, [\r\n expression.expression,\r\n expression.elementExpression\r\n ], expression);\r\n }\r\n\r\n compileIdentifierExpression(expression: IdentifierExpression, contextualType: Type): ExpressionRef {\r\n // check special keywords first\r\n switch (expression.kind) {\r\n\r\n case NodeKind.NULL:\r\n if (this.options.isWasm64) {\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == TypeKind.USIZE);\r\n this.currentType = Type.usize64;\r\n }\r\n return this.module.createI64(0);\r\n }\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == TypeKind.USIZE);\r\n this.currentType = Type.usize32;\r\n }\r\n return this.module.createI32(0);\r\n\r\n case NodeKind.TRUE:\r\n this.currentType = Type.bool;\r\n return this.module.createI32(1);\r\n\r\n case NodeKind.FALSE:\r\n this.currentType = Type.bool;\r\n return this.module.createI32(0);\r\n\r\n case NodeKind.THIS:\r\n if (this.currentFunction.instanceMethodOf) {\r\n this.currentType = this.currentFunction.instanceMethodOf.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n this.currentType = this.options.isWasm64 ? Type.usize64 : Type.usize32;\r\n return this.module.createUnreachable();\r\n\r\n case NodeKind.SUPER:\r\n if (this.currentFunction.instanceMethodOf && this.currentFunction.instanceMethodOf.base) {\r\n this.currentType = this.currentFunction.instanceMethodOf.base.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n this.currentType = this.options.isWasm64 ? Type.usize64 : Type.usize32;\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // otherwise resolve\r\n var resolved = this.program.resolveIdentifier( // reports\r\n expression,\r\n this.currentFunction,\r\n this.currentEnum\r\n );\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n switch (element.kind) {\r\n\r\n case ElementKind.LOCAL:\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n assert((element).index >= 0);\r\n this.currentType = (element).type;\r\n return this.module.createGetLocal((element).index, this.currentType.toNativeType());\r\n\r\n case ElementKind.GLOBAL:\r\n if (element.is(ElementFlags.BUILTIN)) {\r\n return compileBuiltinGetConstant(this, element, expression);\r\n }\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void);\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = (element).type;\r\n return this.module.createGetGlobal((element).internalName, this.currentType.toNativeType());\r\n\r\n case ElementKind.ENUMVALUE: // here: if referenced from within the same enum\r\n if (!element.is(ElementFlags.COMPILED)) {\r\n this.error(\r\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n expression.range\r\n );\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.module.createI32((element).constantValue);\r\n }\r\n return this.module.createGetGlobal((element).internalName, NativeType.I32);\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileLiteralExpression(\r\n expression: LiteralExpression,\r\n contextualType: Type,\r\n implicitNegate: bool = false\r\n ): ExpressionRef {\r\n switch (expression.literalKind) {\r\n\r\n case LiteralKind.ARRAY:\r\n assert(!implicitNegate);\r\n var classType = contextualType.classType;\r\n if (\r\n classType &&\r\n classType == this.program.elements.get(\"Array\") &&\r\n classType.typeArguments && classType.typeArguments.length == 1\r\n ) {\r\n return this.compileStaticArray(\r\n classType.typeArguments[0],\r\n (expression).elementExpressions\r\n );\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n\r\n case LiteralKind.FLOAT: {\r\n var floatValue = (expression).value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == Type.f32) {\r\n return this.module.createF32(floatValue);\r\n }\r\n this.currentType = Type.f64;\r\n return this.module.createF64(floatValue);\r\n }\r\n\r\n case LiteralKind.INTEGER:\r\n var intValue = (expression).value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(\r\n i64_new(0),\r\n intValue\r\n );\r\n }\r\n switch (contextualType.kind) {\r\n\r\n // compile to contextualType if matching\r\n\r\n case TypeKind.I8:\r\n if (i64_is_i8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.I16:\r\n if (i64_is_i16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.I32:\r\n if (i64_is_i32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U8:\r\n if (i64_is_u8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U16:\r\n if (i64_is_u16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U32:\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.BOOL:\r\n if (i64_is_bool(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.USIZE:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.F32:\r\n if (i64_is_f32(intValue)) {\r\n return this.module.createF32(i64_to_f32(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.F64:\r\n if (i64_is_f64(intValue)) {\r\n return this.module.createF64(i64_to_f64(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.VOID:\r\n break;\r\n\r\n default:\r\n assert(false);\r\n break;\r\n }\r\n\r\n // otherwise compile to best fitting native type\r\n\r\n if (i64_is_i32(intValue)) {\r\n this.currentType = Type.i32;\r\n return this.module.createI32(i64_low(intValue));\r\n } else {\r\n this.currentType = Type.i64;\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n }\r\n\r\n case LiteralKind.STRING:\r\n assert(!implicitNegate);\r\n return this.compileStaticString((expression).value);\r\n\r\n // case LiteralKind.OBJECT:\r\n // case LiteralKind.REGEXP:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n compileStaticString(stringValue: string): ExpressionRef {\r\n var stringSegment: MemorySegment | null = this.stringSegments.get(stringValue);\r\n if (!stringSegment) {\r\n var stringLength = stringValue.length;\r\n var stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n stringBuffer[0] = stringLength & 0xff;\r\n stringBuffer[1] = (stringLength >>> 8) & 0xff;\r\n stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n for (var i = 0; i < stringLength; ++i) {\r\n stringBuffer[4 + i * 2] = stringValue.charCodeAt(i) & 0xff;\r\n stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n }\r\n stringSegment = this.addMemorySegment(stringBuffer, this.options.usizeType.byteSize);\r\n this.stringSegments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n this.currentType = this.options.usizeType;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n }\r\n assert(i64_is_i32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n }\r\n\r\n compileStaticArray(elementType: Type, expressions: (Expression | null)[]): ExpressionRef {\r\n // compile as static if all element expressions are precomputable, otherwise\r\n // initialize in place.\r\n var isStatic = true;\r\n var size = expressions.length;\r\n\r\n var nativeType = elementType.toNativeType();\r\n var values: usize;\r\n switch (nativeType) {\r\n\r\n case NativeType.I32:\r\n values = changetype(new Int32Array(size));\r\n break;\r\n\r\n case NativeType.I64:\r\n values = changetype(new Array(size));\r\n break;\r\n\r\n case NativeType.F32:\r\n values = changetype(new Float32Array(size));\r\n break;\r\n\r\n case NativeType.F64:\r\n values = changetype(new Float64Array(size));\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n\r\n var exprs = new Array(size);\r\n var expr: BinaryenExpressionRef;\r\n for (var i = 0; i < size; ++i) {\r\n exprs[i] = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType)\r\n : elementType.toNativeZero(this.module);\r\n if (isStatic) {\r\n expr = this.precomputeExpressionRef(exprs[i]);\r\n if (_BinaryenExpressionGetId(expr) == ExpressionId.Const) {\r\n assert(_BinaryenExpressionGetType(expr) == nativeType);\r\n switch (nativeType) {\r\n\r\n case NativeType.I32:\r\n changetype(values)[i] = _BinaryenConstGetValueI32(expr);\r\n break;\r\n\r\n case NativeType.I64:\r\n changetype(values)[i] = i64_new(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n break;\r\n\r\n case NativeType.F32:\r\n changetype(values)[i] = _BinaryenConstGetValueF32(expr);\r\n break;\r\n\r\n case NativeType.F64:\r\n changetype(values)[i] = _BinaryenConstGetValueF64(expr);\r\n break;\r\n\r\n default:\r\n assert(false); // checked above\r\n }\r\n } else {\r\n // TODO: emit a warning if declared 'const'\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n\r\n if (isStatic) {\r\n // TODO: convert to Uint8Array and create the segment\r\n } else {\r\n // TODO: initialize in place\r\n }\r\n // TODO: alternatively, static elements could go into data segments while\r\n // dynamic ones are initialized on top? any benefits? (doesn't seem so)\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression( // reports\r\n expression.expression,\r\n this.currentFunction\r\n );\r\n if (resolved) {\r\n if (resolved.element.kind == ElementKind.CLASS_PROTOTYPE) {\r\n var prototype = resolved.element;\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n expression.typeArguments,\r\n null,\r\n expression\r\n );\r\n if (instance) {\r\n var thisExpr = compileBuiltinAllocate(this, instance, expression);\r\n var initializers = new Array();\r\n\r\n // use a temp local for 'this'\r\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\r\n initializers.push(this.module.createSetLocal(tempLocal.index, thisExpr));\r\n\r\n // apply field initializers\r\n if (instance.members) {\r\n for (var member of instance.members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n var field = member;\r\n var fieldDeclaration = field.prototype.declaration;\r\n if (field.is(ElementFlags.CONSTANT)) {\r\n assert(false); // there are no built-in fields currently\r\n } else if (fieldDeclaration && fieldDeclaration.initializer) {\r\n initializers.push(this.module.createStore(field.type.byteSize,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\r\n this.compileExpression(fieldDeclaration.initializer, field.type),\r\n field.type.toNativeType(),\r\n field.memoryOffset\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // apply constructor\r\n var constructorInstance = instance.constructorInstance;\r\n if (constructorInstance) {\r\n initializers.push(this.compileCall(constructorInstance, expression.arguments, expression,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType)\r\n ));\r\n }\r\n\r\n // return 'this'\r\n initializers.push(this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType));\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n thisExpr = this.module.createBlock(null, initializers, this.options.nativeSizeType);\r\n\r\n this.currentType = instance.type;\r\n return thisExpr;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n expression.expression.range\r\n );\r\n }\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileParenthesizedExpression(expression: ParenthesizedExpression, contextualType: Type): ExpressionRef {\r\n // does not change types, just order\r\n return this.compileExpression(expression.expression, contextualType, ConversionKind.NONE);\r\n }\r\n\r\n compilePropertyAccessExpression(propertyAccess: PropertyAccessExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n var targetExpr: ExpressionRef;\r\n switch (element.kind) {\r\n\r\n case ElementKind.GLOBAL: // static property\r\n if (element.is(ElementFlags.BUILTIN)) {\r\n return compileBuiltinGetConstant(this, element, propertyAccess);\r\n }\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void);\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = (element).type;\r\n return this.module.createGetGlobal((element).internalName, this.currentType.toNativeType());\r\n\r\n case ElementKind.ENUMVALUE: // enum value\r\n if (!this.compileEnum((element).enum)) {\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.module.createI32((element).constantValue);\r\n }\r\n return this.module.createGetGlobal((element).internalName, NativeType.I32);\r\n\r\n case ElementKind.FIELD: // instance field\r\n assert(resolved.target != null);\r\n assert(resolved.targetExpression != null);\r\n assert((element).memoryOffset >= 0);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.usizeType\r\n );\r\n this.currentType = (element).type;\r\n return this.module.createLoad(\r\n (element).type.size >> 3,\r\n (element).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n targetExpr,\r\n (element).type.toNativeType(),\r\n (element).memoryOffset\r\n );\r\n\r\n case ElementKind.PROPERTY: // instance property (here: getter)\r\n var getter = (element).getterPrototype;\r\n assert(getter != null);\r\n var getterInstance = (getter).resolve(null); // reports\r\n if (!getterInstance) return this.module.createUnreachable();\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n this.currentType = getterInstance.returnType;\r\n if (getterInstance.is(ElementFlags.INSTANCE)) {\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32\r\n );\r\n this.currentType = getterInstance.returnType;\r\n return this.makeCall(getterInstance, [ targetExpr ]);\r\n } else {\r\n return this.makeCall(getterInstance);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n propertyAccess.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n var condition = this.compileExpression(expression.condition, Type.i32);\r\n var ifThen = this.compileExpression(expression.ifThen, contextualType);\r\n var ifElse = this.compileExpression(expression.ifElse, contextualType);\r\n return this.module.createIf(condition, ifThen, ifElse);\r\n }\r\n\r\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n var op: BinaryOp;\r\n var nativeType: NativeType;\r\n var nativeOne: ExpressionRef;\r\n var possiblyOverflows = false;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.PLUS_PLUS:\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n op = BinaryOp.AddI32;\r\n nativeType = NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n op = this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32;\r\n nativeType = this.options.isWasm64\r\n ? NativeType.I64\r\n : NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n op = BinaryOp.AddI64;\r\n nativeType = NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n\r\n case TypeKind.F32:\r\n op = BinaryOp.AddF32;\r\n nativeType = NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n op = BinaryOp.AddF64;\r\n nativeType = NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.MINUS_MINUS:\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n op = BinaryOp.SubI32;\r\n nativeType = NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n op = this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32;\r\n nativeType = this.options.isWasm64\r\n ? NativeType.I64\r\n : NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n op = BinaryOp.SubI64;\r\n nativeType = NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n\r\n case TypeKind.F32:\r\n op = BinaryOp.SubF32;\r\n nativeType = NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n op = BinaryOp.SubF64;\r\n nativeType = NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"unary postfix operator expected\");\r\n }\r\n\r\n var setValue: ExpressionRef;\r\n var tempLocal: Local | null = null;\r\n\r\n // simplify if dropped anyway\r\n if (contextualType == Type.void) {\r\n setValue = this.module.createBinary(op,\r\n getValue,\r\n nativeOne\r\n );\r\n\r\n // otherwise use a temp local for the intermediate value\r\n } else {\r\n tempLocal = this.currentFunction.getTempLocal(this.currentType);\r\n setValue = this.module.createBinary(op,\r\n this.module.createGetLocal(tempLocal.index, nativeType),\r\n nativeOne\r\n );\r\n }\r\n\r\n if (possiblyOverflows) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER));\r\n setValue = makeSmallIntegerWrap(setValue, this.currentType, this.module);\r\n }\r\n\r\n setValue = this.compileAssignmentWithValue(expression.operand, setValue, false);\r\n // ^ sets currentType = void\r\n if (contextualType == Type.void) {\r\n assert(!tempLocal);\r\n return setValue;\r\n }\r\n\r\n this.currentType = assert(tempLocal).type;\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal((tempLocal).index, getValue),\r\n setValue,\r\n this.module.createGetLocal((tempLocal).index, nativeType)\r\n ], nativeType);\r\n }\r\n\r\n compileUnaryPrefixExpression(\r\n expression: UnaryPrefixExpression,\r\n contextualType: Type,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n var possiblyOverflows = false;\r\n var compound = false;\r\n var expr: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.PLUS:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER); // if operand already did\r\n break;\r\n\r\n case Token.MINUS:\r\n if (expression.operand.kind == NodeKind.LITERAL && (\r\n (expression.operand).literalKind == LiteralKind.INTEGER ||\r\n (expression.operand).literalKind == LiteralKind.FLOAT\r\n )) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n this.addDebugLocation(expr, expression.range); // compileExpression normally does this\r\n } else {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.SubI32, this.module.createI32(0), expr);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n this.currentType.toNativeZero(this.module),\r\n expr\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, this.module.createI64(0), expr);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createUnary(UnaryOp.NegF32, expr);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createUnary(UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Token.PLUS_PLUS:\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n expr,\r\n this.currentType.toNativeOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AddI64, expr, this.module.createI64(1));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.AddF32, expr, this.module.createF32(1));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.AddF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.MINUS_MINUS:\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n // fall-through\r\n default:\r\n expr = this.module.createBinary(BinaryOp.SubI32, expr, this.module.createI32(1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n expr,\r\n this.currentType.toNativeOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, expr, this.module.createI64(1));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.SubF32, expr, this.module.createF32(1));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.SubF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.EXCLAMATION:\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // must wrap small integers\r\n );\r\n expr = makeIsFalseish(expr, this.currentType, this.module);\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.TILDE:\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n contextualType == Type.void\r\n ? ConversionKind.NONE\r\n : ConversionKind.IMPLICIT,\r\n false // retains low bits of small integers\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.XorI32, expr, this.module.createI32(-1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n expr,\r\n this.currentType.toNativeNegOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.XorI64, expr, this.module.createI64(-1, -1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.TYPEOF:\r\n // it might make sense to implement typeof in a way that a generic function can detect\r\n // whether its type argument is a class type or string. that could then be used, for\r\n // example, to generate hash codes for sets and maps, depending on the kind of type\r\n // parameter we have. ideally the comparison would not involve actual string comparison and\r\n // limit available operations to hard-coded string literals.\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"not implemented\");\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"unary operator expected\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER));\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n if (this.options.sourceMap != null) {\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) {\r\n source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n }\r\n range.debugInfoRef = expr;\r\n if (!this.currentFunction.debugLocations) this.currentFunction.debugLocations = [];\r\n this.currentFunction.debugLocations.push(range);\r\n }\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n/** Wraps a 32-bit integer expression so it evaluates to a valid value of the specified type. */\r\nexport function makeSmallIntegerWrap(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n case TypeKind.I8:\r\n expr = module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(24)\r\n ),\r\n module.createI32(24)\r\n );\r\n break;\r\n\r\n case TypeKind.I16:\r\n expr = module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(16)\r\n ),\r\n module.createI32(16)\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xff)\r\n );\r\n break;\r\n\r\n case TypeKind.U16:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xffff)\r\n );\r\n break;\r\n\r\n case TypeKind.BOOL:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0x1)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\r\n/** Creates a comparison whether an expression is not 'true' in a broader sense. */\r\nexport function makeIsFalseish(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n default: // any integer up to 32 bits\r\n expr = module.createUnary(UnaryOp.EqzI32, expr);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = module.createUnary(UnaryOp.EqzI64, expr);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: strings\r\n case TypeKind.ISIZE:\r\n expr = module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\r\n/** Creates a comparison whether an expression is 'true' in a broader sense. */\r\nexport function makeIsTrueish(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n default: // any integer up to 32 bits\r\n expr = module.createBinary(BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: strings\r\n case TypeKind.ISIZE:\r\n expr = type.size == 64\r\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n : module.createBinary(BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/compiler.ts","import {\r\n Class,\r\n Function\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionRef,\r\n Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n // signed integers\r\n I8,\r\n I16,\r\n I32,\r\n I64,\r\n ISIZE,\r\n\r\n // unsigned integers\r\n U8,\r\n U16,\r\n U32,\r\n U64,\r\n USIZE,\r\n BOOL, // sic\r\n\r\n // floats\r\n F32,\r\n F64,\r\n\r\n // other\r\n VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n NONE = 0,\r\n /** Is a signed type that can represent negative values. */\r\n SIGNED = 1 << 0,\r\n /** Is an unsigned type that cannot represent negative values. */\r\n UNSIGNED = 1 << 1,\r\n /** Is an integer type. */\r\n INTEGER = 1 << 2,\r\n /** Is a floating point type. */\r\n FLOAT = 1 << 3,\r\n /** Is a sized integer type with a target specific bit size. */\r\n SIZE = 1 << 4,\r\n /** Is a small type that is emulated in a larger type. */\r\n SMALL = 1 << 5,\r\n /** Is a long type larger than 32-bits. */\r\n LONG = 1 << 6,\r\n /** Is a value type. */\r\n VALUE = 1 << 7,\r\n /** Is a reference type. */\r\n REFERENCE = 1 << 8,\r\n /** Is a nullable type. */\r\n NULLABLE = 1 << 9\r\n}\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n /** Type kind. */\r\n kind: TypeKind;\r\n /** Type flags. */\r\n flags: TypeFlags;\r\n /** Size in bits. */\r\n size: u32;\r\n /** Size in bytes. Ceiled to 8-bits. */\r\n byteSize: i32;\r\n /** Underlying class type, if a class type. */\r\n classType: Class | null;\r\n /** Underlying function type, if a function type. */\r\n functionType: Function | null;\r\n /** Respective nullable type, if non-nullable. */\r\n nullableType: Type | null = null;\r\n /** Respective non-nullable type, if nullable. */\r\n nonNullableType: Type;\r\n\r\n /** Constructs a new resolved type. */\r\n constructor(kind: TypeKind, flags: TypeFlags, size: i32) {\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classType = null;\r\n this.nonNullableType = this;\r\n }\r\n\r\n /** Computes the sign-extending shift in the target type. */\r\n computeSmallIntegerShift(targetType: Type): u32 {\r\n return targetType.size - this.size;\r\n }\r\n\r\n /** Computes the truncating mask in the target type. */\r\n computeSmallIntegerMask(targetType: Type): u32 {\r\n return -1 >>> (targetType.size - this.size);\r\n }\r\n\r\n /** Tests if this type has the specified capabilities. */\r\n is(flags: TypeFlags): bool {\r\n return (this.flags & flags) == flags;\r\n }\r\n\r\n /** Tests if this type is a class type. */\r\n get isClass(): bool { return this.classType != null; }\r\n /** Tests if this type is a function type. */\r\n get isFunction(): bool { return this.functionType != null; }\r\n /** Tests if this type is a reference type. */\r\n get isReference(): bool { return this.classType != null || this.functionType != null; }\r\n\r\n /** Composes a class type from this type and a class. */\r\n asClass(classType: Class): Type {\r\n assert(this.kind == TypeKind.USIZE);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.classType = classType;\r\n return ret;\r\n }\r\n\r\n /** Composes a function type from this type and a function. */\r\n asFunction(functionType: Function): Type {\r\n assert(this.kind == TypeKind.USIZE && !this.isReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.functionType = functionType;\r\n return ret;\r\n }\r\n\r\n /** Composes the respective nullable type of this type. */\r\n asNullable(): Type | null {\r\n assert(this.kind == TypeKind.USIZE);\r\n if (!this.nullableType) {\r\n assert(!this.is(TypeFlags.NULLABLE) && this.isReference);\r\n this.nullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n this.nullableType.classType = this.classType;\r\n this.nullableType.functionType = this.functionType;\r\n }\r\n return this.nullableType;\r\n }\r\n\r\n /** Converts this type to its TypeScript representation. */\r\n toString(kindOnly: bool = false): string {\r\n switch (this.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"i64\";\r\n case TypeKind.ISIZE: return \"isize\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n case TypeKind.U64: return \"u64\";\r\n case TypeKind.USIZE:\r\n if (kindOnly) return \"usize\";\r\n return this.classType\r\n ? this.classType.toString()\r\n : this.functionType\r\n ? this.functionType.toTypeString()\r\n : \"usize\";\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.VOID: return \"void\";\r\n default: assert(false); return \"\";\r\n }\r\n }\r\n\r\n // Binaryen specific\r\n\r\n /** Converts this type to its respective native type. */\r\n toNativeType(): NativeType {\r\n switch (this.kind) {\r\n\r\n default:\r\n return NativeType.I32;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return NativeType.I64;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n\r\n case TypeKind.F32:\r\n return NativeType.F32;\r\n\r\n case TypeKind.F64:\r\n return NativeType.F64;\r\n\r\n case TypeKind.VOID:\r\n return NativeType.None;\r\n }\r\n }\r\n\r\n /** Converts this type to its native `0` value. */\r\n toNativeZero(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(0);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(0);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(0);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(0);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(0);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `1` value. */\r\n toNativeOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(1);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(1);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(1);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(1);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(1);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `-1` value. */\r\n toNativeNegOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(-1);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(-1);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(-1, -1);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(-1);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(-1);\r\n }\r\n }\r\n\r\n /** Converts this type to its signature string. */\r\n toSignatureString(): string {\r\n switch (this.kind) {\r\n\r\n default:\r\n return \"i\";\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return \"I\";\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n return this.size == 64 ? \"I\" : \"i\";\r\n\r\n case TypeKind.F32:\r\n return \"f\";\r\n\r\n case TypeKind.F64:\r\n return \"F\";\r\n\r\n case TypeKind.VOID:\r\n return \"v\";\r\n }\r\n }\r\n\r\n // Types\r\n\r\n /** An 8-bit signed integer. */\r\n static readonly i8: Type = new Type(TypeKind.I8,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit signed integer. */\r\n static readonly i16: Type = new Type(TypeKind.I16,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit signed integer. */\r\n static readonly i32: Type = new Type(TypeKind.I32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed integer. */\r\n static readonly i64: Type = new Type(TypeKind.I64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit signed size. WASM32 only. */\r\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed size. WASM64 only. */\r\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** An 8-bit unsigned integer. */\r\n static readonly u8: Type = new Type(TypeKind.U8,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit unsigned integer. */\r\n static readonly u16: Type = new Type(TypeKind.U16,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit unsigned integer. */\r\n static readonly u32: Type = new Type(TypeKind.U32,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned integer. */\r\n static readonly u64: Type = new Type(TypeKind.U64,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 1-bit unsigned integer. */\r\n static readonly bool: Type = new Type(TypeKind.BOOL,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 1\r\n );\r\n\r\n /** A 32-bit float. */\r\n static readonly f32: Type = new Type(TypeKind.F32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit float. */\r\n static readonly f64: Type = new Type(TypeKind.F64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** No return type. */\r\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n var k = types.length;\r\n var ret = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n ret[i] = types[i].toNativeType();\r\n }\r\n return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n var k = types.length;\r\n if (!k) return \"\";\r\n var sb = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n sb[i] = types[i].toString();\r\n }\r\n return sb.join(\", \");\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.ts","import {\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER\r\n} from \"./program\";\r\n\r\nimport {\r\n Token,\r\n Tokenizer,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n normalize as normalizePath,\r\n resolve as resolvePath\r\n} from \"./util/path\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n SOURCE,\r\n\r\n // types\r\n TYPE,\r\n TYPEPARAMETER,\r\n\r\n // expressions\r\n IDENTIFIER,\r\n ASSERTION,\r\n BINARY,\r\n CALL,\r\n COMMA,\r\n ELEMENTACCESS,\r\n FALSE,\r\n LITERAL,\r\n NEW,\r\n NULL,\r\n PARENTHESIZED,\r\n PROPERTYACCESS,\r\n TERNARY,\r\n SUPER,\r\n THIS,\r\n TRUE,\r\n CONSTRUCTOR,\r\n UNARYPOSTFIX,\r\n UNARYPREFIX,\r\n\r\n // statements\r\n BLOCK,\r\n BREAK,\r\n CONTINUE,\r\n DO,\r\n EMPTY,\r\n EXPORT,\r\n EXPORTIMPORT,\r\n EXPRESSION,\r\n FOR,\r\n IF,\r\n IMPORT,\r\n RETURN,\r\n SWITCH,\r\n THROW,\r\n TRY,\r\n VARIABLE,\r\n WHILE,\r\n\r\n // declaration statements\r\n CLASSDECLARATION,\r\n ENUMDECLARATION,\r\n ENUMVALUEDECLARATION,\r\n FIELDDECLARATION,\r\n FUNCTIONDECLARATION,\r\n IMPORTDECLARATION,\r\n INTERFACEDECLARATION,\r\n METHODDECLARATION,\r\n NAMESPACEDECLARATION,\r\n TYPEDECLARATION,\r\n VARIABLEDECLARATION,\r\n\r\n // other\r\n DECORATOR,\r\n EXPORTMEMBER,\r\n MODIFIER,\r\n PARAMETER,\r\n SWITCHCASE\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n /** Node kind indicator. */\r\n kind: NodeKind;\r\n /** Source range. */\r\n range: Range;\r\n /** Parent node. */\r\n parent: Node | null = null;\r\n\r\n // types\r\n\r\n static createType(\r\n identifier: IdentifierExpression,\r\n typeArguments: TypeNode[],\r\n isNullable: bool,\r\n range: Range\r\n ): TypeNode {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = identifier;\r\n type.typeArguments = typeArguments;\r\n type.isNullable = isNullable;\r\n return type;\r\n }\r\n\r\n // expressions\r\n\r\n static createIdentifierExpression(\r\n name: string,\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n }\r\n\r\n static createArrayLiteralExpression(\r\n elements: (Expression | null)[],\r\n range: Range\r\n ): ArrayLiteralExpression {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements; setParentOpt(elements, expr);\r\n return expr;\r\n }\r\n\r\n static createAssertionExpression(\r\n assertionKind: AssertionKind,\r\n expression: Expression,\r\n toType: TypeNode,\r\n range: Range\r\n ): AssertionExpression {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.toType = toType; toType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createBinaryExpression(\r\n operator: Token,\r\n left: Expression,\r\n right: Expression,\r\n range: Range\r\n ): BinaryExpression {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left; left.parent = expr;\r\n expr.right = right; right.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createCallExpression(\r\n expression: Expression,\r\n typeArgs: TypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): CallExpression {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createCommaExpression(\r\n expressions: Expression[],\r\n range: Range\r\n ): CommaExpression {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions; setParent(expressions, expr);\r\n return expr;\r\n }\r\n\r\n static createConstructorExpression(\r\n range: Range\r\n ): ConstructorExpression {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createElementAccessExpression(\r\n expression: Expression,\r\n element: Expression,\r\n range: Range\r\n ): ElementAccessExpression {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.elementExpression = element; element.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createFalseExpression(\r\n range: Range\r\n ): FalseExpression {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createFloatLiteralExpression(\r\n value: f64,\r\n range: Range\r\n ): FloatLiteralExpression {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createIntegerLiteralExpression(\r\n value: I64,\r\n range: Range\r\n ): IntegerLiteralExpression {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createNewExpression(\r\n expression: Expression,\r\n typeArgs: TypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): NewExpression {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createNullExpression(\r\n range: Range\r\n ): NullExpression {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createParenthesizedExpression(\r\n expression: Expression,\r\n range: Range\r\n ): ParenthesizedExpression {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createPropertyAccessExpression(\r\n expression: Expression,\r\n property: IdentifierExpression,\r\n range: Range\r\n ): PropertyAccessExpression {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.property = property; property.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createRegexpLiteralExpression(\r\n pattern: string,\r\n flags: string,\r\n range: Range\r\n ): RegexpLiteralExpression {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n }\r\n\r\n static createTernaryExpression(\r\n condition: Expression,\r\n ifThen: Expression,\r\n ifElse: Expression,\r\n range: Range\r\n ): TernaryExpression {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition; condition.parent = expr;\r\n expr.ifThen = ifThen; ifThen.parent = expr;\r\n expr.ifElse = ifElse; ifElse.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createStringLiteralExpression(\r\n value: string,\r\n range: Range\r\n ): StringLiteralExpression {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createSuperExpression(\r\n range: Range\r\n ): SuperExpression {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createThisExpression(\r\n range: Range\r\n ): ThisExpression {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createTrueExpression(\r\n range: Range\r\n ): TrueExpression {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createUnaryPostfixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPostfixExpression {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createUnaryPrefixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPrefixExpression {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n // statements\r\n\r\n static createBlockStatement(\r\n statements: Statement[],\r\n range: Range\r\n ): BlockStatement {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createBreakStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): BreakStatement {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createClassDeclaration(\r\n identifier: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n extendsType: TypeNode | null,\r\n implementsTypes: TypeNode[],\r\n members: DeclarationStatement[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): ClassDeclaration {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.name = identifier; identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes; setParent(implementsTypes, stmt);\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createContinueStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): ContinueStatement {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createDecorator(\r\n expression: Expression,\r\n args: Expression[] | null,\r\n range: Range\r\n ): Decorator {\r\n var stmt = new Decorator();\r\n stmt.range = range;\r\n stmt.name = expression; expression.parent = stmt;\r\n stmt.arguments = args; if (args) setParent(args, stmt);\r\n if (expression.kind == NodeKind.IDENTIFIER) {\r\n switch ((expression).text) {\r\n case \"global\": stmt.decoratorKind = DecoratorKind.GLOBAL; break;\r\n case \"operator\": stmt.decoratorKind = DecoratorKind.OPERATOR; break;\r\n case \"unmanaged\": stmt.decoratorKind = DecoratorKind.UNMANAGED; break;\r\n case \"offset\": stmt.decoratorKind = DecoratorKind.OFFSET; break;\r\n default: stmt.decoratorKind = DecoratorKind.CUSTOM; break;\r\n }\r\n } else {\r\n stmt.decoratorKind = DecoratorKind.CUSTOM;\r\n }\r\n return stmt;\r\n }\r\n\r\n static createDoStatement(\r\n statement: Statement,\r\n condition: Expression,\r\n range: Range\r\n ): DoStatement {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement; statement.parent = stmt;\r\n stmt.condition = condition; condition.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createEmptyStatement(\r\n range: Range\r\n ): EmptyStatement {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n }\r\n\r\n static createEnumDeclaration(\r\n name: IdentifierExpression,\r\n members: EnumValueDeclaration[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): EnumDeclaration {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.values = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createEnumValueDeclaration(\r\n name: IdentifierExpression,\r\n value: Expression | null,\r\n range: Range\r\n ): EnumValueDeclaration {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportStatement(\r\n members: ExportMember[],\r\n path: StringLiteralExpression | null,\r\n modifiers: Modifier[] | null,\r\n range: Range\r\n ): ExportStatement {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n } else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n return stmt;\r\n }\r\n\r\n static createExportImportStatement(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression,\r\n range: Range\r\n ): ExportImportStatement {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.externalName = externalName; externalName.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportMember(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression | null,\r\n range: Range\r\n ): ExportMember {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n } else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n }\r\n\r\n static createExpressionStatement(\r\n expression: Expression\r\n ): ExpressionStatement {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression; expression.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createIfStatement(\r\n condition: Expression,\r\n ifTrue: Statement,\r\n ifFalse: Statement | null,\r\n range: Range\r\n ): IfStatement {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createImportStatement(\r\n decls: ImportDeclaration[] | null,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportStatementWithWildcard(\r\n identifier: IdentifierExpression,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = resolvePath(\r\n normalizePath(path.value),\r\n range.source.normalizedPath\r\n );\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportDeclaration(\r\n externalName: IdentifierExpression,\r\n name: IdentifierExpression | null,\r\n range: Range\r\n ): ImportDeclaration {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName; externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n } else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n }\r\n\r\n static createInterfaceDeclaration(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n members: DeclarationStatement[],\r\n modifiers: Modifier[] | null,\r\n range: Range\r\n ): InterfaceDeclaration {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n return stmt;\r\n }\r\n\r\n static createFieldDeclaration(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): FieldDeclaration {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.type = type; if (type) type.parent = stmt;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createForStatement(\r\n initializer: Statement | null,\r\n condition: Expression | null,\r\n incrementor: Expression | null,\r\n statement: Statement,\r\n range: Range\r\n ): ForStatement {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.condition = condition; if (condition) condition.parent = stmt;\r\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTypeParameter(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n range: Range\r\n ): TypeParameter {\r\n var elem = new TypeParameter();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createParameter(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n kind: ParameterKind,\r\n range: Range\r\n ): Parameter {\r\n var elem = new Parameter();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n }\r\n\r\n static createFunctionDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n parameters: Parameter[],\r\n returnType: TypeNode | null,\r\n statements: Statement[] | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): FunctionDeclaration {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.parameters = parameters; setParent(parameters, stmt);\r\n stmt.returnType = returnType; if (returnType) returnType.parent = stmt;\r\n stmt.statements = statements; if (statements) setParent(statements, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createMethodDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n parameters: Parameter[],\r\n returnType: TypeNode | null,\r\n statements: Statement[] | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): MethodDeclaration {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.parameters = parameters; setParent(parameters, stmt);\r\n stmt.returnType = returnType; if (returnType) returnType.parent = stmt;\r\n stmt.statements = statements; if (statements) setParent(statements, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createModifier(kind: ModifierKind, range: Range): Modifier {\r\n var elem = new Modifier();\r\n elem.range = range;\r\n elem.modifierKind = kind;\r\n return elem;\r\n }\r\n\r\n static createNamespaceDeclaration(\r\n name: IdentifierExpression,\r\n members: Statement[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): NamespaceDeclaration {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createReturnStatement(\r\n value: Expression | null,\r\n range: Range\r\n ): ReturnStatement {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createSwitchStatement(\r\n condition: Expression,\r\n cases: SwitchCase[],\r\n range: Range\r\n ): SwitchStatement {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.cases = cases; setParent(cases, stmt);\r\n return stmt;\r\n }\r\n\r\n static createSwitchCase(\r\n label: Expression | null,\r\n statements: Statement[],\r\n range: Range\r\n ): SwitchCase {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label; if (label) label.parent = elem;\r\n elem.statements = statements; setParent(statements, elem);\r\n return elem;\r\n }\r\n\r\n static createThrowStatement(\r\n value: Expression,\r\n range: Range\r\n ): ThrowStatement {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value; value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTryStatement(\r\n statements: Statement[],\r\n catchVariable: IdentifierExpression | null,\r\n catchStatements: Statement[] | null,\r\n finallyStatements: Statement[] | null,\r\n range: Range\r\n ): TryStatement {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable) catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements) setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements) setParent(finallyStatements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createTypeDeclaration(\r\n name: IdentifierExpression,\r\n alias: TypeNode,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): TypeDeclaration {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.alias = alias; alias.parent = stmt;\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableStatement(\r\n declarations: VariableDeclaration[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): VariableStatement {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.declarations = declarations; setParent(declarations, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableDeclaration(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): VariableDeclaration {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.modifiers = modifiers; // inherited from parent VariableStatement\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n }\r\n\r\n static createWhileStatement(\r\n condition: Expression,\r\n statement: Statement,\r\n range: Range\r\n ): WhileStatement {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n}\r\n\r\n// types\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends Node {\r\n kind = NodeKind.TYPE;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Type argument references. */\r\n typeArguments: TypeNode[];\r\n /** Whether nullable or not. */\r\n isNullable: bool;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameter extends Node {\r\n kind = NodeKind.TYPEPARAMETER;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Extended type reference, if any. */\r\n extendsType: TypeNode | null;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n kind = NodeKind.IDENTIFIER;\r\n\r\n /** Textual name. */\r\n text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport const enum LiteralKind {\r\n FLOAT,\r\n INTEGER,\r\n STRING,\r\n REGEXP,\r\n ARRAY,\r\n OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n kind = NodeKind.LITERAL;\r\n\r\n /** Specific literal kind. */\r\n literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.ARRAY;\r\n\r\n /** Nested element expressions. */\r\n elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport const enum AssertionKind {\r\n PREFIX,\r\n AS\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n kind = NodeKind.ASSERTION;\r\n\r\n /** Specific kind of this assertion. */\r\n assertionKind: AssertionKind;\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Target type. */\r\n toType: TypeNode;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n kind = NodeKind.BINARY;\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Left-hand side expression */\r\n left: Expression;\r\n /** Right-hand side expression. */\r\n right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n kind = NodeKind.CALL;\r\n\r\n /** Called expression. Usually an identifier or property access expression. */\r\n expression: Expression;\r\n /** Provided type arguments. */\r\n typeArguments: TypeNode[] | null;\r\n /** Provided arguments. */\r\n arguments: Expression[];\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n kind = NodeKind.COMMA;\r\n\r\n /** Sequential expressions. */\r\n expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n kind = NodeKind.CONSTRUCTOR;\r\n text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n kind = NodeKind.ELEMENTACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Element of the expression being accessed. */\r\n elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.FLOAT;\r\n\r\n /** Float value. */\r\n value: f64;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.INTEGER;\r\n\r\n /** Integer value. */\r\n value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n kind = NodeKind.NULL;\r\n text = \"null\";\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n kind = NodeKind.PARENTHESIZED;\r\n\r\n /** Expression in parenthesis. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n kind = NodeKind.PROPERTYACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Property of the expression being accessed. */\r\n property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.REGEXP;\r\n\r\n /** Regular expression pattern. */\r\n pattern: string;\r\n /** Regular expression flags. */\r\n patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n kind = NodeKind.TERNARY;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Expression executed when condition is `true`. */\r\n ifThen: Expression;\r\n /** Expression executed when condition is `false`. */\r\n ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.STRING;\r\n\r\n /** String value without quotes. */\r\n value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n kind = NodeKind.SUPER;\r\n text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n kind = NodeKind.THIS;\r\n text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n kind = NodeKind.TRUE;\r\n text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n kind = NodeKind.FALSE;\r\n text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Operand expression. */\r\n operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\n/** Indicates the specific kind of a modifier. */\r\nexport enum ModifierKind {\r\n ASYNC,\r\n CONST,\r\n LET,\r\n DECLARE,\r\n EXPORT,\r\n IMPORT,\r\n STATIC,\r\n ABSTRACT,\r\n PUBLIC,\r\n PRIVATE,\r\n PROTECTED,\r\n READONLY,\r\n GET,\r\n SET,\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n /** Default source. Usually imported from an entry file. */\r\n DEFAULT,\r\n /** Entry file. */\r\n ENTRY,\r\n /** Library file. */\r\n LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n kind = NodeKind.SOURCE;\r\n parent = null;\r\n\r\n /** Source kind. */\r\n sourceKind: SourceKind;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Path used internally. */\r\n internalPath: string;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Full source text. */\r\n text: string;\r\n /** Tokenizer reference. */\r\n tokenizer: Tokenizer | null = null;\r\n /** Source map index. */\r\n debugInfoIndex: i32 = -1;\r\n\r\n /** Constructs a new source node. */\r\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n super();\r\n this.sourceKind = kind;\r\n this.normalizedPath = normalizedPath;\r\n this.internalPath = mangleInternalPath(this.normalizedPath);\r\n this.statements = new Array();\r\n this.range = new Range(this, 0, text.length);\r\n this.text = text;\r\n }\r\n\r\n /** Tests if this source is an entry file. */\r\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n /** Tests if this source is a stdlib file. */\r\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n /** Simple name being declared. */\r\n name: IdentifierExpression;\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of decorators. */\r\n decorators: Decorator[] | null = null;\r\n\r\n protected cachedProgramLevelInternalName: string | null = null;\r\n protected cachedFileLevelInternalName: string | null = null;\r\n\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get programLevelInternalName(): string {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n }\r\n\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get fileLevelInternalName(): string {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n }\r\n\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get isTopLevel(): bool {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n }\r\n\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get isTopLevelExport(): bool {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return (\r\n hasModifier(ModifierKind.EXPORT, this.modifiers) &&\r\n (parent).isTopLevelExport\r\n );\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return (\r\n hasModifier(ModifierKind.STATIC, this.modifiers) &&\r\n (parent).isTopLevelExport\r\n );\r\n }\r\n return (\r\n parent.kind == NodeKind.SOURCE &&\r\n hasModifier(ModifierKind.EXPORT, this.modifiers)\r\n );\r\n }\r\n\r\n /** Tests if this declaration needs an explicit export. */\r\n needsExplicitExport(member: ExportMember): bool {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (\r\n member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n }\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n /** Variable type. */\r\n type: TypeNode | null;\r\n /** Variable initializer. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n kind = NodeKind.BLOCK;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n kind = NodeKind.BREAK;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n kind = NodeKind.CLASSDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameter[];\r\n /** Base class type being extended. */\r\n extendsType: TypeNode | null;\r\n /** Interface types being implemented. */\r\n implementsTypes: TypeNode[];\r\n /** Class member declarations. */\r\n members: DeclarationStatement[];\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n kind = NodeKind.CONTINUE;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Built-in decorator kinds. */\r\nexport const enum DecoratorKind {\r\n CUSTOM,\r\n GLOBAL,\r\n OPERATOR,\r\n UNMANAGED,\r\n OFFSET\r\n}\r\n\r\n/** Depresents a decorator. */\r\nexport class Decorator extends Statement {\r\n kind = NodeKind.DECORATOR;\r\n\r\n /** Name expression. */\r\n name: Expression;\r\n /** Argument expressions. */\r\n arguments: Expression[] | null;\r\n /** Built-in kind, if applicable. */\r\n decoratorKind: DecoratorKind;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n kind = NodeKind.DO;\r\n\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n /** Condition when to repeat. */\r\n condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMDECLARATION;\r\n\r\n /** Enum value declarations. */\r\n values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMVALUEDECLARATION;\r\n modifiers = null;\r\n // name is inherited\r\n\r\n /** Value expression. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n kind = NodeKind.EXPORTIMPORT;\r\n\r\n /** Identifier being imported. */\r\n name: IdentifierExpression;\r\n /** Identifier being exported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n kind = NodeKind.EXPORTMEMBER;\r\n\r\n /** Identifier being exported. */\r\n name: IdentifierExpression;\r\n /** Identifier seen when imported again. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n kind = NodeKind.EXPORT;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of members. */\r\n members: ExportMember[];\r\n /** Path being exported from, if applicable. */\r\n path: StringLiteralExpression | null;\r\n /** Normalized path, if `path` is set. */\r\n normalizedPath: string | null;\r\n /** Mangled internal path being referenced, if `path` is set. */\r\n internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n kind = NodeKind.EXPRESSION;\r\n\r\n /** Expression being used as a statement.*/\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.FIELDDECLARATION;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n kind = NodeKind.FOR;\r\n\r\n /**\r\n * Initializer statement, if present.\r\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n */\r\n initializer: Statement | null;\r\n /** Condition expression, if present. */\r\n condition: Expression | null;\r\n /** Incrementor expression, if present. */\r\n incrementor: Expression | null;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameter[];\r\n /** Accepted parameters. */\r\n parameters: Parameter[];\r\n /** Return type. */\r\n returnType: TypeNode | null;\r\n /** Contained statements. */\r\n statements: Statement[] | null;\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n kind = NodeKind.IF;\r\n\r\n /** Condition. */\r\n condition: Expression;\r\n /** Statement executed when condition is `true`. */\r\n ifTrue: Statement;\r\n /** Statement executed when condition is `false`. */\r\n ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n kind = NodeKind.IMPORTDECLARATION;\r\n modifiers = null;\r\n\r\n /** Identifier being imported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n kind = NodeKind.IMPORT;\r\n\r\n /** Array of member declarations or `null` if an asterisk import. */\r\n declarations: ImportDeclaration[] | null;\r\n /** Name of the local namespace, if an asterisk import. */\r\n namespaceName: IdentifierExpression | null;\r\n /** Path being imported from. */\r\n path: StringLiteralExpression;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Mangled internal path being referenced. */\r\n internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n /** Array of namespace members. */\r\n members: Statement[];\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n /** No specific flags. */\r\n DEFAULT,\r\n /** Is an optional parameter. */\r\n OPTIONAL,\r\n /** Is a rest parameter. */\r\n REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class Parameter extends Node {\r\n kind = NodeKind.PARAMETER;\r\n\r\n /** Parameter name. */\r\n name: IdentifierExpression;\r\n /** Parameter type. */\r\n type: TypeNode | null;\r\n /** Parameter kind. */\r\n parameterKind: ParameterKind;\r\n /** Initializer expression, if present. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a single modifier. */\r\nexport class Modifier extends Node {\r\n kind = NodeKind.MODIFIER;\r\n\r\n /** Specific modifier kind. */\r\n modifierKind: ModifierKind;\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n kind = NodeKind.RETURN;\r\n\r\n /** Value expression being returned, if present. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n kind = NodeKind.SWITCHCASE;\r\n\r\n /** Label expression. `null` indicates the default case. */\r\n label: Expression | null;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n kind = NodeKind.SWITCH;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Contained cases. */\r\n cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n kind = NodeKind.THROW;\r\n\r\n /** Value expression being thrown. */\r\n value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n kind = NodeKind.TRY;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Exception variable name, if a `catch` clause is present. */\r\n catchVariable: IdentifierExpression | null;\r\n /** Statements being executed on catch, if a `catch` clause is present. */\r\n catchStatements: Statement[] | null;\r\n /** Statements being executed afterwards, if a `finally` clause is present. */\r\n finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n kind = NodeKind.TYPEDECLARATION;\r\n\r\n /** Type being aliased. */\r\n alias: TypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.VARIABLEDECLARATION;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n kind = NodeKind.VARIABLE;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of decorators. */\r\n decorators: Decorator[] | null;\r\n /** Array of member declarations. */\r\n declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n kind = NodeKind.WHILE;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Cached unused modifiers for reuse. */\r\nvar reusableModifiers: Modifier[] | null = null;\r\n\r\nexport function setReusableModifiers(modifiers: Modifier[]): void {\r\n reusableModifiers = modifiers;\r\n}\r\n\r\n/** Creates a new modifiers array. */\r\nexport function createModifiers(): Modifier[] {\r\n var ret: Modifier[];\r\n if (reusableModifiers != null) {\r\n ret = reusableModifiers;\r\n reusableModifiers = null;\r\n } else {\r\n ret = [];\r\n }\r\n ret.length = 0;\r\n return ret;\r\n}\r\n\r\n// Utility\r\n\r\n/** Adds a modifier to a set of modifiers. Creates a new set if `null`. */\r\nexport function addModifier(modifier: Modifier, modifiers: Modifier[] | null): Modifier[] {\r\n if (modifiers == null) modifiers = createModifiers();\r\n modifiers.push(modifier);\r\n return modifiers;\r\n}\r\n\r\n/** Gets a specific modifier from the specified set of modifiers. */\r\nexport function getModifier(kind: ModifierKind, modifiers: Modifier[] | null): Modifier | null {\r\n if (modifiers) {\r\n for (var i = 0, k = modifiers.length; i < k; ++i) {\r\n if (modifiers[i].modifierKind == kind) {\r\n return modifiers[i];\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Tests whether a modifier exists in the specified set of modifiers. */\r\nexport function hasModifier(kind: ModifierKind, modifiers: Modifier[] | null): bool {\r\n return getModifier(kind, modifiers) != null;\r\n}\r\n\r\n/** Gets the first decorator by name within at set of decorators, if present. */\r\nexport function getFirstDecorator(name: string, decorators: Decorator[] | null): Decorator | null {\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n var expression = decorator.name;\r\n if (expression.kind == NodeKind.IDENTIFIER && (expression).text == name) {\r\n return decorator;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Tests if a specific decorator is present within the specified decorators. */\r\nexport function hasDecorator(name: string, decorators: Decorator[] | null): bool {\r\n return getFirstDecorator(name, decorators) != null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent) return name;\r\n if (\r\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE\r\n ) { // skip over\r\n if (!(parent = parent.parent)) return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (\r\n hasModifier(ModifierKind.STATIC, declaration.modifiers)\r\n ? STATIC_DELIMITER\r\n : INSTANCE_DELIMITER\r\n ) + name;\r\n }\r\n if (\r\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION\r\n ) {\r\n return mangleInternalName(parent, asGlobal) +\r\n STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\n\r\n// Helpers\r\n\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\n\r\nfunction setParentOpt(nodes: (Node | null)[], parent: Node): void {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n var node = nodes[i];\r\n if (node) node.parent = parent;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/ast.ts","/*\r\n\r\n This is a modified version of TypeScript's scanner that doesn't perform as much bookkeeping, simply\r\n skips over trivia and provides a more general mark/reset mechanism for the parser to utilize on\r\n ambiguous tokens.\r\n\r\n next() advances the token\r\n peek() peeks for the next token\r\n skip(token) skips over a token if possible\r\n mark() marks at current token\r\n reset() resets to marked state\r\n range() gets the range of the current token\r\n\r\n readFloat() on FLOATLITERAL\r\n readIdentifier() on IDENTIFIER\r\n readInteger() on INTEGERLITERAL\r\n readString() on STRINGLITERAL\r\n\r\n*/\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Source\r\n} from \"./ast\";\r\n\r\nimport {\r\n CharCode,\r\n isLineBreak,\r\n isWhiteSpace,\r\n isIdentifierStart,\r\n isIdentifierPart,\r\n isDecimalDigit,\r\n isOctalDigit,\r\n isKeywordCharacter\r\n} from \"./util/charcode\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n ABSTRACT,\r\n AS,\r\n ASYNC,\r\n AWAIT, // ES2017\r\n BREAK, // ES2017\r\n CASE, // ES2017\r\n CATCH, // ES2017\r\n CLASS, // ES2017\r\n CONST, // ES2017\r\n CONTINUE, // ES2017\r\n CONSTRUCTOR,\r\n DEBUGGER, // ES2017\r\n DECLARE,\r\n DEFAULT, // ES2017\r\n DELETE, // ES2017\r\n DO, // ES2017\r\n ELSE, // ES2017\r\n ENUM, // ES2017 future\r\n EXPORT, // ES2017\r\n EXTENDS, // ES2017\r\n FALSE, // ES\r\n FINALLY, // ES2017\r\n FOR, // ES2017\r\n FROM, // AS possible identifier\r\n FUNCTION, // ES2017\r\n GET,\r\n IF, // ES2017\r\n IMPLEMENTS, // ES2017 non-lexical\r\n IMPORT, // ES2017\r\n IN, // ES2017\r\n INSTANCEOF, // ES2017\r\n INTERFACE, // ES2017 non-lexical\r\n IS,\r\n KEYOF,\r\n LET, // ES2017 non-lexical\r\n MODULE, // AS possible identifier\r\n NAMESPACE, // AS possible identifier\r\n NEW, // ES2017\r\n NULL, // ES\r\n OF,\r\n PACKAGE, // ES2017 non-lexical\r\n PRIVATE, // ES2017 non-lexical\r\n PROTECTED, // ES2017 non-lexical\r\n PUBLIC, // ES2017 non-lexical\r\n READONLY,\r\n RETURN, // ES2017\r\n SET,\r\n STATIC, // ES2017 non-lexical\r\n SUPER, // ES2017\r\n SWITCH, // ES2017\r\n THIS, // ES2017\r\n THROW, // ES2017\r\n TRUE, // ES\r\n TRY, // ES2017\r\n TYPE, // AS possible identifier\r\n TYPEOF, // ES2017\r\n VAR, // ES2017\r\n VOID, // ES2017\r\n WHILE, // ES2017\r\n WITH, // ES2017\r\n YIELD, // ES2017\r\n\r\n // punctuation\r\n\r\n OPENBRACE,\r\n CLOSEBRACE,\r\n OPENPAREN,\r\n CLOSEPAREN,\r\n OPENBRACKET,\r\n CLOSEBRACKET,\r\n DOT,\r\n DOT_DOT_DOT,\r\n SEMICOLON,\r\n COMMA,\r\n LESSTHAN,\r\n GREATERTHAN,\r\n LESSTHAN_EQUALS,\r\n GREATERTHAN_EQUALS,\r\n EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS,\r\n EQUALS_EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS_EQUALS,\r\n EQUALS_GREATERTHAN,\r\n PLUS,\r\n MINUS,\r\n ASTERISK_ASTERISK,\r\n ASTERISK,\r\n SLASH,\r\n PERCENT,\r\n PLUS_PLUS,\r\n MINUS_MINUS,\r\n LESSTHAN_LESSTHAN,\r\n GREATERTHAN_GREATERTHAN,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n AMPERSAND,\r\n BAR,\r\n CARET,\r\n EXCLAMATION,\r\n TILDE,\r\n AMPERSAND_AMPERSAND,\r\n BAR_BAR,\r\n QUESTION,\r\n COLON,\r\n EQUALS,\r\n PLUS_EQUALS,\r\n MINUS_EQUALS,\r\n ASTERISK_EQUALS,\r\n ASTERISK_ASTERISK_EQUALS,\r\n SLASH_EQUALS,\r\n PERCENT_EQUALS,\r\n LESSTHAN_LESSTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n AMPERSAND_EQUALS,\r\n BAR_EQUALS,\r\n CARET_EQUALS,\r\n AT,\r\n\r\n // literals\r\n\r\n IDENTIFIER,\r\n STRINGLITERAL,\r\n INTEGERLITERAL,\r\n FLOATLITERAL,\r\n\r\n // meta\r\n\r\n INVALID,\r\n ENDOFFILE\r\n}\r\n\r\nexport namespace Token {\r\n\r\n export function fromKeyword(text: string): Token {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n case \"break\": return Token.BREAK;\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n case \"get\": return Token.GET;\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n case \"keyof\": return Token.KEYOF;\r\n case \"let\": return Token.LET;\r\n case \"module\": return Token.MODULE;\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n case \"of\": return Token.OF;\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n case \"yield\": return Token.YIELD;\r\n default: return Token.INVALID;\r\n }\r\n }\r\n\r\n export function isAlsoIdentifier(token: Token): bool {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nexport class Range {\r\n\r\n source: Source;\r\n start: i32;\r\n end: i32;\r\n\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n\r\n constructor(source: Source, start: i32, end: i32) {\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n\r\n static join(a: Range, b: Range): Range {\r\n if (a.source != b.source) throw new Error(\"source mismatch\");\r\n return new Range(a.source,\r\n a.start < b.start ? a.start : b.start,\r\n a.end > b.end ? a.end : b.end\r\n );\r\n }\r\n\r\n get atStart(): Range {\r\n return new Range(this.source, this.start, this.start);\r\n }\r\n get atEnd(): Range {\r\n return new Range(this.source, this.end, this.end);\r\n }\r\n\r\n get line(): i32 {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var line = 1;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) {\r\n line++;\r\n }\r\n }\r\n return line;\r\n }\r\n\r\n get column(): i32 {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var column = 0;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n column++;\r\n }\r\n return column;\r\n }\r\n\r\n toString(): string {\r\n return this.source.text.substring(this.start, this.end);\r\n }\r\n\r\n debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n source: Source;\r\n end: i32 = 0;\r\n\r\n pos: i32 = 0;\r\n token: Token = -1;\r\n tokenPos: i32 = 0;\r\n\r\n markedPos: i32 = 0;\r\n markedToken: Token = -1;\r\n markedTokenPos: i32 = 0;\r\n\r\n nextToken: Token = -1;\r\n nextTokenOnNewLine: bool = false;\r\n\r\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.source = source;\r\n this.pos = 0;\r\n this.end = source.text.length;\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n var text = source.text;\r\n\r\n // skip bom\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n ) {\r\n ++this.pos;\r\n }\r\n\r\n // skip shebang\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.HASH &&\r\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n ) {\r\n this.pos += 2;\r\n while (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n }\r\n\r\n next(preferIdentifier: bool = false): Token {\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(preferIdentifier);\r\n }\r\n\r\n private unsafeNext(preferIdentifier: bool = false, maxTokenLength: i32 = i32.MAX_VALUE): Token {\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n var c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n\r\n case CharCode.CARRIAGERETURN:\r\n if (\r\n ++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n break;\r\n\r\n case CharCode.LINEFEED:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.SPACE:\r\n ++this.pos;\r\n break;\r\n\r\n case CharCode.EXCLAMATION:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n\r\n case CharCode.DOUBLEQUOTE:\r\n case CharCode.SINGLEQUOTE:\r\n case CharCode.BACKTICK: // TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n\r\n case CharCode.PERCENT:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n\r\n case CharCode.AMPERSAND:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n\r\n case CharCode.OPENPAREN:\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n\r\n case CharCode.CLOSEPAREN:\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n\r\n case CharCode.ASTERISK:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n\r\n case CharCode.PLUS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n\r\n case CharCode.COMMA:\r\n ++this.pos;\r\n return Token.COMMA;\r\n\r\n case CharCode.MINUS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n\r\n case CharCode.DOT:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (\r\n maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.DOT &&\r\n text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n ) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n\r\n case CharCode.SLASH:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n // TODO: triple-slash?\r\n // if (\r\n // this.pos + 1 < this.end &&\r\n // text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n // ) {\r\n // }\r\n while (++this.pos < this.end) {\r\n if (isLineBreak(text.charCodeAt(this.pos))) break;\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n var closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (\r\n c == CharCode.ASTERISK &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n this.range(this.pos), \"*/\"\r\n );\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n\r\n case CharCode._0:\r\n case CharCode._1:\r\n case CharCode._2:\r\n case CharCode._3:\r\n case CharCode._4:\r\n case CharCode._5:\r\n case CharCode._6:\r\n case CharCode._7:\r\n case CharCode._8:\r\n case CharCode._9:\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n\r\n case CharCode.COLON:\r\n ++this.pos;\r\n return Token.COLON;\r\n\r\n case CharCode.SEMICOLON:\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n\r\n case CharCode.LESSTHAN:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n\r\n case CharCode.EQUALS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n\r\n case CharCode.GREATERTHAN:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n\r\n case CharCode.QUESTION:\r\n ++this.pos;\r\n return Token.QUESTION;\r\n\r\n case CharCode.OPENBRACKET:\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n\r\n case CharCode.CLOSEBRACKET:\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n\r\n case CharCode.CARET:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n\r\n case CharCode.OPENBRACE:\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n\r\n case CharCode.BAR:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n\r\n case CharCode.CLOSEBRACE:\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n\r\n case CharCode.TILDE:\r\n ++this.pos;\r\n return Token.TILDE;\r\n\r\n case CharCode.AT:\r\n ++this.pos;\r\n return Token.AT;\r\n\r\n default:\r\n if (isIdentifierStart(c)) {\r\n if (isKeywordCharacter(c)) {\r\n var posBefore = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(c = text.charCodeAt(this.pos))\r\n ) {\r\n if (!isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n var keywordText = text.substring(posBefore, this.pos);\r\n var keywordToken = Token.fromKeyword(keywordText);\r\n if (\r\n keywordToken != Token.INVALID &&\r\n !(preferIdentifier && Token.isAlsoIdentifier(keywordToken))\r\n ) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n } else if (isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Invalid_character,\r\n this.range(this.pos, this.pos + 1)\r\n );\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n }\r\n\r\n peek(\r\n checkOnNewLine: bool = false,\r\n preferIdentifier: bool = false,\r\n maxCompoundLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(preferIdentifier, maxCompoundLength);\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n while (--this.tokenPos > posBefore) {\r\n if (isLineBreak(text.charCodeAt(this.tokenPos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n }\r\n\r\n skip(token: Token): bool {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN: // where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n this.token = this.unsafeNext(token == Token.IDENTIFIER, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n } else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n }\r\n\r\n // skipUntil(token1: Token, token2: Token = -1): bool {\r\n // var next: Token;\r\n // do {\r\n // if ((next = this.peek()) == Token.ENDOFFILE)\r\n // return false;\r\n // if (next == token1 || next == token2)\r\n // return true;\r\n // this.next();\r\n // } while (true);\r\n // }\r\n\r\n mark(): void {\r\n this.markedPos = this.pos;\r\n this.markedToken = this.token;\r\n this.markedTokenPos = this.tokenPos;\r\n }\r\n\r\n reset(): void {\r\n this.pos = this.markedPos;\r\n this.token = this.markedToken;\r\n this.tokenPos = this.markedTokenPos;\r\n this.nextToken = -1;\r\n }\r\n\r\n range(start: i32 = -1, end: i32 = -1): Range {\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n } else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n }\r\n\r\n readIdentifier(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(text.charCodeAt(this.pos))\r\n );\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readString(): string {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.end)\r\n );\r\n break;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == CharCode.BACKSLASH) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n }\r\n\r\n readEscapeSequence(): string {\r\n if (++this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.end)\r\n );\r\n return \"\";\r\n }\r\n\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n\r\n case CharCode._0:\r\n return \"\\0\";\r\n\r\n case CharCode.b:\r\n return \"\\b\";\r\n\r\n case CharCode.t:\r\n return \"\\t\";\r\n\r\n case CharCode.n:\r\n return \"\\n\";\r\n\r\n case CharCode.v:\r\n return \"\\v\";\r\n\r\n case CharCode.f:\r\n return \"\\f\";\r\n\r\n case CharCode.r:\r\n return \"\\r\";\r\n\r\n case CharCode.SINGLEQUOTE:\r\n return \"'\";\r\n\r\n case CharCode.DOUBLEQUOTE:\r\n return \"\\\"\";\r\n\r\n case CharCode.u: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n ) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n\r\n case CharCode.CARRIAGERETURN:\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n\r\n case CharCode.LINEFEED:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR:\r\n return \"\";\r\n default:\r\n return String.fromCharCode(c);\r\n }\r\n }\r\n\r\n readRegexpPattern(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.end)\r\n );\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode.SLASH && !escaped) break;\r\n if (isLineBreak(c)) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readRegexpFlags(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n var c: i32 = text.charCodeAt(this.pos);\r\n if (!isIdentifierPart(c)) break;\r\n ++this.pos;\r\n\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n\r\n case CharCode.g:\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n\r\n case CharCode.i:\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n\r\n case CharCode.m:\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n\r\n default:\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(\r\n DiagnosticCode.Invalid_regular_expression_flags,\r\n this.range(start, this.pos)\r\n );\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n testInteger(): bool {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case CharCode.X:\r\n case CharCode.x:\r\n case CharCode.B:\r\n case CharCode.b:\r\n case CharCode.O:\r\n case CharCode.o:\r\n return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n var c = text.charCodeAt(pos);\r\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n return false;\r\n }\r\n if (c < CharCode._0 || c > CharCode._9) break;\r\n pos++;\r\n }\r\n return true;\r\n }\r\n\r\n readInteger(): I64 {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n\r\n case CharCode.X:\r\n case CharCode.x:\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n\r\n case CharCode.B:\r\n case CharCode.b:\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n\r\n case CharCode.O:\r\n case CharCode.o:\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n var start = this.pos;\r\n ++this.pos;\r\n var value = this.readOctalInteger();\r\n this.error(\r\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n this.range(start, this.pos)\r\n );\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n }\r\n\r\n readHexInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.A, 0)\r\n );\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.a, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readDecimalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_10),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readOctalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._7) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_8),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Octal_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readBinaryInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode._0) {\r\n // value = value * 2;\r\n value = i64_mul(\r\n value,\r\n i64_2\r\n );\r\n } else if (c == CharCode._1) {\r\n // value = value * 2 + 1;\r\n value = i64_add(\r\n i64_mul(value, i64_2),\r\n i64_1\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Binary_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readFloat(): f64 {\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n ++this.pos;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode.E || c == CharCode.e) {\r\n if (\r\n ++this.pos < this.end && (\r\n text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n text.charCodeAt(this.pos) == CharCode.PLUS\r\n ) &&\r\n isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n ) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n }\r\n\r\n readUnicodeEscape(): string {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos++);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n value = value * 16 + c - CharCode._0;\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n value = value * 16 + 10 + c - CharCode.A;\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n value = value * 16 + 10 + c - CharCode.a;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(this.pos - 1, this.pos)\r\n );\r\n return \"\";\r\n }\r\n if (--remain == 0) break;\r\n }\r\n if (remain) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.pos)\r\n );\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n }\r\n\r\n private readExtendedUnicodeEscape(): string {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(\r\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(start, this.end)\r\n );\r\n invalid = true;\r\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n ++this.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n if (invalid) return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode(\r\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\r\n );\r\n }\r\n\r\n finish(): void {\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/tokenizer.ts","// code below is generated from diagnosticsMessages.json by scripts/build-diagnostics\n/* tslint:disable:max-line-length */\n\nexport enum DiagnosticCode {\n Operation_not_supported = 100,\n Operation_is_unsafe = 101,\n Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast = 200,\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n Type_0_cannot_be_changed_to_type_1 = 202,\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n Basic_type_0_cannot_be_nullable = 204,\n Cannot_export_a_mutable_global = 205,\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n Structs_cannot_extend_classes_and_vice_versa = 207,\n Structs_cannot_implement_interfaces = 208,\n Invalid_regular_expression_flags = 209,\n Implementation_0_must_match_the_signature_1 = 210,\n Unterminated_string_literal = 1002,\n Identifier_expected = 1003,\n _0_expected = 1005,\n A_file_cannot_have_a_reference_to_itself = 1006,\n Trailing_comma_not_allowed = 1009,\n Unexpected_token = 1012,\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n Parameter_cannot_have_question_mark_and_initializer = 1015,\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n Enum_member_must_have_initializer = 1061,\n Statements_are_not_allowed_in_ambient_contexts = 1036,\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\n _0_modifier_cannot_be_used_here = 1042,\n A_rest_parameter_cannot_be_optional = 1047,\n A_rest_parameter_cannot_have_an_initializer = 1048,\n A_set_accessor_must_have_exactly_one_parameter = 1049,\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n A_get_accessor_cannot_have_parameters = 1054,\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n An_accessor_cannot_have_type_parameters = 1094,\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n Type_parameter_list_cannot_be_empty = 1098,\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\n Expression_expected = 1109,\n Type_expected = 1110,\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n Duplicate_label_0 = 1114,\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\n Digit_expected = 1124,\n Hexadecimal_digit_expected = 1125,\n Unexpected_end_of_text = 1126,\n Invalid_character = 1127,\n _case_or_default_expected = 1130,\n Type_argument_expected = 1140,\n String_literal_expected = 1141,\n Line_break_not_permitted_here = 1142,\n Declaration_expected = 1146,\n _const_declarations_must_be_initialized = 1155,\n Unterminated_regular_expression_literal = 1161,\n Binary_digit_expected = 1177,\n Octal_digit_expected = 1178,\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n Unterminated_Unicode_escape_sequence = 1199,\n Decorators_are_not_valid_here = 1206,\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n A_class_may_only_extend_another_class = 1311,\n Duplicate_identifier_0 = 2300,\n Cannot_find_name_0 = 2304,\n Module_0_has_no_exported_member_1 = 2305,\n Generic_type_0_requires_1_type_argument_s = 2314,\n Type_0_is_not_generic = 2315,\n Type_0_is_not_assignable_to_type_1 = 2322,\n Index_signature_is_missing_in_type_0 = 2329,\n _this_cannot_be_referenced_in_current_location = 2332,\n _super_can_only_be_referenced_in_a_derived_class = 2335,\n Property_0_does_not_exist_on_type_1 = 2339,\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n _get_and_set_accessor_must_have_the_same_type = 2380,\n Constructor_implementation_is_missing = 2390,\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n Multiple_constructor_implementations_are_not_allowed = 2392,\n Duplicate_function_implementation = 2393,\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n Index_signature_in_type_0_only_permits_reading = 2542,\n Expected_0_arguments_but_got_1 = 2554,\n Expected_at_least_0_arguments_but_got_1 = 2555,\n Expected_0_type_arguments_but_got_1 = 2558,\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n Namespace_0_has_no_exported_member_1 = 2694,\n File_0_not_found = 6054\n}\n\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n switch (code) {\n case 100: return \"Operation not supported.\";\n case 101: return \"Operation is unsafe.\";\n case 200: return \"Conversion from type '{0}' to '{1}' possibly loses information and thus requires an explicit cast.\";\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n case 204: return \"Basic type '{0}' cannot be nullable.\";\n case 205: return \"Cannot export a mutable global.\";\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n case 207: return \"Structs cannot extend classes and vice-versa.\";\n case 208: return \"Structs cannot implement interfaces.\";\n case 209: return \"Invalid regular expression flags.\";\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n case 1002: return \"Unterminated string literal.\";\n case 1003: return \"Identifier expected.\";\n case 1005: return \"'{0}' expected.\";\n case 1006: return \"A file cannot have a reference to itself.\";\n case 1009: return \"Trailing comma not allowed.\";\n case 1012: return \"Unexpected token.\";\n case 1014: return \"A rest parameter must be last in a parameter list.\";\n case 1015: return \"Parameter cannot have question mark and initializer.\";\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\n case 1061: return \"Enum member must have initializer.\";\n case 1036: return \"Statements are not allowed in ambient contexts.\";\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\n case 1042: return \"'{0}' modifier cannot be used here.\";\n case 1047: return \"A rest parameter cannot be optional.\";\n case 1048: return \"A rest parameter cannot have an initializer.\";\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n case 1054: return \"A 'get' accessor cannot have parameters.\";\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n case 1094: return \"An accessor cannot have type parameters.\";\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n case 1098: return \"Type parameter list cannot be empty.\";\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n case 1108: return \"A 'return' statement can only be used within a function body.\";\n case 1109: return \"Expression expected.\";\n case 1110: return \"Type expected.\";\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n case 1114: return \"Duplicate label '{0}'.\";\n case 1121: return \"Octal literals are not allowed in strict mode.\";\n case 1124: return \"Digit expected.\";\n case 1125: return \"Hexadecimal digit expected.\";\n case 1126: return \"Unexpected end of text.\";\n case 1127: return \"Invalid character.\";\n case 1130: return \"'case' or 'default' expected.\";\n case 1140: return \"Type argument expected.\";\n case 1141: return \"String literal expected.\";\n case 1142: return \"Line break not permitted here.\";\n case 1146: return \"Declaration expected.\";\n case 1155: return \"'const' declarations must be initialized.\";\n case 1161: return \"Unterminated regular expression literal.\";\n case 1177: return \"Binary digit expected.\";\n case 1178: return \"Octal digit expected.\";\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n case 1199: return \"Unterminated Unicode escape sequence.\";\n case 1206: return \"Decorators are not valid here.\";\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n case 1311: return \"A class may only extend another class.\";\n case 2300: return \"Duplicate identifier '{0}'.\";\n case 2304: return \"Cannot find name '{0}'.\";\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n case 2315: return \"Type '{0}' is not generic.\";\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n case 2329: return \"Index signature is missing in type '{0}'.\";\n case 2332: return \"'this' cannot be referenced in current location.\";\n case 2335: return \"'super' can only be referenced in a derived class.\";\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\n case 2390: return \"Constructor implementation is missing.\";\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n case 2392: return \"Multiple constructor implementations are not allowed.\";\n case 2393: return \"Duplicate function implementation.\";\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\n case 2554: return \"Expected {0} arguments, but got {1}.\";\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n case 6054: return \"File '{0}' not found.\";\n default: return \"\";\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diagnosticMessages.generated.ts","/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n NULL = 0,\r\n LINEFEED = 0x0A,\r\n CARRIAGERETURN = 0x0D,\r\n LINESEPARATOR = 0x2028,\r\n PARAGRAPHSEPARATOR = 0x2029,\r\n NEXTLINE = 0x0085,\r\n\r\n SPACE = 0x20,\r\n NONBREAKINGSPACE = 0xA0,\r\n ENQUAD = 0x2000,\r\n EMQUAD = 0x2001,\r\n ENSPACE = 0x2002,\r\n EMSPACE = 0x2003,\r\n THREEPEREMSPACE = 0x2004,\r\n FOURPEREMSPACE = 0x2005,\r\n SIXPEREMSPACE = 0x2006,\r\n FIGURESPACE = 0x2007,\r\n PUNCTUATIONSPACE = 0x2008,\r\n THINSPACE = 0x2009,\r\n HAIRSPACE = 0x200A,\r\n ZEROWIDTHSPACE = 0x200B,\r\n NARROWNOBREAKSPACE = 0x202F,\r\n IDEOGRAPHICSPACE = 0x3000,\r\n MATHEMATICALSPACE = 0x205F,\r\n OGHAM = 0x1680,\r\n\r\n _ = 0x5F,\r\n\r\n _0 = 0x30,\r\n _1 = 0x31,\r\n _2 = 0x32,\r\n _3 = 0x33,\r\n _4 = 0x34,\r\n _5 = 0x35,\r\n _6 = 0x36,\r\n _7 = 0x37,\r\n _8 = 0x38,\r\n _9 = 0x39,\r\n\r\n a = 0x61,\r\n b = 0x62,\r\n c = 0x63,\r\n d = 0x64,\r\n e = 0x65,\r\n f = 0x66,\r\n g = 0x67,\r\n h = 0x68,\r\n i = 0x69,\r\n j = 0x6A,\r\n k = 0x6B,\r\n l = 0x6C,\r\n m = 0x6D,\r\n n = 0x6E,\r\n o = 0x6F,\r\n p = 0x70,\r\n q = 0x71,\r\n r = 0x72,\r\n s = 0x73,\r\n t = 0x74,\r\n u = 0x75,\r\n v = 0x76,\r\n w = 0x77,\r\n x = 0x78,\r\n y = 0x79,\r\n z = 0x7A,\r\n\r\n A = 0x41,\r\n B = 0x42,\r\n C = 0x43,\r\n D = 0x44,\r\n E = 0x45,\r\n F = 0x46,\r\n G = 0x47,\r\n H = 0x48,\r\n I = 0x49,\r\n J = 0x4A,\r\n K = 0x4B,\r\n L = 0x4C,\r\n M = 0x4D,\r\n N = 0x4E,\r\n O = 0x4F,\r\n P = 0x50,\r\n Q = 0x51,\r\n R = 0x52,\r\n S = 0x53,\r\n T = 0x54,\r\n U = 0x55,\r\n V = 0x56,\r\n W = 0x57,\r\n X = 0x58,\r\n Y = 0x59,\r\n Z = 0x5a,\r\n\r\n AMPERSAND = 0x26,\r\n ASTERISK = 0x2A,\r\n AT = 0x40,\r\n BACKSLASH = 0x5C,\r\n BACKTICK = 0x60,\r\n BAR = 0x7C,\r\n CARET = 0x5E,\r\n CLOSEBRACE = 0x7D,\r\n CLOSEBRACKET = 0x5D,\r\n CLOSEPAREN = 0x29,\r\n COLON = 0x3A,\r\n COMMA = 0x2C,\r\n DOLLAR = 0x24,\r\n DOT = 0x2E,\r\n DOUBLEQUOTE = 0x22,\r\n EQUALS = 0x3D,\r\n EXCLAMATION = 0x21,\r\n GREATERTHAN = 0x3E,\r\n HASH = 0x23,\r\n LESSTHAN = 0x3C,\r\n MINUS = 0x2D,\r\n OPENBRACE = 0x7B,\r\n OPENBRACKET = 0x5B,\r\n OPENPAREN = 0x28,\r\n PERCENT = 0x25,\r\n PLUS = 0x2B,\r\n QUESTION = 0x3F,\r\n SEMICOLON = 0x3B,\r\n SINGLEQUOTE = 0x27,\r\n SLASH = 0x2F,\r\n TILDE = 0x7E,\r\n\r\n BACKSPACE = 0x08,\r\n FORMFEED = 0x0C,\r\n BYTEORDERMARK = 0xFEFF,\r\n TAB = 0x09,\r\n VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n switch (c) {\r\n case CharCode.LINEFEED:\r\n case CharCode.CARRIAGERETURN:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n switch (c) {\r\n case CharCode.SPACE:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.NONBREAKINGSPACE:\r\n case CharCode.NEXTLINE:\r\n case CharCode.OGHAM:\r\n case CharCode.NARROWNOBREAKSPACE:\r\n case CharCode.MATHEMATICALSPACE:\r\n case CharCode.IDEOGRAPHICSPACE:\r\n case CharCode.BYTEORDERMARK:\r\n return true;\r\n default:\r\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is a decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is an octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c >= CharCode._0 && c <= CharCode._9\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n if (code < map[0]) return false;\r\n\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid: i32;\r\n\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n } else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/charcode.ts","import {\r\n CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalize(path: string): string {\r\n var pos = 0;\r\n var len = path.length;\r\n\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == CharCode.DOT &&\r\n path.charCodeAt(pos + 1) == separator\r\n ) {\r\n pos += 2;\r\n }\r\n\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n\r\n var atEnd: bool;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n\r\n // we are only interested in '/.' sequences ...\r\n if (\r\n path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == CharCode.DOT\r\n ) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator\r\n ) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n path.charCodeAt(pos + 3) == separator\r\n ) {\r\n // find preceeding '/'\r\n var ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n path.charCodeAt(ipos + 2) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != CharCode.DOT ||\r\n path.charCodeAt(1) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolve(normalizedPath: string, origin: string): string {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalize(\r\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/path.ts","import \"../../../std/portable\";\r\nimport \"./binaryen\";\r\nimport \"./i64\";\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/glue/js/index.ts","var globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./std/portable.js\n// module id = 13\n// module chunks = 0","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\n\r\nfor (var key in binaryen)\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n if (!size) return 0; // should be safe in our case\r\n return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = require(\"../../module\").Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrint(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrintAsmjs(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glue/js/binaryen.js\n// module id = 14\n// module chunks = 0","module.exports = __WEBPACK_EXTERNAL_MODULE_15__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"binaryen\"\n// module id = 15\n// module chunks = 0","import {\r\n Compiler,\r\n ConversionKind,\r\n\r\n makeSmallIntegerWrap\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node,\r\n Expression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n NativeType,\r\n ExpressionRef,\r\n ExpressionId\r\n} from \"./module\";\r\n\r\nimport {\r\n Global,\r\n FunctionPrototype,\r\n Local,\r\n ElementFlags,\r\n Class,\r\n ElementKind\r\n} from \"./program\";\r\n\r\n/** Compiles a get of a built-in global. */\r\nexport function compileGetConstant(\r\n compiler: Compiler,\r\n global: Global,\r\n reportNode: Node\r\n): ExpressionRef {\r\n switch (global.internalName) {\r\n\r\n case \"NaN\": // context-sensitive\r\n if (compiler.currentType == Type.f32) {\r\n return compiler.module.createF32(NaN);\r\n } else {\r\n compiler.currentType = Type.f64;\r\n return compiler.module.createF64(NaN);\r\n }\r\n\r\n case \"Infinity\": // context-sensitive\r\n if (compiler.currentType == Type.f32) {\r\n return compiler.module.createF32(Infinity);\r\n } else {\r\n compiler.currentType = Type.f64;\r\n return compiler.module.createF64(Infinity);\r\n }\r\n\r\n case \"HEAP_BASE\": // never inlined for linking purposes\r\n compiler.currentType = compiler.options.usizeType;\r\n return compiler.module.createGetGlobal(\"HEAP_BASE\", compiler.currentType.toNativeType());\r\n }\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return compiler.module.createUnreachable();\r\n}\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n\r\n var arg0: ExpressionRef,\r\n arg1: ExpressionRef,\r\n arg2: ExpressionRef,\r\n ret: ExpressionRef;\r\n\r\n var tempLocal0: Local,\r\n tempLocal1: Local;\r\n\r\n var type: Type,\r\n offset: i32;\r\n\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n // search: createSelect\r\n\r\n switch (prototype.internalName) {\r\n\r\n // math\r\n\r\n case \"isNaN\": // isNaN(value: T) -> bool\r\n compiler.currentType = Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createBinary(BinaryOp.NeF32,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createBinary(BinaryOp.NeF64,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // every other type is never NaN\r\n ret = module.createI32(0);\r\n break;\r\n\r\n }\r\n compiler.currentType = Type.bool;\r\n return ret;\r\n\r\n case \"isFinite\": // isFinite(value: T) -> bool\r\n compiler.currentType = Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createSelect(\r\n module.createBinary(BinaryOp.NeF32,\r\n module.createUnary(UnaryOp.AbsF32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n module.createF32(Infinity)\r\n ),\r\n module.createI32(0),\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createGetLocal(tempLocal0.index, NativeType.F32),\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createSelect(\r\n module.createBinary(BinaryOp.NeF64,\r\n module.createUnary(UnaryOp.AbsF64,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n module.createF64(Infinity)\r\n ),\r\n module.createI32(0),\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createGetLocal(tempLocal0.index, NativeType.F64),\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // every other type is always finite\r\n ret = module.createI32(1);\r\n break;\r\n }\r\n compiler.currentType = Type.bool;\r\n return ret;\r\n\r\n case \"clz\": // clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ClzI64\r\n : UnaryOp.ClzI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"ctz\": // ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.CtzI64\r\n : UnaryOp.CtzI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"popcnt\": // popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.PopcntI64\r\n : UnaryOp.PopcntI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"rotl\": // rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n ret = makeSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n compiler.currentType,\r\n module\r\n );\r\n // fall-through\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotlI64\r\n : BinaryOp.RotlI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"rotr\": // rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n ret = makeSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n compiler.currentType,\r\n module\r\n );\r\n break;\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotrI64\r\n : BinaryOp.RotrI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"abs\": // abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n // doesn't need sign-extension here because ifFalse below is either positive\r\n // or MIN_VALUE (-MIN_VALUE == MIN_VALUE) if selected\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(BinaryOp.SubI32, // ifFalse\r\n module.createI32(0),\r\n module.createGetLocal(tempLocal0.index, NativeType.I32)\r\n ),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createI32(0)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n compiler.options.usizeType.toNativeZero(module),\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)\r\n ),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n compiler.options.usizeType.toNativeZero(module)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(BinaryOp.SubI64,\r\n module.createI64(0, 0),\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n ),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createI64(0, 0)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.U64:\r\n case TypeKind.BOOL:\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"max\": // max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"min\": // min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"ceil\": // ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"floor\": // floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"copysign\": // copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n // TODO: does an integer version make sense?\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"nearest\": // nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"reinterpret\": // reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (typeArguments[0].kind) {\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n arg0 = compiler.compileExpression(operands[0], Type.f32);\r\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n arg0 = compiler.compileExpression(operands[0], Type.f64);\r\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (typeArguments[0].isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.f64\r\n : Type.f32\r\n );\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ReinterpretF64\r\n : UnaryOp.ReinterpretF32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n arg0 = compiler.compileExpression(operands[0], Type.u32);\r\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n arg0 = compiler.compileExpression(operands[0], Type.u64);\r\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n\r\n default: // small integers and void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n\r\n case \"sqrt\": // sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n // TODO: integer versions (that return f64 or convert)?\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n break;\r\n\r\n default:\r\n // case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"trunc\": // trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n // memory access\r\n\r\n case \"load\": // load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n return module.createLoad(\r\n typeArguments[0].byteSize,\r\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size >= typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n\r\n case \"store\": // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // wraps a larger integer type to a smaller one, i.e. i32.store8\r\n : ConversionKind.IMPLICIT\r\n );\r\n if (\r\n compiler.currentType.is(TypeFlags.INTEGER) &&\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n typeArguments[0].size > compiler.currentType.size\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n\r\n case \"sizeof\": // sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n ret = compiler.options.isWasm64\r\n ? module.createI64(typeArguments[0].byteSize, 0)\r\n : module.createI32(typeArguments[0].byteSize);\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n return ret;\r\n\r\n // control flow\r\n\r\n case \"select\": // select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], type = compiler.currentType);\r\n arg2 = compiler.compileExpression(operands[2], Type.bool);\r\n compiler.currentType = type;\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"unreachable\": // unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n\r\n // host operations\r\n\r\n case \"current_memory\": // current_memory() -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.CurrentMemory);\r\n\r\n case \"grow_memory\": // grow_memory(pages: i32) -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n arg0 = module.createUnreachable();\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"move_memory\": // move_memory(dest: usize, src: usize: n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], compiler.options.usizeType);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n\r\n case \"set_memory\": // set_memory(dest: usize, value: u32, n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], Type.u32);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n\r\n // other\r\n\r\n case \"changetype\": // changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n } else if (typeArguments[0].kind != TypeKind.USIZE) { // any usize\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.NONE\r\n );\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.kind != TypeKind.USIZE) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n\r\n case \"assert\": // assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else if (operands.length > 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == Type.void) {\r\n compiler.currentType = Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n\r\n var abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n compiler.currentType = type.nonNullableType;\r\n\r\n if (contextualType == Type.void) { // simplify if dropped anyway\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n\r\n case TypeKind.F32:\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n arg0,\r\n module.createF32(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n arg0,\r\n module.createF64(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n compiler.currentType = Type.void;\r\n } else {\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64)\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createF32(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createF64(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n return ret;\r\n\r\n // conversions\r\n\r\n case \"i8\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i8, ConversionKind.EXPLICIT);\r\n\r\n case \"i16\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i16, ConversionKind.EXPLICIT);\r\n\r\n case \"i32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i32, ConversionKind.EXPLICIT);\r\n\r\n case \"i64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i64, ConversionKind.EXPLICIT);\r\n\r\n case \"isize\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32,\r\n ConversionKind.EXPLICIT\r\n );\r\n\r\n case \"u8\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u8, ConversionKind.EXPLICIT);\r\n\r\n case \"u16\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u16, ConversionKind.EXPLICIT);\r\n\r\n case \"u32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u32, ConversionKind.EXPLICIT);\r\n\r\n case \"u64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u64, ConversionKind.EXPLICIT);\r\n\r\n case \"usize\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.EXPLICIT\r\n );\r\n\r\n case \"bool\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.bool, ConversionKind.EXPLICIT);\r\n\r\n case \"f32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.f32, ConversionKind.EXPLICIT);\r\n\r\n case \"f64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.f64, ConversionKind.EXPLICIT);\r\n }\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n}\r\n\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n var expr: ExpressionRef;\r\n var value: i32;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, Type.i64);\r\n if (\r\n _BinaryenExpressionGetId(expr) != ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != NativeType.I64 ||\r\n _BinaryenConstGetValueI64High(expr) != 0 ||\r\n (value = _BinaryenConstGetValueI64Low(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n } else {\r\n expr = compiler.precomputeExpression(expression, Type.i32);\r\n if (\r\n _BinaryenExpressionGetId(expr) != ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != NativeType.I32 ||\r\n (value = _BinaryenConstGetValueI32(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nexport function compileAllocate(\r\n compiler: Compiler,\r\n cls: Class,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = cls.program;\r\n var prototype = program.elements.get(compiler.options.allocateImpl);\r\n if (prototype) {\r\n if (prototype.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = (prototype).resolve(); // reports\r\n if (instance) {\r\n if (\r\n !instance.is(ElementFlags.GENERIC) &&\r\n instance.returnType == compiler.options.usizeType &&\r\n instance.parameters &&\r\n instance.parameters.length == 1 &&\r\n instance.parameters[0].type == compiler.options.usizeType\r\n ) {\r\n if (compiler.compileFunction(instance)) { // reports\r\n return compiler.makeCall(instance, [\r\n compiler.options.isWasm64\r\n ? compiler.module.createI64(cls.currentMemoryOffset)\r\n : compiler.module.createI32(cls.currentMemoryOffset)\r\n ]);\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Implementation_0_must_match_the_signature_1,\r\n reportNode.range, compiler.options.allocateImpl, \"(size: usize): usize\"\r\n );\r\n }\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n reportNode.range, compiler.options.allocateImpl\r\n );\r\n }\r\n return compiler.module.createUnreachable();\r\n}\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n compiler: Compiler,\r\n message: Expression | null,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n var abort: ExpressionRef = module.createUnreachable();\r\n var abortPrototype = compiler.program.elements.get(\"abort\");\r\n var stringType = compiler.program.types.get(\"string\");\r\n if (\r\n abortPrototype &&\r\n abortPrototype.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n stringType\r\n ) {\r\n var abortInstance = (abortPrototype).resolve(); // reports\r\n if (\r\n abortInstance &&\r\n compiler.compileFunction(abortInstance) // reports\r\n ) {\r\n assert(abortInstance.parameters && abortInstance.parameters.length == 4); // to be sure\r\n abort = module.createBlock(null, [\r\n compiler.makeCall(abortInstance, [\r\n message != null\r\n ? compiler.compileExpression(message, stringType)\r\n : compiler.options.usizeType.toNativeZero(module),\r\n compiler.compileStaticString(reportNode.range.source.normalizedPath),\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ]),\r\n abort\r\n ]);\r\n }\r\n }\r\n return abort;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/builtins.ts","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glue/js/i64.js\n// module id = 17\n// module chunks = 0","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/long/src/long.js\n// module id = 18\n// module chunks = 0","//////////////////////// Low-level C-Like Compiler API /////////////////////////\r\n\r\nimport {\r\n Compiler,\r\n Options,\r\n Target\r\n} from \"./compiler\";\r\n\r\nimport {\r\n Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n DiagnosticMessage,\r\n DiagnosticCategory,\r\n formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module\r\n} from \"./module\";\r\n\r\nimport {\r\n Parser\r\n} from \"./parser\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n parser: Parser | null = null\r\n): Parser {\r\n if (!parser) {\r\n parser = new Parser();\r\n isEntry = true;\r\n }\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `noMemory` option. */\r\nexport function setNoMemory(options: Options, noMemory: bool): void {\r\n options.noMemory = noMemory;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compile(parser: Parser, options: Options | null = null): Module {\r\n var program = parser.finish();\r\n var compiler = new Compiler(program, options);\r\n return compiler.compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./program\";\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.ts","import {\r\n Module,\r\n NativeType,\r\n ExpressionId,\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n FunctionRef,\r\n ExpressionRef,\r\n Index,\r\n readString\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n static decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n }\r\n\r\n text: string[] = [];\r\n functionId: i32 = 0;\r\n\r\n constructor() { }\r\n\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n decompile(module: Module) {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n decompileFunction(func: FunctionRef): void {\r\n var name = readString(_BinaryenFunctionGetName(func)) || \"$\" + this.functionId.toString(10);\r\n var body = _BinaryenFunctionGetBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (var i: Index = 0, k: Index = _BinaryenFunctionGetNumParams(func); i < k; ++i) {\r\n if (i > 0) this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetParam(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetResult(func)));\r\n this.push(\" \");\r\n if (_BinaryenExpressionGetId(body) != ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (_BinaryenExpressionGetId(body) != ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n }\r\n\r\n decompileExpression(expr: ExpressionRef): void {\r\n var id = _BinaryenExpressionGetId(expr);\r\n var type = _BinaryenExpressionGetType(expr);\r\n\r\n var nested: ExpressionRef;\r\n var string: string | null;\r\n var i: Index, k: Index;\r\n\r\n switch (id) {\r\n\r\n case ExpressionId.Block: // TODO: magic\r\n if ((string = readString(_BinaryenBlockGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = _BinaryenBlockGetNumChildren(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(_BinaryenBlockGetChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n\r\n case ExpressionId.If:\r\n if (type == NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n if (nested = _BinaryenIfGetIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n } else {\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(_BinaryenIfGetIfFalse(expr));\r\n }\r\n return;\r\n\r\n case ExpressionId.Loop:\r\n if ((string = readString(_BinaryenLoopGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(_BinaryenLoopGetBody(expr));\r\n this.push(\"while (0);\\n\");\r\n\r\n case ExpressionId.Break:\r\n if (nested = _BinaryenBreakGetCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = readString(_BinaryenBreakGetName(expr))) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n\r\n case ExpressionId.Switch:\r\n\r\n case ExpressionId.Call:\r\n\r\n case ExpressionId.CallImport:\r\n\r\n case ExpressionId.CallIndirect:\r\n\r\n case ExpressionId.GetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenGetLocalGetIndex(expr).toString(10));\r\n return;\r\n\r\n case ExpressionId.SetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenSetLocalGetIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(_BinaryenSetLocalGetValue(expr));\r\n return;\r\n\r\n case ExpressionId.GetGlobal:\r\n\r\n case ExpressionId.SetGlobal:\r\n\r\n case ExpressionId.Load:\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenLoadGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenLoadGetPtr(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Store:\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenStoreGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenStoreGetPtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenStoreGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Const:\r\n switch (type) {\r\n\r\n case NativeType.I32:\r\n this.push(_BinaryenConstGetValueI32(expr).toString(10));\r\n return;\r\n\r\n case NativeType.I64:\r\n this.push(\r\n i64_to_string(\r\n i64_new(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n )\r\n )\r\n );\r\n return;\r\n\r\n case NativeType.F32:\r\n this.push(_BinaryenConstGetValueF32(expr).toString(10));\r\n return;\r\n\r\n case NativeType.F64:\r\n this.push(_BinaryenConstGetValueF64(expr).toString(10));\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Unary:\r\n switch (_BinaryenUnaryGetOp(expr)) {\r\n\r\n case UnaryOp.ClzI32:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CtzI32:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.PopcntI32:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NegF32:\r\n case UnaryOp.NegF64:\r\n this.push(\"-\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.AbsF32:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CeilF32:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.FloorF32:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.TruncF32:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NearestF32:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.SqrtF32:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64:\r\n this.push(\"!\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ClzI64:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CtzI64:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.PopcntI64:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.AbsF64:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CeilF64:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.FloorF64:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.TruncF64:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NearestF64:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.SqrtF64:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ExtendI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ExtendU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.WrapI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ReinterpretF32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ReinterpretF64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ConvertI32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.PromoteF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.DemoteF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ReinterpretI32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ReinterpretI64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Binary: // TODO: precedence\r\n switch (_BinaryenBinaryGetOp(expr)) {\r\n\r\n case BinaryOp.AddI32:\r\n case BinaryOp.AddI64:\r\n case BinaryOp.AddF32:\r\n case BinaryOp.AddF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.SubI32:\r\n case BinaryOp.SubI64:\r\n case BinaryOp.SubF32:\r\n case BinaryOp.SubF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.MulI32:\r\n case BinaryOp.MulI64:\r\n case BinaryOp.MulF32:\r\n case BinaryOp.MulF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivI32:\r\n case BinaryOp.DivI64:\r\n case BinaryOp.DivF32:\r\n case BinaryOp.DivF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RemU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.AndI32:\r\n case BinaryOp.AndI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.OrI32:\r\n case BinaryOp.OrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.XorI32:\r\n case BinaryOp.XorI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShlI32:\r\n case BinaryOp.ShlI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShrU32:\r\n case BinaryOp.ShrU64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShrI32:\r\n case BinaryOp.ShrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RotlI32:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RotrI32:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RemU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RotlI64:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RotrI64:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.LtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.CopysignF32:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MinF32:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MaxF32:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.CopysignF64:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MinF64:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MaxF64:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n return;\r\n\r\n case ExpressionId.Select:\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(_BinaryenSelectGetIfTrue(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetIfFalse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetCondition(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Drop:\r\n this.decompileExpression(_BinaryenDropGetValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n\r\n case ExpressionId.Return:\r\n if (nested = _BinaryenReturnGetValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n\r\n case ExpressionId.Host:\r\n switch (_BinaryenHostGetOp(expr)) {\r\n case HostOp.CurrentMemory:\r\n this.push(\"current_memory()\");\r\n return;\r\n case HostOp.GrowMemory:\r\n this.push(\"grow_memory(\");\r\n this.decompileExpression(_BinaryenHostGetOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Nop:\r\n this.push(\";\\n\");\r\n return;\r\n\r\n case ExpressionId.Unreachable:\r\n this.push(\"unreachable()\");\r\n return;\r\n\r\n case ExpressionId.AtomicCmpxchg:\r\n\r\n case ExpressionId.AtomicRMW:\r\n\r\n case ExpressionId.AtomicWait:\r\n\r\n case ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n private push(text: string): void {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n }\r\n\r\n finish(): string {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n switch (type) {\r\n case NativeType.None: return \"void\";\r\n case NativeType.I32: return \"i32\";\r\n case NativeType.I64: return \"i64\";\r\n case NativeType.F32: return \"f32\";\r\n case NativeType.F64: return \"f64\";\r\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/decompiler.ts","/*\r\n\r\n This is a custom parser specifically written for the AssemblyScript subset. It accepts some of the\r\n most common TypeScript-only patterns that it knows an appropriate error message for but, though it\r\n uses TypeScript's codes for diagnostics, doesn't ultimately aim at full compatibility.\r\n\r\n*/\r\n\r\nimport {\r\n Program,\r\n LIBRARY_PREFIX,\r\n PATH_DELIMITER\r\n} from \"./program\";\r\n\r\nimport {\r\n Tokenizer,\r\n Token,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n normalize as normalizePath\r\n} from \"./util/path\";\r\n\r\nimport {\r\n\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n TypeNode,\r\n\r\n Expression,\r\n AssertionKind,\r\n CallExpression,\r\n IdentifierExpression,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n Decorator,\r\n DoStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportImportStatement,\r\n ExportMember,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n FunctionDeclaration,\r\n IfStatement,\r\n ImportDeclaration,\r\n ImportStatement,\r\n Modifier,\r\n ModifierKind,\r\n NamespaceDeclaration,\r\n Parameter,\r\n ParameterKind,\r\n ReturnStatement,\r\n SwitchCase,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n TypeDeclaration,\r\n TypeParameter,\r\n VariableStatement,\r\n VariableDeclaration,\r\n WhileStatement,\r\n\r\n addModifier,\r\n getModifier,\r\n hasModifier,\r\n setReusableModifiers\r\n\r\n} from \"./ast\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n /** Program being created. */\r\n program: Program;\r\n /** Log of source file names to be requested. */\r\n backlog: string[] = new Array();\r\n /** Log of source file names already processed. */\r\n seenlog: Set = new Set();\r\n\r\n /** Constructs a new parser. */\r\n constructor() {\r\n super();\r\n this.program = new Program(this.diagnostics);\r\n }\r\n\r\n /** Parses a file and adds its definitions to the program. */\r\n parseFile(\r\n text: string,\r\n path: string,\r\n isEntry: bool\r\n ): void {\r\n\r\n // check if already parsed\r\n var normalizedPath = normalizePath(path);\r\n for (var i = 0, k = this.program.sources.length; i < k; ++i) {\r\n if (this.program.sources[i].normalizedPath == normalizedPath) return;\r\n }\r\n this.seenlog.add(normalizedPath);\r\n\r\n // create the source element\r\n var source = new Source(\r\n normalizedPath,\r\n text,\r\n isEntry\r\n ? SourceKind.ENTRY\r\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n ? SourceKind.LIBRARY\r\n : SourceKind.DEFAULT\r\n );\r\n this.program.sources.push(source);\r\n\r\n // tokenize and parse\r\n var tn = new Tokenizer(source, this.program.diagnostics);\r\n source.tokenizer = tn;\r\n while (!tn.skip(Token.ENDOFFILE)) {\r\n var statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n source.statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n }\r\n\r\n /** Parses a top-level statement. */\r\n parseTopLevelStatement(\r\n tn: Tokenizer,\r\n isNamespaceMember: bool = false\r\n ): Statement | null {\r\n\r\n // check decorators\r\n var decorators: Decorator[] | null = null;\r\n while (tn.skip(Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n if (!decorators) decorators = [];\r\n decorators.push(decorator);\r\n }\r\n\r\n // check modifiers\r\n var modifiers: Modifier[] | null = null;\r\n if (tn.skip(Token.EXPORT)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.EXPORT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(Token.DECLARE)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.DECLARE, tn.range()), modifiers);\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) {\r\n this.error(\r\n DiagnosticCode.Line_break_not_permitted_here,\r\n tn.range(tn.pos)\r\n ); // recoverable, compatibility\r\n }\r\n }\r\n\r\n // remember where we took off\r\n tn.mark();\r\n\r\n // parse the statement\r\n var statement: Statement | null = null;\r\n var modifier: Modifier | null;\r\n\r\n // handle declarations\r\n switch (tn.next()) {\r\n\r\n case Token.CONST:\r\n modifiers = addModifier(Node.createModifier(ModifierKind.CONST, tn.range()), modifiers);\r\n if (tn.skip(Token.ENUM)) {\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n break;\r\n }\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.LET:\r\n modifiers = addModifier(Node.createModifier(ModifierKind.LET, tn.range()), modifiers);\r\n // fall-through\r\n\r\n case Token.VAR:\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.ENUM:\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.FUNCTION:\r\n statement = this.parseFunction(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.ABSTRACT:\r\n if (!tn.skip(Token.CLASS)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"class\"\r\n );\r\n break;\r\n }\r\n modifiers = addModifier(\r\n Node.createModifier(ModifierKind.ABSTRACT, tn.range()), modifiers\r\n );\r\n // fall through\r\n\r\n case Token.CLASS:\r\n statement = this.parseClass(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.NAMESPACE:\r\n statement = this.parseNamespace(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.IMPORT:\r\n if (modifier = getModifier(ModifierKind.EXPORT, modifiers)) {\r\n statement = this.parseExportImport(tn, modifier.range);\r\n } else {\r\n statement = this.parseImport(tn);\r\n }\r\n if (modifiers) setReusableModifiers(modifiers);\r\n break;\r\n\r\n case Token.TYPE:\r\n statement = this.parseTypeDeclaration(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n default:\r\n\r\n // handle plain exports\r\n if (hasModifier(ModifierKind.EXPORT, modifiers)) {\r\n tn.reset();\r\n statement = this.parseExport(tn, modifiers); // TODO: why exactly does this have modifiers again? 'declare'?\r\n\r\n // handle non-declaration statements\r\n } else {\r\n if (modifiers) {\r\n if (modifier = getModifier(ModifierKind.DECLARE, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"declare\"\r\n ); // recoverable\r\n }\r\n setReusableModifiers(modifiers);\r\n }\r\n tn.reset();\r\n if (!isNamespaceMember) {\r\n statement = this.parseStatement(tn, true);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n decorators[i].range\r\n );\r\n }\r\n }\r\n return statement;\r\n }\r\n\r\n /** Obtains the next file to parse. */\r\n nextFile(): string | null {\r\n return this.backlog.length ? this.backlog.shift() : null;\r\n }\r\n\r\n /** Finishes parsing and returns the program. */\r\n finish(): Program {\r\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n return this.program;\r\n }\r\n\r\n /** Parses a type. */\r\n parseType(\r\n tn: Tokenizer,\r\n acceptParenthesized: bool = true,\r\n suppressErrors: bool = false\r\n ): TypeNode | null {\r\n\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n\r\n // void\r\n if (token == Token.VOID) {\r\n return Node.createType(\r\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n }\r\n\r\n var type: TypeNode;\r\n\r\n // ( ... )\r\n if (acceptParenthesized && token == Token.OPENPAREN) {\r\n var innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"}\"\r\n );\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n\r\n // this\r\n } else if (token == Token.THIS) {\r\n type = Node.createType(\r\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // true\r\n } else if (token == Token.TRUE || token == Token.FALSE) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // string literal\r\n } else if (token == Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // Name\r\n } else if (token == Token.IDENTIFIER) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var parameters = new Array();\r\n var nullable = false;\r\n\r\n // Name\r\n if (tn.skip(Token.LESSTHAN)) {\r\n do {\r\n var parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter) return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \">\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(Token.OPENBRACKET)) {\r\n var bracketStart = tn.tokenPos;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n return null;\r\n }\r\n var bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n // ...[] | null\r\n nullable = false;\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"Array\", bracketRange),\r\n [ type ],\r\n nullable,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (nullable) break;\r\n }\r\n\r\n return type;\r\n }\r\n\r\n // statements\r\n\r\n parseDecorator(\r\n tn: Tokenizer\r\n ): Decorator | null {\r\n\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var name = tn.readIdentifier();\r\n var expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n name = tn.readIdentifier();\r\n expression = Node.createPropertyAccessExpression(\r\n expression,\r\n Node.createIdentifierExpression(name, tn.range()),\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n var args: Expression[] | null;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVariable(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): VariableStatement | null {\r\n\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n var members = new Array();\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseVariableDeclaration(tn, isDeclare, modifiers, decorators);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n\r\n var ret = Node.createVariableStatement(members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseVariableDeclaration(\r\n tn: Tokenizer,\r\n isDeclare: bool = false,\r\n parentModifiers: Modifier[] | null,\r\n parentDecorators: Decorator[] | null\r\n ): VariableDeclaration | null {\r\n\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var type: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isDeclare) {\r\n this.error(\r\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n } else {\r\n if (hasModifier(ModifierKind.CONST, parentModifiers)) {\r\n if (!hasModifier(ModifierKind.DECLARE, parentModifiers)) {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n identifier.range\r\n );\r\n }\r\n } else if (!type) { // neither type nor initializer\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n }\r\n return Node.createVariableDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n parentModifiers,\r\n parentDecorators,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseEnum(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): EnumDeclaration | null {\r\n\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.next() != Token.IDENTIFIER) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != Token.OPENBRACE) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseEnumValue(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n var ret = Node.createEnumDeclaration(\r\n identifier,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseEnumValue(\r\n tn: Tokenizer\r\n ): EnumValueDeclaration | null {\r\n\r\n // before: Identifier ('=' Expression)?\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n }\r\n return Node.createEnumValueDeclaration(\r\n identifier,\r\n value,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseReturn(\r\n tn: Tokenizer\r\n ): ReturnStatement | null {\r\n\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n var expr: Expression | null = null;\r\n if (\r\n tn.peek(true) != Token.SEMICOLON &&\r\n tn.nextToken != Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine\r\n ) {\r\n if (!(expr = this.parseExpression(tn))) return null;\r\n }\r\n\r\n var ret = Node.createReturnStatement(expr, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTypeParameters(\r\n tn: Tokenizer\r\n ): TypeParameter[] | null {\r\n\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n var typeParameters = new Array();\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n do {\r\n var typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter) return null;\r\n typeParameters.push(typeParameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return typeParameters;\r\n }\r\n\r\n parseTypeParameter(\r\n tn: Tokenizer\r\n ): TypeParameter | null {\r\n\r\n // before: Identifier ('extends' Type)?\r\n\r\n if (tn.next() == Token.IDENTIFIER) {\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n if (!(extendsType = this.parseType(tn))) return null;\r\n }\r\n return Node.createTypeParameter(\r\n identifier,\r\n extendsType,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseParameters(\r\n tn: Tokenizer\r\n ): Parameter[] | null {\r\n\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n var parameters = new Array();\r\n var seenRest: Parameter | null = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n\r\n if (tn.peek() != Token.CLOSEPAREN) {\r\n do {\r\n var param = this.parseParameter(tn);\r\n if (!param) return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n seenRest.name.range\r\n );\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n\r\n default:\r\n if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n param.name.range\r\n );\r\n }\r\n break;\r\n\r\n case ParameterKind.OPTIONAL:\r\n seenOptional = true;\r\n break;\r\n\r\n case ParameterKind.REST:\r\n seenRest = param;\r\n break;\r\n }\r\n parameters.push(param);\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return parameters;\r\n }\r\n\r\n parseParameter(\r\n tn: Tokenizer\r\n ): Parameter | null {\r\n\r\n // before: '...'? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange: Range | null = null;\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n isRest = true;\r\n startRange = tn.range();\r\n }\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n if (!isRest) startRange = tn.range();\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type: TypeNode | null = null;\r\n if (isOptional = tn.skip(Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n identifier.range\r\n );\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n }\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n if (isOptional) {\r\n this.error(\r\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n identifier.range\r\n );\r\n } else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n }\r\n return Node.createParameter(\r\n identifier,\r\n type,\r\n initializer,\r\n isRest\r\n ? ParameterKind.REST\r\n : isOptional\r\n ? ParameterKind.OPTIONAL\r\n : ParameterKind.DEFAULT,\r\n Range.join(startRange, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseFunction(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): FunctionDeclaration | null {\r\n\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var typeParameters: TypeParameter[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n var isSetter = hasModifier(ModifierKind.SET, modifiers);\r\n if (isSetter) {\r\n\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var isGetter = hasModifier(ModifierKind.GET, modifiers);\r\n if (isGetter && parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n\r\n var returnType: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn, isSetter);\r\n if (!returnType) return null;\r\n\r\n } else if (!isSetter) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n\r\n var statements: Statement[] | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n statements = new Array();\r\n\r\n if (isDeclare) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n\r\n } else if (!isDeclare) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range(tn.pos)\r\n );\r\n }\r\n\r\n var ret = Node.createFunctionDeclaration(\r\n identifier,\r\n typeParameters,\r\n parameters,\r\n returnType,\r\n statements,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseClass(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): ClassDeclaration | null {\r\n\r\n // at 'class':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n\r\n var startPos = decorators && decorators.length\r\n ? decorators[0].range.start\r\n : modifiers && modifiers.length\r\n ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n\r\n var typeParameters: TypeParameter[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n extendsType = this.parseType(tn);\r\n if (!extendsType) return null;\r\n }\r\n\r\n var implementsTypes = new Array();\r\n if (tn.skip(Token.IMPLEMENTS)) {\r\n do {\r\n var type = this.parseType(tn);\r\n if (!type) return null;\r\n implementsTypes.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n\r\n if (tn.skip(Token.OPENBRACE)) {\r\n\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseClassMember(tn, isDeclare);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return Node.createClassDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n implementsTypes,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseClassMember(\r\n tn: Tokenizer,\r\n parentIsDeclare: bool\r\n ): DeclarationStatement | null {\r\n\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n\r\n var startPos = tn.pos;\r\n\r\n var decorators = new Array();\r\n while (tn.skip(Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n decorators.push(decorator);\r\n }\r\n\r\n var modifiers: Modifier[] | null = null;\r\n\r\n if (tn.skip(Token.PUBLIC)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PUBLIC, tn.range()), modifiers);\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PRIVATE, tn.range()), modifiers);\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PROTECTED, tn.range()), modifiers);\r\n }\r\n\r\n if (tn.skip(Token.STATIC)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.STATIC, tn.range()), modifiers);\r\n } else if (tn.skip(Token.ABSTRACT)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n }\r\n\r\n if (tn.skip(Token.READONLY)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.READONLY, tn.range()), modifiers);\r\n }\r\n\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n tn.mark();\r\n\r\n var isGetter = false;\r\n var isSetter = false;\r\n\r\n if (isGetter = tn.skip(Token.GET)) {\r\n if (tn.peek(true, true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.GET, tn.range()), modifiers);\r\n } else {\r\n tn.reset();\r\n isGetter = false;\r\n }\r\n\r\n } else if (isSetter = tn.skip(Token.SET)) { // can't be both\r\n if (tn.peek(true, true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.SET, tn.range()), modifiers);\r\n } else {\r\n tn.reset();\r\n isSetter = false;\r\n }\r\n }\r\n\r\n var isConstructor = tn.skip(Token.CONSTRUCTOR);\r\n if (isConstructor || tn.skip(Token.IDENTIFIER)) {\r\n\r\n var identifier = isConstructor\r\n ? Node.createConstructorExpression(tn.range())\r\n : Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var typeParameters: TypeParameter[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n if (isGetter && parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n identifier.range\r\n );\r\n }\r\n\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n identifier.range\r\n );\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n }\r\n\r\n var returnType: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n if (identifier.kind == NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n );\r\n } else if (isSetter) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n tn.range()\r\n );\r\n }\r\n returnType = this.parseType(tn, identifier.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType) return null;\r\n } else if (!isSetter && identifier.kind != NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n var statements: Statement[] | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (parentIsDeclare) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n } else if (!parentIsDeclare) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n var retMethod = Node.createMethodDeclaration(\r\n identifier,\r\n typeParameters,\r\n parameters,\r\n returnType,\r\n statements,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retMethod;\r\n\r\n } else if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Constructor_implementation_is_missing,\r\n identifier.range\r\n );\r\n\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n identifier.range\r\n );\r\n\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n } else {\r\n var modifier: Modifier | null;\r\n\r\n if (modifier = getModifier(ModifierKind.ABSTRACT, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"abstract\"\r\n ); // recoverable\r\n }\r\n\r\n if (modifier = getModifier(ModifierKind.GET, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"get\"\r\n ); // recoverable\r\n }\r\n\r\n if (modifier = getModifier(ModifierKind.SET, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"set\"\r\n ); // recoverable\r\n }\r\n\r\n var type: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer) return null;\r\n }\r\n var retField = Node.createFieldDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retField;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseNamespace(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): NamespaceDeclaration | null {\r\n\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var member = this.parseTopLevelStatement(tn, true);\r\n if (!member) return null;\r\n members.push(member);\r\n }\r\n var ret = Node.createNamespaceDeclaration(\r\n identifier,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExport(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null\r\n ): ExportStatement | null {\r\n\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseExportMember(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n var path: StringLiteralExpression | null = null;\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n var ret = Node.createExportStatement(members, path, modifiers, tn.range(startPos, tn.pos));\r\n if (ret.normalizedPath && !this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportMember(\r\n tn: Tokenizer\r\n ): ExportMember | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createExportMember(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImport(\r\n tn: Tokenizer\r\n ): ImportStatement | null {\r\n\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var members: ImportDeclaration[] | null = null;\r\n var namespaceName: IdentifierExpression | null = null;\r\n var skipFrom = false;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseImportDeclaration(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"as\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n skipFrom = true;\r\n }\r\n\r\n if (skipFrom || tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n var path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n var ret: ImportStatement;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n } else {\r\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n if (!this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImportDeclaration(\r\n tn: Tokenizer\r\n ): ImportDeclaration | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createImportDeclaration(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportImport(\r\n tn: Tokenizer,\r\n startRange: Range\r\n ): ExportImportStatement | null {\r\n\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var ret = Node.createExportImportStatement(identifier, asIdentifier, Range.join(startRange, tn.range()));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseStatement(\r\n tn: Tokenizer,\r\n topLevel: bool = false\r\n ): Statement | null {\r\n\r\n // at previous token\r\n\r\n tn.mark();\r\n var token = tn.next();\r\n switch (token) {\r\n\r\n case Token.BREAK:\r\n return this.parseBreak(tn);\r\n\r\n case Token.CONST:\r\n return this.parseVariable(tn, [\r\n Node.createModifier(ModifierKind.CONST, tn.range())\r\n ], null);\r\n\r\n case Token.CONTINUE:\r\n return this.parseContinue(tn);\r\n\r\n case Token.DO:\r\n return this.parseDoStatement(tn);\r\n\r\n case Token.FOR:\r\n return this.parseForStatement(tn);\r\n\r\n case Token.IF:\r\n return this.parseIfStatement(tn);\r\n\r\n case Token.LET:\r\n return this.parseVariable(tn, [\r\n Node.createModifier(ModifierKind.LET, tn.range())\r\n ], null);\r\n\r\n case Token.VAR:\r\n return this.parseVariable(tn, null, null);\r\n\r\n case Token.OPENBRACE:\r\n return this.parseBlockStatement(tn, topLevel);\r\n\r\n case Token.RETURN:\r\n if (topLevel) {\r\n this.error(\r\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return this.parseReturn(tn);\r\n\r\n case Token.SEMICOLON:\r\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n\r\n case Token.SWITCH:\r\n return this.parseSwitchStatement(tn);\r\n\r\n case Token.THROW:\r\n return this.parseThrowStatement(tn);\r\n\r\n case Token.TRY:\r\n return this.parseTryStatement(tn);\r\n\r\n case Token.TYPE:\r\n return this.parseTypeDeclaration(tn, null);\r\n\r\n case Token.WHILE:\r\n return this.parseWhileStatement(tn);\r\n\r\n default:\r\n tn.reset();\r\n return this.parseExpressionStatement(tn);\r\n }\r\n }\r\n\r\n parseBlockStatement(\r\n tn: Tokenizer,\r\n topLevel: bool\r\n ): BlockStatement | null {\r\n\r\n // at '{': Statement* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn, topLevel);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseBreak(\r\n tn: Tokenizer\r\n ): BreakStatement | null {\r\n\r\n // at 'break': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseContinue(\r\n tn: Tokenizer\r\n ): ContinueStatement | null {\r\n\r\n // at 'continue': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseDoStatement(\r\n tn: Tokenizer\r\n ): DoStatement | null {\r\n\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n if (tn.skip(Token.WHILE)) {\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"while\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExpressionStatement(\r\n tn: Tokenizer\r\n ): ExpressionStatement | null {\r\n\r\n // at previous token\r\n\r\n var expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n\r\n var ret = Node.createExpressionStatement(expr);\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseForStatement(\r\n tn: Tokenizer\r\n ): ForStatement | null {\r\n\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n var startPos = tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n\r\n var initializer: Statement | null = null;\r\n\r\n if (tn.skip(Token.LET) || tn.skip(Token.CONST) || tn.skip(Token.VAR)) {\r\n initializer = this.parseVariable(tn, null, null);\r\n\r\n } else if (!tn.skip(Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n var condition: ExpressionStatement | null = null;\r\n if (!tn.skip(Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n var incrementor: Expression | null = null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor) return null;\r\n\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n return Node.createForStatement(\r\n initializer,\r\n condition\r\n ? condition.expression\r\n : null,\r\n incrementor,\r\n statement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseIfStatement(\r\n tn: Tokenizer\r\n ): IfStatement | null {\r\n\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n var elseStatement: Statement | null = null;\r\n if (tn.skip(Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement) return null;\r\n }\r\n return Node.createIfStatement(\r\n condition,\r\n statement,\r\n elseStatement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchStatement(\r\n tn: Tokenizer\r\n ): SwitchStatement | null {\r\n\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var cases = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var case_ = this.parseSwitchCase(tn);\r\n if (!case_) return null;\r\n cases.push(case_);\r\n }\r\n var ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchCase(\r\n tn: Tokenizer\r\n ): SwitchCase | null {\r\n\r\n var startPos = tn.tokenPos;\r\n var statements: Statement[],\r\n statement: Statement | null;\r\n\r\n // 'case' Expression ':' Statement*\r\n\r\n if (tn.skip(Token.CASE)) {\r\n var label = this.parseExpression(tn);\r\n if (!label) return null;\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n\r\n // 'default' ':' Statement*\r\n\r\n } else if (tn.skip(Token.DEFAULT)) {\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._case_or_default_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseThrowStatement(\r\n tn: Tokenizer\r\n ): ThrowStatement | null {\r\n\r\n // at 'throw': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTryStatement(\r\n tn: Tokenizer\r\n ): TryStatement | null {\r\n\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var stmt: Statement | null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n statements.push(stmt);\r\n }\r\n var catchVariable: IdentifierExpression | null = null;\r\n var catchStatements: Statement[] | null = null;\r\n var finallyStatements: Statement[] | null = null;\r\n if (tn.skip(Token.CATCH)) {\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(Token.FINALLY)) {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"catch\"\r\n );\r\n return null;\r\n }\r\n var ret = Node.createTryStatement(\r\n statements,\r\n catchVariable,\r\n catchStatements,\r\n finallyStatements,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseTypeDeclaration(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null = null,\r\n decorators: Decorator[] | null = null\r\n ): TypeDeclaration | null {\r\n\r\n // at 'type': Identifier '=' Type ';'?\r\n\r\n var startPos = decorators && decorators.length ? decorators[0].range.start\r\n : modifiers && modifiers.length ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n var type = this.parseType(tn);\r\n if (!type) return null;\r\n var ret = Node.createTypeDeclaration(name, type, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseWhileStatement(\r\n tn: Tokenizer\r\n ): WhileStatement | null {\r\n\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n var ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n parseExpressionStart(\r\n tn: Tokenizer\r\n ): Expression | null {\r\n\r\n var token = tn.next(true);\r\n var startPos = tn.tokenPos;\r\n var expr: Expression | null = null;\r\n\r\n if (token == Token.NULL) {\r\n return Node.createNullExpression(tn.range());\r\n }\r\n if (token == Token.TRUE) {\r\n return Node.createTrueExpression(tn.range());\r\n }\r\n if (token == Token.FALSE) {\r\n return Node.createFalseExpression(tn.range());\r\n }\r\n\r\n var p = determinePrecedenceStart(token);\r\n if (p != Precedence.INVALID) {\r\n var operand: Expression | null;\r\n\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n // NewExpression\r\n if (token == Token.NEW) {\r\n operand = this.parseExpression(tn, Precedence.CALL);\r\n if (!operand) return null;\r\n if (operand.kind == NodeKind.CALL) {\r\n return Node.createNewExpression(\r\n (operand).expression,\r\n (operand).typeArguments,\r\n (operand).arguments,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n } else {\r\n operand = this.parseExpression(tn, p);\r\n if (!operand) return null;\r\n }\r\n\r\n // UnaryPrefixExpression\r\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n if (\r\n operand.kind != NodeKind.IDENTIFIER &&\r\n operand.kind != NodeKind.ELEMENTACCESS &&\r\n operand.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n operand.range\r\n );\r\n }\r\n }\r\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n\r\n switch (token) {\r\n\r\n // ParenthesizedExpression\r\n case Token.OPENPAREN:\r\n expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n\r\n // ArrayLiteralExpression\r\n case Token.OPENBRACKET:\r\n var elementExpressions = new Array();\r\n\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n do {\r\n if (tn.peek() == Token.COMMA) {\r\n expr = null; // omitted\r\n } else {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (tn.peek() == Token.CLOSEBRACKET) break;\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n\r\n // AssertionExpression (unary prefix)\r\n case Token.LESSTHAN:\r\n var toType = this.parseType(tn);\r\n if (!toType) return null;\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, Precedence.CALL);\r\n if (!expr) return null;\r\n return Node.createAssertionExpression(\r\n AssertionKind.PREFIX,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n case Token.IDENTIFIER:\r\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n\r\n case Token.THIS:\r\n return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.CONSTRUCTOR:\r\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.SUPER:\r\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.STRINGLITERAL:\r\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n\r\n case Token.INTEGERLITERAL:\r\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n\r\n case Token.FLOATLITERAL:\r\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case Token.SLASH:\r\n var regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(Token.SLASH)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"/\"\r\n );\r\n return null;\r\n }\r\n return Node.createRegexpLiteralExpression(\r\n regexpPattern,\r\n tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Expression_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n tryParseTypeArgumentsBeforeArguments(\r\n tn: Tokenizer\r\n ): TypeNode[] | null {\r\n\r\n // at '<': Type (',' Type)* '>' '('\r\n\r\n tn.mark();\r\n if (!tn.skip(Token.LESSTHAN)) return null;\r\n var typeArguments = new Array();\r\n do {\r\n var type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset();\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset();\r\n return null;\r\n }\r\n\r\n parseArguments(\r\n tn: Tokenizer\r\n ): Expression[] | null {\r\n\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n var args = new Array();\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n do {\r\n var expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n args.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n return args;\r\n }\r\n\r\n parseExpression(\r\n tn: Tokenizer,\r\n precedence: Precedence = 0\r\n ): Expression | null {\r\n\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr) return null;\r\n var startPos = expr.range.start;\r\n\r\n // CallExpression\r\n var typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn); // skips '(' on success\r\n // there might be better ways to distinguish a LESSTHAN from a CALL with type arguments\r\n if (typeArguments || tn.skip(Token.OPENPAREN)) {\r\n var args = this.parseArguments(tn);\r\n if (!args) return null;\r\n expr = Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos));\r\n }\r\n\r\n var token: Token;\r\n var next: Expression | null = null;\r\n var nextPrecedence: Precedence;\r\n while (\r\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n ) { // precedence climbing\r\n tn.next();\r\n\r\n switch (token) {\r\n\r\n // AssertionExpression\r\n case Token.AS:\r\n var toType = this.parseType(tn);\r\n if (!toType) return null;\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.AS,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // ElementAccessExpression\r\n case Token.OPENBRACKET:\r\n next = this.parseExpression(tn);\r\n if (!next) return null;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n expr = Node.createElementAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // UnaryPostfixExpression\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n if (\r\n expr.kind != NodeKind.IDENTIFIER &&\r\n expr.kind != NodeKind.ELEMENTACCESS &&\r\n expr.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n expr.range\r\n );\r\n }\r\n expr = Node.createUnaryPostfixExpression(\r\n token,\r\n expr,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // TernaryExpression\r\n case Token.QUESTION:\r\n var ifThen = this.parseExpression(tn);\r\n if (!ifThen) return null;\r\n if (!tn.skip(Token.COLON)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n var ifElse = this.parseExpression(tn);\r\n if (!ifElse) return null;\r\n expr = Node.createTernaryExpression(\r\n expr,\r\n ifThen,\r\n ifElse,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // CommaExpression\r\n case Token.COMMA:\r\n var commaExprs: Expression[] = [ expr ];\r\n do {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n\r\n default:\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n\r\n // PropertyAccessExpression\r\n if (token == Token.DOT) {\r\n if (next.kind == NodeKind.IDENTIFIER) {\r\n expr = Node.createPropertyAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else if (next.kind == NodeKind.CALL) { // join\r\n var propertyCall = next;\r\n if (propertyCall.expression.kind == NodeKind.IDENTIFIER) {\r\n propertyCall.expression = Node.createPropertyAccessExpression(\r\n expr,\r\n propertyCall.expression,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n propertyCall.expression.range\r\n );\r\n return null;\r\n }\r\n expr = propertyCall;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n next.range\r\n );\r\n return null;\r\n }\r\n\r\n // BinaryExpression\r\n } else {\r\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n COMMA,\r\n SPREAD,\r\n YIELD,\r\n ASSIGNMENT,\r\n CONDITIONAL,\r\n LOGICAL_OR,\r\n LOGICAL_AND,\r\n BITWISE_OR,\r\n BITWISE_XOR,\r\n BITWISE_AND,\r\n EQUALITY,\r\n RELATIONAL,\r\n SHIFT,\r\n ADDITIVE,\r\n MULTIPLICATIVE,\r\n EXPONENTIATED,\r\n UNARY_PREFIX,\r\n UNARY_POSTFIX,\r\n CALL,\r\n MEMBERACCESS,\r\n GROUPING,\r\n INVALID = -1\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): i32 {\r\n switch (kind) {\r\n\r\n case Token.DOT_DOT_DOT:\r\n return Precedence.SPREAD;\r\n\r\n case Token.YIELD:\r\n return Precedence.YIELD;\r\n\r\n case Token.EXCLAMATION:\r\n case Token.TILDE:\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n case Token.TYPEOF:\r\n case Token.VOID:\r\n case Token.DELETE:\r\n return Precedence.UNARY_PREFIX;\r\n\r\n case Token.NEW:\r\n return Precedence.MEMBERACCESS;\r\n\r\n default:\r\n return Precedence.INVALID;\r\n }\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): i32 {\r\n switch (kind) {\r\n\r\n case Token.COMMA:\r\n return Precedence.COMMA;\r\n\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n return Precedence.ASSIGNMENT;\r\n\r\n case Token.QUESTION:\r\n return Precedence.CONDITIONAL;\r\n\r\n case Token.BAR_BAR:\r\n return Precedence.LOGICAL_OR;\r\n\r\n case Token.AMPERSAND_AMPERSAND:\r\n return Precedence.LOGICAL_AND;\r\n\r\n case Token.BAR:\r\n return Precedence.BITWISE_OR;\r\n\r\n case Token.CARET:\r\n return Precedence.BITWISE_XOR;\r\n\r\n case Token.AMPERSAND:\r\n return Precedence.BITWISE_AND;\r\n\r\n case Token.EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS:\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n return Precedence.EQUALITY;\r\n\r\n case Token.AS:\r\n case Token.IN:\r\n case Token.INSTANCEOF:\r\n case Token.LESSTHAN:\r\n case Token.GREATERTHAN:\r\n case Token.LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_EQUALS:\r\n return Precedence.RELATIONAL;\r\n\r\n case Token.LESSTHAN_LESSTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n return Precedence.SHIFT;\r\n\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n return Precedence.ADDITIVE;\r\n\r\n case Token.ASTERISK:\r\n case Token.SLASH:\r\n case Token.PERCENT:\r\n return Precedence.MULTIPLICATIVE;\r\n\r\n case Token.ASTERISK_ASTERISK:\r\n return Precedence.EXPONENTIATED;\r\n\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n return Precedence.UNARY_POSTFIX;\r\n\r\n case Token.DOT:\r\n case Token.NEW:\r\n case Token.OPENBRACKET:\r\n return Precedence.MEMBERACCESS;\r\n\r\n default:\r\n return Precedence.INVALID;\r\n }\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n switch (kind) {\r\n\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n case Token.QUESTION:\r\n case Token.ASTERISK_ASTERISK:\r\n return true;\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/parser.ts"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///assemblyscript.js","webpack:///webpack/bootstrap 1708a3acc440ab1ab363","webpack:///./src/module.ts","webpack:///./src/diagnostics.ts","webpack:///./src/program.ts","webpack:///(webpack)/buildin/global.js","webpack:///./src/compiler.ts","webpack:///./src/types.ts","webpack:///./src/ast.ts","webpack:///./src/tokenizer.ts","webpack:///./src/diagnosticMessages.generated.ts","webpack:///./src/util/charcode.ts","webpack:///./src/util/path.ts","webpack:///./src/glue/js/index.ts","webpack:///./std/portable.js","webpack:///./src/glue/js/binaryen.js","webpack:///external \"binaryen\"","webpack:///./src/builtins.ts","webpack:///./src/glue/js/i64.js","webpack:///./node_modules/long/src/long.js","webpack:///./src/index.ts","webpack:///./src/decompiler.ts","webpack:///./src/parser.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE_15__","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","allocU8Array","u8s","ptr","allocate_memory","length","idx","k","store","allocI32Array","i32s","val","stringLengthUTF8","str","len","u","charCodeAt","allocString","readInt","load","readBuffer","ret","Uint8Array","readString","cp","u1","u2","u3","u4","u5","arr","Array","push","String","fromCodePoints","value","NativeType","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeUnreachable","_BinaryenTypeAuto","ExpressionId","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallImportId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenPageSize","_BinaryenCurrentMemory","_BinaryenGrowMemory","_BinaryenHasFeature","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","MemorySegment","create","buffer","offset","segment","Module","ref","_BinaryenModuleCreate","out","createFrom","cArr","_BinaryenModuleRead","free_memory","changetype","addFunctionType","result","paramTypes","cStr","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","createI32","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createUnary","op","expr","_BinaryenUnary","createBinary","left","right","_BinaryenBinary","createHost","operands","_BinaryenHost","createGetLocal","index","type","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","bytes","signed","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","label","children","None","_BinaryenBlock","createBreak","condition","_BinaryenBreak","createDrop","expression","_BinaryenDrop","createLoop","body","_BinaryenLoop","createIf","ifTrue","ifFalse","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","strs","_BinaryenSwitch","createCall","target","returnType","_BinaryenCall","createCallImport","_BinaryenCallImport","createUnreachable","_BinaryenUnreachable","addGlobal","mutable","initializer","_BinaryenAddGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addFunctionExport","internalName","externalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","removeImport","_BinaryenRemoveImport","setMemory","initial","maximum","segments","exportName","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","binaryBytes","Binary","output","sourceMap","toText","Error","toAsmjs","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","i32","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","_BinaryenExpressionGetType","I32","_BinaryenConstGetValueI32","I64","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","F32","_BinaryenConstGetValueF32","F64","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","setDebugLocation","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","MAX_MEMORY_WASM32","relooper","_RelooperCreate","createStub","addBlock","code","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","diagnosticCategoryToString","category","DiagnosticCategory","INFO","WARNING","ERROR","diagnosticCategoryToColor","colorBlue","colorYellow","colorRed","formatDiagnosticMessage","message","useColors","showContext","context","range","formatDiagnosticContext","sb","colorReset","toString","source","normalizedPath","line","column","join","text","start","end","charcode_1","isLineBreak","substring","diagnosticMessages_generated_1","diagnosticMessages_generated_2","DiagnosticCode","diagnosticCodeToString","DiagnosticMessage","arg0","arg1","replace","createInfo","createWarning","createError","withRange","DiagnosticEmitter","diagnostics","emitDiagnostic","error","info","warning","__extends","extendStatics","setPrototypeOf","__proto__","b","__","constructor","__values","Symbol","iterator","next","done","__read","r","e","ar","diagnostics_1","types_1","ast_1","module_1","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","QueuedExport","QueuedImport","noTypesYet","Map","Program","_super","_this","diagnosticsOffset","elements","types","typeAliases","sources","initialize","options","Type","i8","i16","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","queuedExports","queuedImports","queuedDerivedClasses","statements","j","statement","kind","NodeKind","CLASSDECLARATION","initializeClass","ENUMDECLARATION","initializeEnum","EXPORT","initializeExports","FUNCTIONDECLARATION","initializeFunction","IMPORT","initializeImports","INTERFACEDECLARATION","initializeInterface","NAMESPACEDECLARATION","initializeNamespace","TYPEDECLARATION","initializeTypeAlias","VARIABLE","initializeVariables","element","queuedImport","tryResolveImport","referencedName","set","splice","referencedNameAlt","Module_0_has_no_exported_member_1","declaration","parent","path","queuedExports_1","queuedExports_1_1","_a","queuedExport","currentExport","isReExport","member","setExportAndCheckLibrary","Cannot_find_name_0","e_1_1","e_1","_b","return","derivedDeclaration","derivedType","assert","extendsType","resolved","resolveIdentifier","ElementKind","CLASS_PROTOTYPE","A_class_may_only_extend_another_class","basePrototype","checkInternalDecorators","isBuiltin","hasDecorator","decorators","ElementFlags","BUILTIN","isLibrary","is","EXPORTED","SOURCE","GLOBAL","has","Duplicate_identifier_0","namespace","fileLevelInternalName","ClassPrototype","isUnmanaged","implementsTypes","Structs_cannot_implement_interfaces","Range","members","Export_declaration_conflicts_with_exported_declaration_of_0","memberDeclarations","memberDeclaration","FIELDDECLARATION","initializeField","METHODDECLARATION","isGetter","hasModifier","ModifierKind","GET","modifiers","SET","initializeAccessor","initializeMethod","instance","resolve","classPrototype","STATIC","staticField","Global","instanceMembers","instanceField","FieldPrototype","CONSTRUCTOR","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperators","decorator","decoratorKind","Operation_not_supported","numArgs","arguments","firstArg","LITERAL","literalKind","fnIndexedGet","simpleName","fnIndexedSet","fnConcat","fnEquals","String_literal_expected","Expected_0_arguments_but_got_1","propertyName","internalPropertyName","propertyElement","PROPERTY","getterPrototype","setterPrototype","Property","staticName","staticPrototype","instanceName","instancePrototype","enm","Enum","values","initializeEnumValue","EnumValue","initializeExport","internalPath","identifier","referencedElement","seen","Set","add","declarations","initializeImport","namespaceName","indexPart","endsWith","InterfacePrototype","queuedExtendingClasses","parentNamespace","Namespace","alias","global","resolveType","node","contextualTypeArguments","reportNotFound","localName","resolveInclTypeArguments","typeArguments","paramType","instanceKey","typesToString","placeholderType","resolveTypeArguments","typeParameters","typeArgumentNodes","alternativeReportNode","parameterCount","argumentCount","Expected_0_type_arguments_but_got_1","atEnd","contextualFunction","contextualEnum","ENUMVALUE","resolvedElement","ResolvedElement","flow","getScopedLocal","resolvePropertyAccess","propertyAccess","targetExpression","resolveExpression","targetType","LOCAL","FIELD","classType","Property_0_does_not_exist_on_type_1","CLASS","withTarget","base","resolveElementAccess","elementAccess","indexedGet","indexedGetName","FUNCTION_PROTOTYPE","Index_signature_is_missing_in_type_0","PARENTHESIZED","ASSERTION","toType","BINARY","THIS","instanceMethodOf","_this_cannot_be_referenced_in_current_location","SUPER","_super_can_only_be_referenced_in_a_derived_class","IDENTIFIER","PROPERTYACCESS","ELEMENTACCESS","CALL","Element","program","flags","NONE","flag","NAMESPACE","modifierKind","IMPORTED","DECLARE","DECLARED","ENUM","CONST","CONSTANT","constantValue","enum","ConstantValueKind","VariableLikeElement","apply","constantValueKind","withConstantIntegerValue","lo","hi","constantIntegerValue","i64_new","INLINED","withConstantFloatValue","constantFloatValue","LET","SCOPED","READONLY","PUBLIC","PRIVATE","PROTECTED","Parameter","Local","instances","classTypeArguments","GETTER","SETTER","ABSTRACT","GENERIC","INSTANCE","functionTypeArguments","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","inheritedName","inheritedType","e_2_1","e_2","classDeclaration","classTypeParameters","functionTypeParameters","parameters","typeNode","parameterTypes","parameterDeclaration","parameterType","classInstance","Function","reportNode","resolvedTypeArguments","resolvePartial","partialPrototype","FUNCTION","locals","additionalLocals","breakContext","debugLocations","nextBreakId","breakStack","tempI32s","tempI64s","tempF32s","tempF64s","localIndex","_c","e_3_1","e_3","_d","parameter","parameterName","Flow","addLocal","local","getTempLocal","temps","toNativeType","pop","freeTempLocal","getAndFreeTempLocal","enterBreakContext","id","leaveBreakContext","finalize","debugLocation","debugInfoRef","debugInfoIndex","toTypeString","FIELD_PROTOTYPE","Field","memoryOffset","UNMANAGED","inheritedTypeArguments_2","inheritedTypeArguments_2_1","e_4_1","e_4","baseClass","baseClassType","Structs_cannot_extend_classes_and_vice_versa","Class","currentMemoryOffset","inheritedMember","e_5_1","e_5","_e","partialConstructor","constructorInstance","_f","_g","fieldDeclaration","fieldType","fieldInstance","byteSize","methodPrototype","instanceProperty","e_6_1","e_6","_h","asClass","baseName","baseType","e_7_1","e_7","INTERFACE_PROTOTYPE","Interface","INTERFACE","FlowFlags","scopedLocals","currentFunction","parentFlow","continueLabel","breakLabel","enterBranchOrScope","branchFlow","leaveBranchOrScope","scopedLocal","e_8_1","e_8","addScopedLocal","current","g","eval","window","makeSmallIntegerWrap","ShrI32","ShlI32","AndI32","makeIsFalseish","EqzI32","EqzI64","size","EqF32","EqF64","makeIsTrueish","NeI32","NeI64","NeF32","NeF64","builtins_1","program_1","tokenizer_1","Options","WASM32","noTreeShaking","noAssert","noMemory","memoryBase","allocateImpl","freeImpl","usize64","usize32","isize64","isize32","ConversionKind","Compiler","startFunctionBody","currentEnum","currentType","memorySegments","stringSegments","files","max","compile","startFunctionPrototype","startFunctionInstance","START","startFunction","isEntry","compileSource","typeRef","typesToNativeTypes","i64_align","isWasm64","pages","i64_shr_u","compileSourceByPath","normalizedPathWithoutExtension","File_0_not_found","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFunction","compileStatement","compileGlobalDeclaration","compileGlobal","COMPILED","initExpr","resolvedType","Type_0_is_not_assignable_to_type_1","Type_expected","compileExpression","nativeType","initializeInStart","compileInlineConstant","precomputeExpressionRef","Compiling_constant_with_non_constant_initializer_as_mutable","toNativeZero","setExpr","exprType","isTopLevel","isTopLevelExport","programLevelInternalName","compileEnum","previousValue","initInStart","valueDeclaration","AddI32","Cannot_export_a_mutable_global","compileFunctionUsingTypeArguments","compileFunction","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","stmts","compileStatements","allBranchesReturn","A_function_whose_declared_type_is_not_void_must_return_a_value","numParameters","numParametersInclThis","paramIndex","nativeResultType","nativeParamTypes","signatureNameParts","toSignatureString","compileInterfaceDeclaration","compileNamespace","ns","compileClassUsingTypeArguments","internalExportName","functionInstance","functionDeclaration","needsExplicitExport","globalDeclaration","compileClass","addMemorySegment","alignment","i64_add","BLOCK","compileBlockStatement","BREAK","compileBreakStatement","CONTINUE","compileContinueStatement","DO","compileDoStatement","EMPTY","compileEmptyStatement","EXPRESSION","compileExpressionStatement","FOR","compileForStatement","IF","compileIfStatement","RETURN","compileReturnStatement","SWITCH","compileSwitchStatement","THROW","compileThrowStatement","TRY","compileTryStatement","WHILE","compileWhileStatement","addDebugLocation","stmt","stmtReturns","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","previousBreakLabel","previousContinueLabel","incrementor","alwaysReturns","ifTrueReturns","ifFalseReturns","tempLocal","cases","breaks","breakIndex","defaultIndex","case_","EqI32","currentBlock","fallsThrough","nextLabel","isKnownGlobal","initializers","init","_const_declarations_must_be_initialized","compileAssignmentWithValue","contextualType","shift","computeSmallIntegerShift","mask","computeSmallIntegerMask","conversionKind","wrapSmallIntegers","compileAssertionExpression","compileBinaryExpression","compileCallExpression","COMMA","compileCommaExpression","compileElementAccessExpression","FALSE","NULL","TRUE","compileIdentifierExpression","compileLiteralExpression","NEW","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","TERNARY","compileTernaryExpression","UNARYPOSTFIX","compileUnaryPostfixExpression","UNARYPREFIX","compileUnaryPrefixExpression","convertExpression","precomputeExpression","funcRef","_BinaryenFunctionGetBody","fromType","mod","losesInformation","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast","compound","possiblyOverflows","operator","Token","LESSTHAN","LtI32","LtI64","LtU32","LtU64","LtF32","LtF64","GREATERTHAN","GtI32","GtI64","GtU32","GtU64","GtF32","GtF64","LESSTHAN_EQUALS","LeI32","LeI64","LeU32","LeU64","LeF32","LeF64","GREATERTHAN_EQUALS","GeI32","GeI64","GeU32","GeU64","GeF32","GeF64","EQUALS_EQUALS_EQUALS","EQUALS_EQUALS","EqI64","EXCLAMATION_EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS","compileAssignment","PLUS_EQUALS","PLUS","AddI64","AddF32","AddF64","MINUS_EQUALS","MINUS","SubI32","SubI64","SubF32","SubF64","ASTERISK_EQUALS","ASTERISK","MulI32","MulI64","MulF32","MulF64","SLASH_EQUALS","SLASH","DivI32","DivI64","DivU32","DivU64","DivF32","DivF64","PERCENT_EQUALS","PERCENT","RemI32","RemI64","RemU32","RemU64","LESSTHAN_LESSTHAN_EQUALS","LESSTHAN_LESSTHAN","ShlI64","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN","ShrI64","ShrU32","ShrU64","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND_EQUALS","AMPERSAND","AndI64","BAR_EQUALS","BAR","OrI32","OrI64","CARET_EQUALS","CARET","XorI32","XorI64","AMPERSAND_AMPERSAND","BAR_BAR","valueExpression","elementType","setterInstance","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","resolvedIndexedSet","valueWithCorrectType","tee","targetExpr","globalNativeType","isReadonly","elementNativeType","makeCall","getterInstance","resolvedIndexedGet","indexedSet","indexedSetName","elementExpr","elementExpression","Index_signature_in_type_0_only_permits_reading","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","functionPrototype","compileCall","numArguments","numArgumentsInclThis","argumentIndex","args","argumentExpressions","thisArg","operandIndex","Expected_at_least_0_arguments_but_got_1","expressions","exprs","compileGetConstant","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileStaticArray","elementExpressions","floatValue","intValue","i64_sub","i64_is_i8","i64_is_i16","i64_is_i32","i64_is_u8","i64_is_u16","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStaticString","stringValue","stringSegment","stringLength","stringBuffer","stringOffset","isStatic","Int32Array","Float32Array","Float64Array","thisExpr","compileAllocate","field","nativeSizeType","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","ifThen","ifElse","nativeOne","getValue","operand","PLUS_PLUS","toNativeOne","MINUS_MINUS","setValue","isReference","NegF32","NegF64","EXCLAMATION","TILDE","toNativeNegOne","TYPEOF","TypeKind","TypeFlags","nullableType","ceil","nonNullableType","asFunction","asNullable","kindOnly","setReusableModifiers","reusableModifiers","createModifiers","addModifier","modifier","getModifier","getFirstDecorator","mangleInternalName","asGlobal","VARIABLEDECLARATION","mangleInternalPath","setParent","nodes","setParentOpt","path_1","Node","createType","isNullable","TypeNode","createIdentifierExpression","IdentifierExpression","createArrayLiteralExpression","ArrayLiteralExpression","createAssertionExpression","assertionKind","AssertionExpression","createBinaryExpression","BinaryExpression","createCallExpression","typeArgs","CallExpression","createCommaExpression","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","ElementAccessExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","BlockStatement","createBreakStatement","BreakStatement","createClassDeclaration","ClassDeclaration","createContinueStatement","ContinueStatement","createDecorator","Decorator","createDoStatement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","ExportStatement","normalize","startsWith","createExportImportStatement","ExportImportStatement","createExportMember","elem","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","IfStatement","createImportStatement","decls","ImportStatement","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","ForStatement","createTypeParameter","TypeParameter","createParameter","parameterKind","createFunctionDeclaration","FunctionDeclaration","createMethodDeclaration","MethodDeclaration","createModifier","Modifier","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createWhileStatement","WhileStatement","TYPE","TYPEPARAMETER","Expression","LiteralKind","LiteralExpression","AssertionKind","UnaryExpression","Statement","SourceKind","Source","tokenizer","sourceKind","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","VariableLikeDeclarationStatement","DecoratorKind","DECORATOR","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","IMPORTDECLARATION","ParameterKind","PARAMETER","MODIFIER","SWITCHCASE","fromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","INSTANCEOF","IS","KEYOF","MODULE","OF","PACKAGE","VAR","VOID","WITH","YIELD","INVALID","isAlsoIdentifier","token","a","pos","Tokenizer","tokenPos","markedPos","markedToken","markedTokenPos","nextToken","nextTokenOnNewLine","preferIdentifier","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","ASTERISK_ASTERISK_EQUALS","ASTERISK_ASTERISK","isDecimalDigit","FLOATLITERAL","DOT_DOT_DOT","DOT","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordText","keywordToken","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skip","mark","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","i64_mul","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","parseFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","isUnicodeIdentifierStart","isUnicodeIdentifierPart","lookupInUnicodeMap","map","mid","unicodeIdentifierStart","unicodeIdentifierPart","CharCode","separator","ipos","origin","dirname","UnreachableError","captureStackTrace","stack","AssertionError","globalScope","defineProperties","MIN_VALUE","writable","Math","fround","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","EPSILON","clz32","abs","min","floor","sqrt","trunc","isTrueish","radix","parseInt","undefined","fromCodePoint","binaryen","Binaryen","key","_malloc","_free","move_memory","dest","src","_memmove","HEAPU8","previousPrint","print","x","_BinaryenModulePrint","_BinaryenModulePrintAsmjs","compiler","NaN","Infinity","arg2","tempLocal0","tempLocal1","AbsF32","AbsF64","ClzI32","ClzI64","CtzI32","CtzI64","PopcntI32","PopcntI64","RotlI32","RotlI64","RotrI32","RotrI64","MaxF32","MaxF64","MinF32","MinF64","CeilF32","CeilF64","FloorF32","FloorF64","CopysignF32","CopysignF64","NearestF32","NearestF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","SqrtF32","SqrtF64","TruncF32","TruncF64","evaluateConstantOffset","Type_0_is_not_generic","CurrentMemory","GrowMemory","abort","compileAbort","cls","Implementation_0_must_match_the_signature_1","abortPrototype","stringType","abortInstance","Long","fromBits","low","high","sub","mul","i64_div","div","i64_div_u","toUnsigned","toSigned","i64_rem","i64_rem_u","i64_and","and","i64_or","or","i64_xor","xor","i64_shl","shl","i64_shr","shr","shru","i64_not","not","fromInt","minSafeF32","fromNumber","maxSafeF32","gte","lte","minSafeF64","maxSafeF64","toNumber","i64_to_string","unsigned","isLong","obj","cachedObj","cache","UINT_CACHE","INT_CACHE","isNaN","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","fromString","RangeError","indexOf","radixToPower","pow_dbl","power","fromValue","wasm","WebAssembly","Instance","__isLong__","pow","TWO_PWR_16_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","toInt","isZero","isNegative","eq","radixLong","rem1","rem","remDiv","intval","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","other","notEquals","neq","ne","lessThan","comp","lt","lessThanOrEqual","le","greaterThan","gt","greaterThanOrEqual","ge","compare","thisNeg","otherNeg","negate","addend","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","divide","divisor","div_u","div_s","approx","res","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toBytes","toBytesLE","toBytesBE","fromBytes","fromBytesLE","fromBytesBE","parseFile","parser","parser_1","Parser","nextFile","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setNoMemory","setSourceMap","setMemoryBase","decompile","decompiler","decompiler_1","Decompiler","formatDiagnostic","nativeTypeToType","Unreachable","Auto","functionId","decompileFunction","_BinaryenFunctionGetName","_BinaryenFunctionGetNumParams","_BinaryenFunctionGetParam","_BinaryenFunctionGetResult","Block","decompileExpression","nested","string","_BinaryenBlockGetName","_BinaryenBlockGetNumChildren","_BinaryenBlockGetChild","If","_BinaryenIfGetCondition","_BinaryenIfGetIfTrue","_BinaryenIfGetIfFalse","Loop","_BinaryenLoopGetName","_BinaryenLoopGetBody","Break","_BinaryenBreakGetCondition","_BinaryenBreakGetName","Switch","Call","CallImport","CallIndirect","SetLocal","_BinaryenSetLocalGetIndex","_BinaryenSetLocalGetValue","SetGlobal","Store","_BinaryenStoreGetOffset","_BinaryenStoreGetPtr","_BinaryenStoreGetValue","Select","_BinaryenSelectGetIfTrue","_BinaryenSelectGetIfFalse","_BinaryenSelectGetCondition","Drop","_BinaryenDropGetValue","Return","_BinaryenReturnGetValue","Host","_BinaryenHostGetOp","_BinaryenHostGetOperand","Nop","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","determinePrecedenceStart","determinePrecedence","isRightAssociative","backlog","seenlog","tn","parseTopLevelStatement","isNamespaceMember","parseDecorator","Line_break_not_permitted_here","parseEnum","parseVariable","parseFunction","parseClass","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","parseStatement","Decorators_are_not_valid_here","clear","parseType","acceptParenthesized","suppressErrors","startPos","innerType","Identifier_expected","nullable","bracketStart","bracketRange","parseArguments","isDeclare","parseVariableDeclaration","parentModifiers","parentDecorators","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","parseEnumValue","parseReturn","parseTypeParameters","Type_parameter_list_cannot_be_empty","typeParameter","parseTypeParameter","parseParameters","seenRest","seenOptional","reportedRest","param","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","OPTIONAL","REST","isRest","isOptional","startRange","A_rest_parameter_cannot_be_optional","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseClassMember","parentIsDeclare","isConstructor","Type_parameters_cannot_appear_on_a_constructor_declaration","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","retMethod","Constructor_implementation_is_missing","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","parseBlockStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseWhileStatement","parseExpressionStatement","elseStatement","parseSwitchCase","_case_or_default_expected","parseExpressionStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","precedence","nextPrecedence","commaExprs","propertyCall","Precedence"],"mappings":"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,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCC,GACJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MA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","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_15__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_15__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 11);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar NativeType;\r\n(function (NativeType) {\r\n NativeType[NativeType[\"None\"] = _BinaryenTypeNone()] = \"None\";\r\n NativeType[NativeType[\"I32\"] = _BinaryenTypeInt32()] = \"I32\";\r\n NativeType[NativeType[\"I64\"] = _BinaryenTypeInt64()] = \"I64\";\r\n NativeType[NativeType[\"F32\"] = _BinaryenTypeFloat32()] = \"F32\";\r\n NativeType[NativeType[\"F64\"] = _BinaryenTypeFloat64()] = \"F64\";\r\n NativeType[NativeType[\"Unreachable\"] = _BinaryenTypeUnreachable()] = \"Unreachable\";\r\n NativeType[NativeType[\"Auto\"] = _BinaryenTypeAuto()] = \"Auto\";\r\n})(NativeType = exports.NativeType || (exports.NativeType = {}));\r\nvar ExpressionId;\r\n(function (ExpressionId) {\r\n ExpressionId[ExpressionId[\"Invalid\"] = _BinaryenInvalidId()] = \"Invalid\";\r\n ExpressionId[ExpressionId[\"Block\"] = _BinaryenBlockId()] = \"Block\";\r\n ExpressionId[ExpressionId[\"If\"] = _BinaryenIfId()] = \"If\";\r\n ExpressionId[ExpressionId[\"Loop\"] = _BinaryenLoopId()] = \"Loop\";\r\n ExpressionId[ExpressionId[\"Break\"] = _BinaryenBreakId()] = \"Break\";\r\n ExpressionId[ExpressionId[\"Switch\"] = _BinaryenSwitchId()] = \"Switch\";\r\n ExpressionId[ExpressionId[\"Call\"] = _BinaryenCallId()] = \"Call\";\r\n ExpressionId[ExpressionId[\"CallImport\"] = _BinaryenCallImportId()] = \"CallImport\";\r\n ExpressionId[ExpressionId[\"CallIndirect\"] = _BinaryenCallIndirectId()] = \"CallIndirect\";\r\n ExpressionId[ExpressionId[\"GetLocal\"] = _BinaryenGetLocalId()] = \"GetLocal\";\r\n ExpressionId[ExpressionId[\"SetLocal\"] = _BinaryenSetLocalId()] = \"SetLocal\";\r\n ExpressionId[ExpressionId[\"GetGlobal\"] = _BinaryenGetGlobalId()] = \"GetGlobal\";\r\n ExpressionId[ExpressionId[\"SetGlobal\"] = _BinaryenSetGlobalId()] = \"SetGlobal\";\r\n ExpressionId[ExpressionId[\"Load\"] = _BinaryenLoadId()] = \"Load\";\r\n ExpressionId[ExpressionId[\"Store\"] = _BinaryenStoreId()] = \"Store\";\r\n ExpressionId[ExpressionId[\"Const\"] = _BinaryenConstId()] = \"Const\";\r\n ExpressionId[ExpressionId[\"Unary\"] = _BinaryenUnaryId()] = \"Unary\";\r\n ExpressionId[ExpressionId[\"Binary\"] = _BinaryenBinaryId()] = \"Binary\";\r\n ExpressionId[ExpressionId[\"Select\"] = _BinaryenSelectId()] = \"Select\";\r\n ExpressionId[ExpressionId[\"Drop\"] = _BinaryenDropId()] = \"Drop\";\r\n ExpressionId[ExpressionId[\"Return\"] = _BinaryenReturnId()] = \"Return\";\r\n ExpressionId[ExpressionId[\"Host\"] = _BinaryenHostId()] = \"Host\";\r\n ExpressionId[ExpressionId[\"Nop\"] = _BinaryenNopId()] = \"Nop\";\r\n ExpressionId[ExpressionId[\"Unreachable\"] = _BinaryenUnreachableId()] = \"Unreachable\";\r\n ExpressionId[ExpressionId[\"AtomicCmpxchg\"] = _BinaryenAtomicCmpxchgId()] = \"AtomicCmpxchg\";\r\n ExpressionId[ExpressionId[\"AtomicRMW\"] = _BinaryenAtomicRMWId()] = \"AtomicRMW\";\r\n ExpressionId[ExpressionId[\"AtomicWait\"] = _BinaryenAtomicWaitId()] = \"AtomicWait\";\r\n ExpressionId[ExpressionId[\"AtomicWake\"] = _BinaryenAtomicWakeId()] = \"AtomicWake\";\r\n})(ExpressionId = exports.ExpressionId || (exports.ExpressionId = {}));\r\nvar UnaryOp;\r\n(function (UnaryOp) {\r\n UnaryOp[UnaryOp[\"ClzI32\"] = _BinaryenClzInt32()] = \"ClzI32\";\r\n UnaryOp[UnaryOp[\"CtzI32\"] = _BinaryenCtzInt32()] = \"CtzI32\";\r\n UnaryOp[UnaryOp[\"PopcntI32\"] = _BinaryenPopcntInt32()] = \"PopcntI32\";\r\n UnaryOp[UnaryOp[\"NegF32\"] = _BinaryenNegFloat32()] = \"NegF32\";\r\n UnaryOp[UnaryOp[\"AbsF32\"] = _BinaryenAbsFloat32()] = \"AbsF32\";\r\n UnaryOp[UnaryOp[\"CeilF32\"] = _BinaryenCeilFloat32()] = \"CeilF32\";\r\n UnaryOp[UnaryOp[\"FloorF32\"] = _BinaryenFloorFloat32()] = \"FloorF32\";\r\n UnaryOp[UnaryOp[\"TruncF32\"] = _BinaryenTruncFloat32()] = \"TruncF32\";\r\n UnaryOp[UnaryOp[\"NearestF32\"] = _BinaryenNearestFloat32()] = \"NearestF32\";\r\n UnaryOp[UnaryOp[\"SqrtF32\"] = _BinaryenSqrtFloat32()] = \"SqrtF32\";\r\n UnaryOp[UnaryOp[\"EqzI32\"] = _BinaryenEqZInt32()] = \"EqzI32\";\r\n UnaryOp[UnaryOp[\"ClzI64\"] = _BinaryenClzInt64()] = \"ClzI64\";\r\n UnaryOp[UnaryOp[\"CtzI64\"] = _BinaryenCtzInt64()] = \"CtzI64\";\r\n UnaryOp[UnaryOp[\"PopcntI64\"] = _BinaryenPopcntInt64()] = \"PopcntI64\";\r\n UnaryOp[UnaryOp[\"NegF64\"] = _BinaryenNegFloat64()] = \"NegF64\";\r\n UnaryOp[UnaryOp[\"AbsF64\"] = _BinaryenAbsFloat64()] = \"AbsF64\";\r\n UnaryOp[UnaryOp[\"CeilF64\"] = _BinaryenCeilFloat64()] = \"CeilF64\";\r\n UnaryOp[UnaryOp[\"FloorF64\"] = _BinaryenFloorFloat64()] = \"FloorF64\";\r\n UnaryOp[UnaryOp[\"TruncF64\"] = _BinaryenTruncFloat64()] = \"TruncF64\";\r\n UnaryOp[UnaryOp[\"NearestF64\"] = _BinaryenNearestFloat64()] = \"NearestF64\";\r\n UnaryOp[UnaryOp[\"SqrtF64\"] = _BinaryenSqrtFloat64()] = \"SqrtF64\";\r\n UnaryOp[UnaryOp[\"EqzI64\"] = _BinaryenEqZInt64()] = \"EqzI64\";\r\n UnaryOp[UnaryOp[\"ExtendI32\"] = _BinaryenExtendSInt32()] = \"ExtendI32\";\r\n UnaryOp[UnaryOp[\"ExtendU32\"] = _BinaryenExtendUInt32()] = \"ExtendU32\";\r\n UnaryOp[UnaryOp[\"WrapI64\"] = _BinaryenWrapInt64()] = \"WrapI64\";\r\n UnaryOp[UnaryOp[\"TruncF32ToI32\"] = _BinaryenTruncSFloat32ToInt32()] = \"TruncF32ToI32\";\r\n UnaryOp[UnaryOp[\"TruncF32ToI64\"] = _BinaryenTruncSFloat32ToInt64()] = \"TruncF32ToI64\";\r\n UnaryOp[UnaryOp[\"TruncF32ToU32\"] = _BinaryenTruncUFloat32ToInt32()] = \"TruncF32ToU32\";\r\n UnaryOp[UnaryOp[\"TruncF32ToU64\"] = _BinaryenTruncUFloat32ToInt64()] = \"TruncF32ToU64\";\r\n UnaryOp[UnaryOp[\"TruncF64ToI32\"] = _BinaryenTruncSFloat64ToInt32()] = \"TruncF64ToI32\";\r\n UnaryOp[UnaryOp[\"TruncF64ToI64\"] = _BinaryenTruncSFloat64ToInt64()] = \"TruncF64ToI64\";\r\n UnaryOp[UnaryOp[\"TruncF64ToU32\"] = _BinaryenTruncUFloat64ToInt32()] = \"TruncF64ToU32\";\r\n UnaryOp[UnaryOp[\"TruncF64ToU64\"] = _BinaryenTruncUFloat64ToInt64()] = \"TruncF64ToU64\";\r\n UnaryOp[UnaryOp[\"ReinterpretF32\"] = _BinaryenReinterpretFloat32()] = \"ReinterpretF32\";\r\n UnaryOp[UnaryOp[\"ReinterpretF64\"] = _BinaryenReinterpretFloat64()] = \"ReinterpretF64\";\r\n UnaryOp[UnaryOp[\"ConvertI32ToF32\"] = _BinaryenConvertSInt32ToFloat32()] = \"ConvertI32ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertI32ToF64\"] = _BinaryenConvertSInt32ToFloat64()] = \"ConvertI32ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertU32ToF32\"] = _BinaryenConvertUInt32ToFloat32()] = \"ConvertU32ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertU32ToF64\"] = _BinaryenConvertUInt32ToFloat64()] = \"ConvertU32ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertI64ToF32\"] = _BinaryenConvertSInt64ToFloat32()] = \"ConvertI64ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertI64ToF64\"] = _BinaryenConvertSInt64ToFloat64()] = \"ConvertI64ToF64\";\r\n UnaryOp[UnaryOp[\"ConvertU64ToF32\"] = _BinaryenConvertUInt64ToFloat32()] = \"ConvertU64ToF32\";\r\n UnaryOp[UnaryOp[\"ConvertU64ToF64\"] = _BinaryenConvertUInt64ToFloat64()] = \"ConvertU64ToF64\";\r\n UnaryOp[UnaryOp[\"PromoteF32\"] = _BinaryenPromoteFloat32()] = \"PromoteF32\";\r\n UnaryOp[UnaryOp[\"DemoteF64\"] = _BinaryenDemoteFloat64()] = \"DemoteF64\";\r\n UnaryOp[UnaryOp[\"ReinterpretI32\"] = _BinaryenReinterpretInt32()] = \"ReinterpretI32\";\r\n UnaryOp[UnaryOp[\"ReinterpretI64\"] = _BinaryenReinterpretInt64()] = \"ReinterpretI64\";\r\n // see: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#new-sign-extending-operators\r\n // ExtendI8ToI32 =_BinaryenExtendS8Int32()\r\n // ExtendI16ToI32 = _BinaryenExtendS16Int32()\r\n // ExtendI8ToI64 = _BinaryenExtendS8Int64() // operand is I64\r\n // ExtendI16ToI64 = _BinaryenExtendS16Int64()\r\n // ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n})(UnaryOp = exports.UnaryOp || (exports.UnaryOp = {}));\r\nvar BinaryOp;\r\n(function (BinaryOp) {\r\n BinaryOp[BinaryOp[\"AddI32\"] = _BinaryenAddInt32()] = \"AddI32\";\r\n BinaryOp[BinaryOp[\"SubI32\"] = _BinaryenSubInt32()] = \"SubI32\";\r\n BinaryOp[BinaryOp[\"MulI32\"] = _BinaryenMulInt32()] = \"MulI32\";\r\n BinaryOp[BinaryOp[\"DivI32\"] = _BinaryenDivSInt32()] = \"DivI32\";\r\n BinaryOp[BinaryOp[\"DivU32\"] = _BinaryenDivUInt32()] = \"DivU32\";\r\n BinaryOp[BinaryOp[\"RemI32\"] = _BinaryenRemSInt32()] = \"RemI32\";\r\n BinaryOp[BinaryOp[\"RemU32\"] = _BinaryenRemUInt32()] = \"RemU32\";\r\n BinaryOp[BinaryOp[\"AndI32\"] = _BinaryenAndInt32()] = \"AndI32\";\r\n BinaryOp[BinaryOp[\"OrI32\"] = _BinaryenOrInt32()] = \"OrI32\";\r\n BinaryOp[BinaryOp[\"XorI32\"] = _BinaryenXorInt32()] = \"XorI32\";\r\n BinaryOp[BinaryOp[\"ShlI32\"] = _BinaryenShlInt32()] = \"ShlI32\";\r\n BinaryOp[BinaryOp[\"ShrU32\"] = _BinaryenShrUInt32()] = \"ShrU32\";\r\n BinaryOp[BinaryOp[\"ShrI32\"] = _BinaryenShrSInt32()] = \"ShrI32\";\r\n BinaryOp[BinaryOp[\"RotlI32\"] = _BinaryenRotLInt32()] = \"RotlI32\";\r\n BinaryOp[BinaryOp[\"RotrI32\"] = _BinaryenRotRInt32()] = \"RotrI32\";\r\n BinaryOp[BinaryOp[\"EqI32\"] = _BinaryenEqInt32()] = \"EqI32\";\r\n BinaryOp[BinaryOp[\"NeI32\"] = _BinaryenNeInt32()] = \"NeI32\";\r\n BinaryOp[BinaryOp[\"LtI32\"] = _BinaryenLtSInt32()] = \"LtI32\";\r\n BinaryOp[BinaryOp[\"LtU32\"] = _BinaryenLtUInt32()] = \"LtU32\";\r\n BinaryOp[BinaryOp[\"LeI32\"] = _BinaryenLeSInt32()] = \"LeI32\";\r\n BinaryOp[BinaryOp[\"LeU32\"] = _BinaryenLeUInt32()] = \"LeU32\";\r\n BinaryOp[BinaryOp[\"GtI32\"] = _BinaryenGtSInt32()] = \"GtI32\";\r\n BinaryOp[BinaryOp[\"GtU32\"] = _BinaryenGtUInt32()] = \"GtU32\";\r\n BinaryOp[BinaryOp[\"GeI32\"] = _BinaryenGeSInt32()] = \"GeI32\";\r\n BinaryOp[BinaryOp[\"GeU32\"] = _BinaryenGeUInt32()] = \"GeU32\";\r\n BinaryOp[BinaryOp[\"AddI64\"] = _BinaryenAddInt64()] = \"AddI64\";\r\n BinaryOp[BinaryOp[\"SubI64\"] = _BinaryenSubInt64()] = \"SubI64\";\r\n BinaryOp[BinaryOp[\"MulI64\"] = _BinaryenMulInt64()] = \"MulI64\";\r\n BinaryOp[BinaryOp[\"DivI64\"] = _BinaryenDivSInt64()] = \"DivI64\";\r\n BinaryOp[BinaryOp[\"DivU64\"] = _BinaryenDivUInt64()] = \"DivU64\";\r\n BinaryOp[BinaryOp[\"RemI64\"] = _BinaryenRemSInt64()] = \"RemI64\";\r\n BinaryOp[BinaryOp[\"RemU64\"] = _BinaryenRemUInt64()] = \"RemU64\";\r\n BinaryOp[BinaryOp[\"AndI64\"] = _BinaryenAndInt64()] = \"AndI64\";\r\n BinaryOp[BinaryOp[\"OrI64\"] = _BinaryenOrInt64()] = \"OrI64\";\r\n BinaryOp[BinaryOp[\"XorI64\"] = _BinaryenXorInt64()] = \"XorI64\";\r\n BinaryOp[BinaryOp[\"ShlI64\"] = _BinaryenShlInt64()] = \"ShlI64\";\r\n BinaryOp[BinaryOp[\"ShrU64\"] = _BinaryenShrUInt64()] = \"ShrU64\";\r\n BinaryOp[BinaryOp[\"ShrI64\"] = _BinaryenShrSInt64()] = \"ShrI64\";\r\n BinaryOp[BinaryOp[\"RotlI64\"] = _BinaryenRotLInt64()] = \"RotlI64\";\r\n BinaryOp[BinaryOp[\"RotrI64\"] = _BinaryenRotRInt64()] = \"RotrI64\";\r\n BinaryOp[BinaryOp[\"EqI64\"] = _BinaryenEqInt64()] = \"EqI64\";\r\n BinaryOp[BinaryOp[\"NeI64\"] = _BinaryenNeInt64()] = \"NeI64\";\r\n BinaryOp[BinaryOp[\"LtI64\"] = _BinaryenLtSInt64()] = \"LtI64\";\r\n BinaryOp[BinaryOp[\"LtU64\"] = _BinaryenLtUInt64()] = \"LtU64\";\r\n BinaryOp[BinaryOp[\"LeI64\"] = _BinaryenLeSInt64()] = \"LeI64\";\r\n BinaryOp[BinaryOp[\"LeU64\"] = _BinaryenLeUInt64()] = \"LeU64\";\r\n BinaryOp[BinaryOp[\"GtI64\"] = _BinaryenGtSInt64()] = \"GtI64\";\r\n BinaryOp[BinaryOp[\"GtU64\"] = _BinaryenGtUInt64()] = \"GtU64\";\r\n BinaryOp[BinaryOp[\"GeI64\"] = _BinaryenGeSInt64()] = \"GeI64\";\r\n BinaryOp[BinaryOp[\"GeU64\"] = _BinaryenGeUInt64()] = \"GeU64\";\r\n BinaryOp[BinaryOp[\"AddF32\"] = _BinaryenAddFloat32()] = \"AddF32\";\r\n BinaryOp[BinaryOp[\"SubF32\"] = _BinaryenSubFloat32()] = \"SubF32\";\r\n BinaryOp[BinaryOp[\"MulF32\"] = _BinaryenMulFloat32()] = \"MulF32\";\r\n BinaryOp[BinaryOp[\"DivF32\"] = _BinaryenDivFloat32()] = \"DivF32\";\r\n BinaryOp[BinaryOp[\"CopysignF32\"] = _BinaryenCopySignFloat32()] = \"CopysignF32\";\r\n BinaryOp[BinaryOp[\"MinF32\"] = _BinaryenMinFloat32()] = \"MinF32\";\r\n BinaryOp[BinaryOp[\"MaxF32\"] = _BinaryenMaxFloat32()] = \"MaxF32\";\r\n BinaryOp[BinaryOp[\"EqF32\"] = _BinaryenEqFloat32()] = \"EqF32\";\r\n BinaryOp[BinaryOp[\"NeF32\"] = _BinaryenNeFloat32()] = \"NeF32\";\r\n BinaryOp[BinaryOp[\"LtF32\"] = _BinaryenLtFloat32()] = \"LtF32\";\r\n BinaryOp[BinaryOp[\"LeF32\"] = _BinaryenLeFloat32()] = \"LeF32\";\r\n BinaryOp[BinaryOp[\"GtF32\"] = _BinaryenGtFloat32()] = \"GtF32\";\r\n BinaryOp[BinaryOp[\"GeF32\"] = _BinaryenGeFloat32()] = \"GeF32\";\r\n BinaryOp[BinaryOp[\"AddF64\"] = _BinaryenAddFloat64()] = \"AddF64\";\r\n BinaryOp[BinaryOp[\"SubF64\"] = _BinaryenSubFloat64()] = \"SubF64\";\r\n BinaryOp[BinaryOp[\"MulF64\"] = _BinaryenMulFloat64()] = \"MulF64\";\r\n BinaryOp[BinaryOp[\"DivF64\"] = _BinaryenDivFloat64()] = \"DivF64\";\r\n BinaryOp[BinaryOp[\"CopysignF64\"] = _BinaryenCopySignFloat64()] = \"CopysignF64\";\r\n BinaryOp[BinaryOp[\"MinF64\"] = _BinaryenMinFloat64()] = \"MinF64\";\r\n BinaryOp[BinaryOp[\"MaxF64\"] = _BinaryenMaxFloat64()] = \"MaxF64\";\r\n BinaryOp[BinaryOp[\"EqF64\"] = _BinaryenEqFloat64()] = \"EqF64\";\r\n BinaryOp[BinaryOp[\"NeF64\"] = _BinaryenNeFloat64()] = \"NeF64\";\r\n BinaryOp[BinaryOp[\"LtF64\"] = _BinaryenLtFloat64()] = \"LtF64\";\r\n BinaryOp[BinaryOp[\"LeF64\"] = _BinaryenLeFloat64()] = \"LeF64\";\r\n BinaryOp[BinaryOp[\"GtF64\"] = _BinaryenGtFloat64()] = \"GtF64\";\r\n BinaryOp[BinaryOp[\"GeF64\"] = _BinaryenGeFloat64()] = \"GeF64\";\r\n})(BinaryOp = exports.BinaryOp || (exports.BinaryOp = {}));\r\nvar HostOp;\r\n(function (HostOp) {\r\n HostOp[HostOp[\"PageSize\"] = _BinaryenPageSize()] = \"PageSize\";\r\n HostOp[HostOp[\"CurrentMemory\"] = _BinaryenCurrentMemory()] = \"CurrentMemory\";\r\n HostOp[HostOp[\"GrowMemory\"] = _BinaryenGrowMemory()] = \"GrowMemory\";\r\n HostOp[HostOp[\"HasFeature\"] = _BinaryenHasFeature()] = \"HasFeature\";\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n})(HostOp = exports.HostOp || (exports.HostOp = {}));\r\nvar AtomicRMWOp;\r\n(function (AtomicRMWOp) {\r\n AtomicRMWOp[AtomicRMWOp[\"Add\"] = _BinaryenAtomicRMWAdd()] = \"Add\";\r\n AtomicRMWOp[AtomicRMWOp[\"Sub\"] = _BinaryenAtomicRMWSub()] = \"Sub\";\r\n AtomicRMWOp[AtomicRMWOp[\"And\"] = _BinaryenAtomicRMWAnd()] = \"And\";\r\n AtomicRMWOp[AtomicRMWOp[\"Or\"] = _BinaryenAtomicRMWOr()] = \"Or\";\r\n AtomicRMWOp[AtomicRMWOp[\"Xor\"] = _BinaryenAtomicRMWXor()] = \"Xor\";\r\n AtomicRMWOp[AtomicRMWOp[\"Xchg\"] = _BinaryenAtomicRMWXchg()] = \"Xchg\";\r\n})(AtomicRMWOp = exports.AtomicRMWOp || (exports.AtomicRMWOp = {}));\r\nvar MemorySegment = /** @class */ (function () {\r\n function MemorySegment() {\r\n }\r\n MemorySegment.create = function (buffer, offset) {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n };\r\n return MemorySegment;\r\n}());\r\nexports.MemorySegment = MemorySegment;\r\nvar Module = /** @class */ (function () {\r\n function Module() {\r\n }\r\n // TODO: static readonly MAX_MEMORY_WASM64\r\n Module.create = function () {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.out = allocate_memory(16);\r\n return module;\r\n };\r\n Module.createFrom = function (buffer) {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.out = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n return module;\r\n }\r\n finally {\r\n free_memory(changetype(cArr));\r\n }\r\n };\r\n // types\r\n Module.prototype.addFunctionType = function (name, result, paramTypes) {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.getFunctionTypeBySignature = function (result, paramTypes) {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n // constants\r\n Module.prototype.createI32 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createI64 = function (valueLow, valueHigh) {\r\n if (valueHigh === void 0) { valueHigh = 0; }\r\n var out = this.out;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createF32 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n Module.prototype.createF64 = function (value) {\r\n var out = this.out;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n };\r\n // expressions\r\n Module.prototype.createUnary = function (op, expr) {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n };\r\n Module.prototype.createBinary = function (op, left, right) {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n };\r\n Module.prototype.createHost = function (op, name, operands) {\r\n if (name === void 0) { name = null; }\r\n if (operands === void 0) { operands = null; }\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? operands.length : 0);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createGetLocal = function (index, type) {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n };\r\n Module.prototype.createTeeLocal = function (index, value) {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n };\r\n Module.prototype.createGetGlobal = function (name, type) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createLoad = function (bytes, signed, ptr, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n };\r\n Module.prototype.createStore = function (bytes, ptr, value, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicLoad = function (bytes, ptr, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n };\r\n Module.prototype.createAtomicStore = function (bytes, ptr, value, type, offset) {\r\n if (offset === void 0) { offset = 0; }\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicRMW = function (op, bytes, offset, ptr, value, type) {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n };\r\n Module.prototype.createAtomicCmpxchg = function (bytes, offset, ptr, expected, replacement, type) {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n };\r\n Module.prototype.createAtomicWait = function (ptr, expected, timeout, expectedType) {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n };\r\n Module.prototype.createAtomicWake = function (ptr, wakeCount) {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n };\r\n // statements\r\n Module.prototype.createSetLocal = function (index, value) {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n };\r\n Module.prototype.createSetGlobal = function (name, value) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createBlock = function (label, children, type) {\r\n if (type === void 0) { type = NativeType.None; }\r\n var cStr = allocString(label);\r\n var cArr = allocI32Array(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createBreak = function (label, condition, value) {\r\n if (condition === void 0) { condition = 0; }\r\n if (value === void 0) { value = 0; }\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createDrop = function (expression) {\r\n return _BinaryenDrop(this.ref, expression);\r\n };\r\n Module.prototype.createLoop = function (label, body) {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createIf = function (condition, ifTrue, ifFalse) {\r\n if (ifFalse === void 0) { ifFalse = 0; }\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n };\r\n Module.prototype.createNop = function () {\r\n return _BinaryenNop(this.ref);\r\n };\r\n Module.prototype.createReturn = function (expression) {\r\n if (expression === void 0) { expression = 0; }\r\n return _BinaryenReturn(this.ref, expression);\r\n };\r\n Module.prototype.createSelect = function (ifTrue, ifFalse, condition) {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n };\r\n Module.prototype.createSwitch = function (names, defaultName, condition, value) {\r\n if (value === void 0) { value = 0; }\r\n var strs = new Array(names.length);\r\n for (var i = 0, k = names.length; i < k; ++i) {\r\n strs[i] = allocString(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = allocString(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, k, cStr, condition, value);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n free_memory(cArr);\r\n for (i = k - 1; i >= 0; --i)\r\n free_memory(strs[i]);\r\n }\r\n };\r\n Module.prototype.createCall = function (target, operands, returnType) {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createCallImport = function (target, operands, returnType) {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.createUnreachable = function () {\r\n return _BinaryenUnreachable(this.ref);\r\n };\r\n // meta\r\n Module.prototype.addGlobal = function (name, type, mutable, initializer) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunction = function (name, type, varTypes, body) {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes.length, body);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.removeFunction = function (name) {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunctionExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addTableExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addMemoryExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addGlobalExport = function (internalName, externalName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n }\r\n finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.removeExport = function (externalName) {\r\n var cStr = allocString(externalName);\r\n try {\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.addFunctionImport = function (internalName, externalModuleName, externalBaseName, functionType) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addTableImport = function (internalName, externalModuleName, externalBaseName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addMemoryImport = function (internalName, externalModuleName, externalBaseName) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.addGlobalImport = function (internalName, externalModuleName, externalBaseName, globalType) {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n }\r\n finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n };\r\n Module.prototype.removeImport = function (internalName) {\r\n var cStr = allocString(internalName);\r\n try {\r\n _BinaryenRemoveImport(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.setMemory = function (initial, maximum, segments, target, exportName) {\r\n if (exportName === void 0) { exportName = null; }\r\n var cStr = allocString(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var buffer = segments[i].buffer;\r\n var offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == compiler_1.Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n }\r\n finally {\r\n free_memory(cArr3);\r\n free_memory(cArr2);\r\n free_memory(cArr1);\r\n for (i = k - 1; i >= 0; --i)\r\n free_memory(segs[i]);\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.setFunctionTable = function (funcs) {\r\n var cArr = allocI32Array(funcs);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n Module.prototype.setStart = function (func) {\r\n _BinaryenSetStart(this.ref, func);\r\n };\r\n Module.prototype.setOptimizeLevel = function (level) {\r\n if (level === void 0) { level = 2; }\r\n _BinaryenSetOptimizeLevel(level);\r\n };\r\n Module.prototype.setShrinkLevel = function (level) {\r\n if (level === void 0) { level = 1; }\r\n _BinaryenSetShrinkLevel(level);\r\n };\r\n Module.prototype.setDebugInfo = function (on) {\r\n if (on === void 0) { on = false; }\r\n _BinaryenSetDebugInfo(on);\r\n };\r\n Module.prototype.optimize = function (func) {\r\n if (func === void 0) { func = 0; }\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n }\r\n else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n };\r\n Module.prototype.runPasses = function (passes, func) {\r\n if (func === void 0) { func = 0; }\r\n var k = passes.length;\r\n var names = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, k);\r\n }\r\n else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, k);\r\n }\r\n }\r\n finally {\r\n free_memory(cArr);\r\n for (; i >= 0; --i)\r\n free_memory(names[i]);\r\n }\r\n };\r\n Module.prototype.validate = function () {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n };\r\n Module.prototype.interpret = function () {\r\n _BinaryenModuleInterpret(this.ref);\r\n };\r\n Module.prototype.toBinary = function (sourceMapUrl) {\r\n var out = this.out;\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr = 0;\r\n var sourceMapPtr = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n var binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n var ret = new Binary();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n }\r\n finally {\r\n if (cStr)\r\n free_memory(cStr);\r\n if (binaryPtr)\r\n free_memory(binaryPtr);\r\n if (sourceMapPtr)\r\n free_memory(sourceMapPtr);\r\n }\r\n };\r\n Module.prototype.toText = function () {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n };\r\n Module.prototype.toAsmjs = function () {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n };\r\n Module.prototype.dispose = function () {\r\n if (!this.ref)\r\n return; // sic\r\n _BinaryenModuleDispose(this.ref);\r\n free_memory(this.out);\r\n };\r\n Module.prototype.createRelooper = function () {\r\n return Relooper.create(this);\r\n };\r\n Module.prototype.cloneExpression = function (expr, noSideEffects, maxDepth) {\r\n if (noSideEffects === void 0) { noSideEffects = false; }\r\n if (maxDepth === void 0) { maxDepth = i32.MAX_VALUE; }\r\n if (maxDepth < 0)\r\n return 0;\r\n maxDepth -= 1;\r\n var nested1, nested2;\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Const:\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n case NativeType.I64:\r\n return this.createI64(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr));\r\n case NativeType.F32:\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n case NativeType.F64:\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n case ExpressionId.GetLocal:\r\n return _BinaryenGetLocal(this.ref, _BinaryenGetLocalGetIndex(expr), _BinaryenExpressionGetType(expr));\r\n case ExpressionId.GetGlobal:\r\n var globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName)\r\n break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n case ExpressionId.Load:\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref, _BinaryenLoadGetBytes(expr), _BinaryenLoadGetOffset(expr), _BinaryenExpressionGetType(expr), nested1)\r\n : _BinaryenLoad(this.ref, _BinaryenLoadGetBytes(expr), _BinaryenLoadIsSigned(expr) ? 1 : 0, _BinaryenLoadGetOffset(expr), _BinaryenLoadGetAlign(expr), _BinaryenExpressionGetType(expr), nested1);\r\n case ExpressionId.Unary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n case ExpressionId.Binary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n return 0;\r\n };\r\n // source map generation\r\n Module.prototype.addDebugInfoFile = function (name) {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n }\r\n finally {\r\n free_memory(cStr);\r\n }\r\n };\r\n Module.prototype.getDebugInfoFile = function (index) {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n };\r\n Module.prototype.setDebugLocation = function (func, expr, fileIndex, lineNumber, columnNumber) {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n };\r\n Module.MAX_MEMORY_WASM32 = 0xffff;\r\n return Module;\r\n}());\r\nexports.Module = Module;\r\nvar Relooper = /** @class */ (function () {\r\n function Relooper() {\r\n }\r\n Relooper.create = function (module) {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate();\r\n return relooper;\r\n };\r\n Relooper.createStub = function (module) {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = 0;\r\n return relooper;\r\n };\r\n Relooper.prototype.addBlock = function (code) {\r\n return _RelooperAddBlock(this.ref, code);\r\n };\r\n Relooper.prototype.addBranch = function (from, to, condition, code) {\r\n if (condition === void 0) { condition = 0; }\r\n if (code === void 0) { code = 0; }\r\n _RelooperAddBranch(from, to, condition, code);\r\n };\r\n Relooper.prototype.addBlockWithSwitch = function (code, condition) {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n };\r\n Relooper.prototype.addBranchForSwitch = function (from, to, indexes, code) {\r\n if (code === void 0) { code = 0; }\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n }\r\n finally {\r\n free_memory(cArr);\r\n }\r\n };\r\n Relooper.prototype.renderAndDispose = function (entry, labelHelper) {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n };\r\n return Relooper;\r\n}());\r\nexports.Relooper = Relooper;\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\nfunction allocU8Array(u8s) {\r\n if (!u8s)\r\n return 0;\r\n var ptr = allocate_memory(u8s.length);\r\n var idx = ptr;\r\n for (var i = 0, k = u8s.length; i < k; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\nfunction allocI32Array(i32s) {\r\n if (!i32s)\r\n return 0;\r\n var ptr = allocate_memory(i32s.length << 2);\r\n var idx = ptr;\r\n for (var i = 0, k = i32s.length; i < k; ++i) {\r\n var val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx, (val & 0xff));\r\n store(idx + 1, ((val >> 8) & 0xff));\r\n store(idx + 2, ((val >> 16) & 0xff));\r\n store(idx + 3, (val >>> 24));\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\nfunction stringLengthUTF8(str) {\r\n var len = 0;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n }\r\n else if (u <= 0x7FF) {\r\n len += 2;\r\n }\r\n else if (u <= 0xFFFF) {\r\n len += 3;\r\n }\r\n else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n }\r\n else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n }\r\n else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\nfunction allocString(str) {\r\n if (str == null)\r\n return 0;\r\n var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n var idx = ptr;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u);\r\n }\r\n else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24)));\r\n store(idx++, (0x80 | ((u >>> 18) & 63)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n else {\r\n store(idx++, (0xFC | (u >>> 30)));\r\n store(idx++, (0x80 | ((u >>> 24) & 63)));\r\n store(idx++, (0x80 | ((u >>> 18) & 63)));\r\n store(idx++, (0x80 | ((u >>> 12) & 63)));\r\n store(idx++, (0x80 | ((u >>> 6) & 63)));\r\n store(idx++, (0x80 | (u & 63)));\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\nfunction readInt(ptr) {\r\n return (load(ptr) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24));\r\n}\r\nexports.readInt = readInt;\r\nfunction readBuffer(ptr, length) {\r\n var ret = new Uint8Array(length);\r\n for (var i = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\nexports.readBuffer = readBuffer;\r\nfunction readString(ptr) {\r\n if (!ptr)\r\n return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp;\r\n var u1, u2, u3, u4, u5;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n }\r\n else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n }\r\n else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n }\r\n else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\nexports.readString = readString;\r\n/** Result structure of {@link Module#toBinary}. */\r\nvar Binary = /** @class */ (function () {\r\n function Binary() {\r\n }\r\n return Binary;\r\n}());\r\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnosticMessages_generated_1 = __webpack_require__(8);\r\nvar charcode_1 = __webpack_require__(9);\r\nvar diagnosticMessages_generated_2 = __webpack_require__(8);\r\nexports.DiagnosticCode = diagnosticMessages_generated_2.DiagnosticCode;\r\nexports.diagnosticCodeToString = diagnosticMessages_generated_2.diagnosticCodeToString;\r\nvar DiagnosticCategory;\r\n(function (DiagnosticCategory) {\r\n DiagnosticCategory[DiagnosticCategory[\"INFO\"] = 0] = \"INFO\";\r\n DiagnosticCategory[DiagnosticCategory[\"WARNING\"] = 1] = \"WARNING\";\r\n DiagnosticCategory[DiagnosticCategory[\"ERROR\"] = 2] = \"ERROR\";\r\n})(DiagnosticCategory = exports.DiagnosticCategory || (exports.DiagnosticCategory = {}));\r\nfunction diagnosticCategoryToString(category) {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return \"INFO\";\r\n case DiagnosticCategory.WARNING: return \"WARNING\";\r\n case DiagnosticCategory.ERROR: return \"ERROR\";\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCategoryToString = diagnosticCategoryToString;\r\nvar colorBlue = \"\\u001b[93m\";\r\nvar colorYellow = \"\\u001b[93m\";\r\nvar colorRed = \"\\u001b[91m\";\r\nvar colorReset = \"\\u001b[0m\";\r\nfunction diagnosticCategoryToColor(category) {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return colorBlue;\r\n case DiagnosticCategory.WARNING: return colorYellow;\r\n case DiagnosticCategory.ERROR: return colorRed;\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCategoryToColor = diagnosticCategoryToColor;\r\nvar DiagnosticMessage = /** @class */ (function () {\r\n function DiagnosticMessage(code, category, message) {\r\n this.range = null;\r\n this.code = code;\r\n this.category = category;\r\n this.message = message;\r\n }\r\n DiagnosticMessage.create = function (code, category, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n var message = diagnosticMessages_generated_1.diagnosticCodeToString(code);\r\n if (arg0 != null)\r\n message = message.replace(\"{0}\", arg0);\r\n if (arg1 != null)\r\n message = message.replace(\"{1}\", arg1);\r\n return new DiagnosticMessage(code, category, message);\r\n };\r\n DiagnosticMessage.createInfo = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n };\r\n DiagnosticMessage.createWarning = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n };\r\n DiagnosticMessage.createError = function (code, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n };\r\n DiagnosticMessage.prototype.withRange = function (range) {\r\n this.range = range;\r\n return this;\r\n };\r\n DiagnosticMessage.prototype.toString = function () {\r\n if (this.range) {\r\n return (diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \\\"\" +\r\n this.message +\r\n \"\\\" in \" +\r\n this.range.source.normalizedPath +\r\n \" @ \" +\r\n this.range.start.toString(10) +\r\n \",\" +\r\n this.range.end.toString(10));\r\n }\r\n return (diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \" +\r\n this.message);\r\n };\r\n return DiagnosticMessage;\r\n}());\r\nexports.DiagnosticMessage = DiagnosticMessage;\r\nfunction formatDiagnosticMessage(message, useColors, showContext) {\r\n if (useColors === void 0) { useColors = false; }\r\n if (showContext === void 0) { showContext = false; }\r\n // format context first (uses same string builder)\r\n var context = \"\";\r\n if (message.range && showContext) {\r\n context = formatDiagnosticContext(message.range, useColors);\r\n }\r\n // general information\r\n var sb = [];\r\n if (useColors)\r\n sb.push(diagnosticCategoryToColor(message.category));\r\n sb.push(diagnosticCategoryToString(message.category));\r\n if (useColors)\r\n sb.push(colorReset);\r\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n sb.push(message.code.toString(10));\r\n sb.push(\": \");\r\n sb.push(message.message);\r\n // range information if available\r\n if (message.range) {\r\n var range = message.range;\r\n if (showContext) {\r\n sb.push(\"\\n\");\r\n sb.push(context);\r\n }\r\n sb.push(\"\\n\");\r\n sb.push(\" in \");\r\n sb.push(range.source.normalizedPath);\r\n sb.push(\"(\");\r\n sb.push(range.line.toString(10));\r\n sb.push(\",\");\r\n sb.push(range.column.toString(10));\r\n sb.push(\")\");\r\n }\r\n return sb.join(\"\");\r\n}\r\nexports.formatDiagnosticMessage = formatDiagnosticMessage;\r\nfunction formatDiagnosticContext(range, useColors) {\r\n if (useColors === void 0) { useColors = false; }\r\n var text = range.source.text;\r\n var len = text.length;\r\n var start = range.start;\r\n var end = range.end;\r\n while (start > 0 && !charcode_1.isLineBreak(text.charCodeAt(start - 1))) {\r\n start--;\r\n }\r\n while (end < len && !charcode_1.isLineBreak(text.charCodeAt(end))) {\r\n end++;\r\n }\r\n var sb = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors)\r\n sb.push(colorRed);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n }\r\n else {\r\n while (start++ < range.end) {\r\n sb.push(\"~\");\r\n }\r\n }\r\n if (useColors)\r\n sb.push(colorReset);\r\n return sb.join(\"\");\r\n}\r\nexports.formatDiagnosticContext = formatDiagnosticContext;\r\nvar DiagnosticEmitter = /** @class */ (function () {\r\n // silentDiagnostics: bool = false;\r\n function DiagnosticEmitter(diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n DiagnosticEmitter.prototype.emitDiagnostic = function (code, category, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n };\r\n DiagnosticEmitter.prototype.error = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1);\r\n };\r\n DiagnosticEmitter.prototype.info = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1);\r\n };\r\n DiagnosticEmitter.prototype.warning = function (code, range, arg0, arg1) {\r\n if (arg0 === void 0) { arg0 = null; }\r\n if (arg1 === void 0) { arg1 = null; }\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1);\r\n };\r\n return DiagnosticEmitter;\r\n}());\r\nexports.DiagnosticEmitter = DiagnosticEmitter;\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __values = (this && this.__values) || function (o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n};\r\nvar __read = (this && this.__read) || function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar types_1 = __webpack_require__(5);\r\nvar ast_1 = __webpack_require__(6);\r\nvar module_1 = __webpack_require__(0);\r\n/** Path delimiter inserted between file system levels. */\r\nexports.PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexports.PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexports.GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexports.SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexports.INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexports.STATIC_DELIMITER = \".\";\r\n/** Substitution used to indicate a library directory. */\r\nexports.LIBRARY_SUBST = \"(lib)\";\r\n/** Library directory prefix. */\r\nexports.LIBRARY_PREFIX = exports.LIBRARY_SUBST + exports.PATH_DELIMITER;\r\nvar QueuedExport = /** @class */ (function () {\r\n function QueuedExport() {\r\n }\r\n return QueuedExport;\r\n}());\r\nvar QueuedImport = /** @class */ (function () {\r\n function QueuedImport() {\r\n }\r\n return QueuedImport;\r\n}());\r\nvar noTypesYet = new Map();\r\n/** Represents an AssemblyScript program. */\r\nvar Program = /** @class */ (function (_super) {\r\n __extends(Program, _super);\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n function Program(diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n var _this = _super.call(this, diagnostics) || this;\r\n /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */\r\n _this.diagnosticsOffset = 0;\r\n /** Elements by internal name. */\r\n _this.elements = new Map();\r\n /** Types by internal name. */\r\n _this.types = noTypesYet;\r\n /** Declared type aliases. */\r\n _this.typeAliases = new Map();\r\n /** Exports of individual files by exported name. Not global exports. */\r\n _this.exports = new Map();\r\n _this.sources = [];\r\n return _this;\r\n }\r\n /** Initializes the program and its elements prior to compilation. */\r\n Program.prototype.initialize = function (options) {\r\n this.options = options;\r\n this.types = new Map([\r\n [\"i8\", types_1.Type.i8],\r\n [\"i16\", types_1.Type.i16],\r\n [\"i32\", types_1.Type.i32],\r\n [\"i64\", types_1.Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", types_1.Type.u8],\r\n [\"u16\", types_1.Type.u16],\r\n [\"u32\", types_1.Type.u32],\r\n [\"u64\", types_1.Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", types_1.Type.bool],\r\n [\"f32\", types_1.Type.f32],\r\n [\"f64\", types_1.Type.f64],\r\n [\"void\", types_1.Type.void],\r\n [\"number\", types_1.Type.f64],\r\n [\"boolean\", types_1.Type.bool]\r\n ]);\r\n var queuedExports = new Map();\r\n var queuedImports = new Array();\r\n var queuedDerivedClasses = new Array();\r\n // build initial lookup maps of internal names to declarations\r\n for (var i = 0, k = this.sources.length; i < k; ++i) {\r\n var source = this.sources[i];\r\n var statements = source.statements;\r\n for (var j = 0, l = statements.length; j < l; ++j) {\r\n var statement = statements[j];\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n this.initializeClass(statement, queuedDerivedClasses);\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(statement);\r\n break;\r\n case ast_1.NodeKind.EXPORT:\r\n this.initializeExports(statement, queuedExports);\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(statement);\r\n break;\r\n case ast_1.NodeKind.IMPORT:\r\n this.initializeImports(statement, queuedExports, queuedImports);\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(statement);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(statement, queuedDerivedClasses);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n this.initializeTypeAlias(statement);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n var element;\r\n // queued imports should be resolvable now through traversing exports and\r\n // queued exports\r\n for (i = 0; i < queuedImports.length;) {\r\n var queuedImport = queuedImports[i];\r\n element = this.tryResolveImport(queuedImport.referencedName, queuedExports);\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n }\r\n else {\r\n element = this.tryResolveImport(queuedImport.referencedNameAlt, queuedExports);\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Module_0_has_no_exported_member_1, queuedImport.declaration.range, queuedImport.declaration.parent.path.value, queuedImport.declaration.externalName.text);\r\n ++i;\r\n }\r\n }\r\n }\r\n try {\r\n // queued exports should be resolvable now that imports are finalized\r\n for (var queuedExports_1 = __values(queuedExports), queuedExports_1_1 = queuedExports_1.next(); !queuedExports_1_1.done; queuedExports_1_1 = queuedExports_1.next()) {\r\n var _a = __read(queuedExports_1_1.value, 2), exportName = _a[0], queuedExport = _a[1];\r\n var currentExport = queuedExport; // nullable below\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.exports.get(currentExport.referencedName)) {\r\n this.setExportAndCheckLibrary(exportName, element, currentExport.member.externalName);\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.referencedName);\r\n if (!currentExport) {\r\n this.error(diagnostics_1.DiagnosticCode.Module_0_has_no_exported_member_1, queuedExport.member.externalName.range, queuedExport.member.parent.path.value, queuedExport.member.externalName.text);\r\n }\r\n }\r\n else {\r\n if (\r\n // normal export\r\n (element = this.elements.get(currentExport.referencedName)) ||\r\n // library re-export\r\n (element = this.elements.get(currentExport.member.name.text))) {\r\n this.setExportAndCheckLibrary(exportName, element, currentExport.member.externalName);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, queuedExport.member.range, queuedExport.member.name.text);\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (queuedExports_1_1 && !queuedExports_1_1.done && (_b = queuedExports_1.return)) _b.call(queuedExports_1);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n // resolve base prototypes of derived classes\r\n for (i = 0, k = queuedDerivedClasses.length; i < k; ++i) {\r\n var derivedDeclaration = queuedDerivedClasses[i].declaration;\r\n var derivedType = assert(derivedDeclaration.extendsType);\r\n var resolved = this.resolveIdentifier(derivedType.name, null);\r\n if (resolved) {\r\n if (resolved.element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(diagnostics_1.DiagnosticCode.A_class_may_only_extend_another_class, derivedType.range);\r\n continue;\r\n }\r\n queuedDerivedClasses[i].basePrototype = resolved.element;\r\n }\r\n }\r\n var e_1, _b;\r\n };\r\n /** Tries to resolve an import by traversing exports and queued exports. */\r\n Program.prototype.tryResolveImport = function (referencedName, queuedExports) {\r\n var element;\r\n do {\r\n if (element = this.exports.get(referencedName)) {\r\n return element;\r\n }\r\n var queuedExport = queuedExports.get(referencedName);\r\n if (!queuedExport)\r\n return null;\r\n if (queuedExport.isReExport) {\r\n referencedName = queuedExport.referencedName;\r\n continue;\r\n }\r\n return this.elements.get(queuedExport.referencedName);\r\n } while (true);\r\n };\r\n Program.prototype.checkInternalDecorators = function (element, declaration) {\r\n var isBuiltin = ast_1.hasDecorator(\"builtin\", declaration.decorators);\r\n if (isBuiltin) {\r\n element.set(ElementFlags.BUILTIN);\r\n }\r\n if (ast_1.hasDecorator(\"global\", declaration.decorators) ||\r\n (declaration.range.source.isLibrary &&\r\n element.is(ElementFlags.EXPORTED) &&\r\n (assert(declaration.parent).kind == ast_1.NodeKind.SOURCE ||\r\n declaration.parent.kind == ast_1.NodeKind.VARIABLE &&\r\n assert(declaration.parent.parent).kind == ast_1.NodeKind.SOURCE))) {\r\n element.set(ElementFlags.GLOBAL);\r\n if (this.elements.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, element.internalName);\r\n }\r\n else {\r\n this.elements.set(declaration.name.text, element);\r\n this.exports.set(declaration.name.text, element);\r\n if (isBuiltin) {\r\n element.internalName = declaration.name.text;\r\n }\r\n }\r\n }\r\n };\r\n Program.prototype.initializeClass = function (declaration, queuedDerivedClasses, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new ClassPrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (ast_1.hasDecorator(\"unmanaged\", declaration.decorators)) {\r\n prototype.isUnmanaged = true;\r\n if (declaration.implementsTypes && declaration.implementsTypes.length) {\r\n this.error(diagnostics_1.DiagnosticCode.Structs_cannot_implement_interfaces, ast_1.Range.join(declaration.name.range, declaration.implementsTypes[declaration.implementsTypes.length - 1]\r\n .range));\r\n }\r\n }\r\n else if (declaration.implementsTypes.length) {\r\n throw new Error(\"not implemented\");\r\n }\r\n // remember classes that extend another one\r\n if (declaration.extendsType) {\r\n queuedDerivedClasses.push(prototype);\r\n }\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n // otherwise add to file-level exports if exported\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case ast_1.NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n case ast_1.NodeKind.METHODDECLARATION:\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter ||\r\n ast_1.hasModifier(ast_1.ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n }\r\n else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"class member expected\");\r\n }\r\n }\r\n // check and possibly register string type\r\n if (prototype.is(ElementFlags.GLOBAL) &&\r\n declaration.name.text === \"String\" &&\r\n !this.types.has(\"string\")) {\r\n var instance = prototype.resolve(null);\r\n if (instance) {\r\n this.types.set(\"string\", instance.type);\r\n }\r\n }\r\n };\r\n Program.prototype.initializeField = function (declaration, classPrototype) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n // static fields become global variables\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.members = new Map();\r\n }\r\n var staticField = new Global(this, name, internalName, declaration, types_1.Type.void);\r\n classPrototype.members.set(name, staticField);\r\n this.elements.set(internalName, staticField);\r\n // instance fields are remembered until resolved\r\n }\r\n else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instanceField = new FieldPrototype(classPrototype, name, internalName, declaration);\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n };\r\n Program.prototype.initializeMethod = function (declaration, classPrototype) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype = null;\r\n // static methods become global functions\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n assert(declaration.name.kind != ast_1.NodeKind.CONSTRUCTOR);\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(this, name, internalName, declaration, null);\r\n classPrototype.members.set(name, prototype);\r\n this.elements.set(internalName, prototype);\r\n // instance methods are remembered until resolved\r\n }\r\n else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(this, name, internalName, declaration, classPrototype);\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == ast_1.NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(diagnostics_1.DiagnosticCode.Multiple_constructor_implementations_are_not_allowed, declaration.name.range);\r\n }\r\n else {\r\n prototype.set(ElementFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers.set(name, prototype);\r\n }\r\n }\r\n this.checkOperators(declaration.decorators, prototype, classPrototype);\r\n };\r\n Program.prototype.checkOperators = function (decorators, prototype, classPrototype) {\r\n // handle operator annotations. operators are either instance methods taking\r\n // a second argument of the instance's type or static methods taking two\r\n // arguments of the instance's type. return values vary depending on the\r\n // operation.\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n if (decorator.decoratorKind == 2 /* OPERATOR */) {\r\n if (!prototype) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, decorator.range);\r\n continue;\r\n }\r\n var numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n var firstArg = decorator.arguments[0];\r\n if (firstArg.kind == ast_1.NodeKind.LITERAL &&\r\n firstArg.literalKind == 2 /* STRING */) {\r\n switch (firstArg.value) {\r\n case \"[]\":\r\n classPrototype.fnIndexedGet = prototype.simpleName;\r\n break;\r\n case \"[]=\":\r\n classPrototype.fnIndexedSet = prototype.simpleName;\r\n break;\r\n case \"+\":\r\n classPrototype.fnConcat = prototype.simpleName;\r\n break;\r\n case \"==\":\r\n classPrototype.fnEquals = prototype.simpleName;\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, firstArg.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, firstArg.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, decorator.range, \"1\", numArgs.toString(0));\r\n }\r\n }\r\n else if (decorator.decoratorKind != 0 /* CUSTOM */) {\r\n // methods support built-in @operator only\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, decorator.range);\r\n }\r\n }\r\n }\r\n };\r\n Program.prototype.initializeAccessor = function (declaration, classPrototype, isGetter) {\r\n var propertyName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n var propertyElement = this.elements.get(internalPropertyName);\r\n if (propertyElement) {\r\n if (propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? propertyElement.getterPrototype\r\n : propertyElement.setterPrototype)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalPropertyName);\r\n return;\r\n }\r\n }\r\n else {\r\n propertyElement = new Property(this, propertyName, internalPropertyName, classPrototype);\r\n }\r\n var name = (isGetter ? exports.GETTER_PREFIX : exports.SETTER_PREFIX) + propertyName;\r\n // static accessors become global functions\r\n if (ast_1.hasModifier(ast_1.ModifierKind.STATIC, declaration.modifiers)) {\r\n var staticName = classPrototype.internalName + exports.STATIC_DELIMITER + name;\r\n if (this.elements.has(staticName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, staticName);\r\n return;\r\n }\r\n var staticPrototype = new FunctionPrototype(this, name, staticName, declaration, null);\r\n if (isGetter) {\r\n propertyElement.getterPrototype = staticPrototype;\r\n }\r\n else {\r\n propertyElement.setterPrototype = staticPrototype;\r\n }\r\n if (!classPrototype.members) {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(propertyName, propertyElement); // check above\r\n this.elements.set(internalPropertyName, propertyElement);\r\n // instance accessors are remembered until resolved\r\n }\r\n else {\r\n var instanceName = classPrototype.internalName + exports.INSTANCE_DELIMITER + name;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalPropertyName);\r\n return;\r\n }\r\n }\r\n else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instancePrototype = new FunctionPrototype(this, name, instanceName, declaration, classPrototype);\r\n if (isGetter) {\r\n propertyElement.getterPrototype = instancePrototype;\r\n }\r\n else {\r\n propertyElement.setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(name, propertyElement);\r\n this.elements.set(internalPropertyName, propertyElement);\r\n }\r\n };\r\n Program.prototype.initializeEnum = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var enm = new Enum(this, declaration.name.text, internalName, declaration);\r\n enm.namespace = namespace;\r\n this.elements.set(internalName, enm);\r\n this.checkInternalDecorators(enm, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, enm);\r\n }\r\n else if (enm.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, enm);\r\n }\r\n var values = declaration.values;\r\n for (var i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], enm);\r\n }\r\n };\r\n Program.prototype.initializeEnumValue = function (declaration, enm) {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n };\r\n Program.prototype.initializeExports = function (statement, queuedExports) {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n };\r\n Program.prototype.setExportAndCheckLibrary = function (name, element, identifier) {\r\n this.exports.set(name, element);\r\n if (identifier.range.source.isLibrary) {\r\n if (this.elements.has(identifier.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, identifier.range, identifier.text);\r\n }\r\n else {\r\n element.internalName = identifier.text;\r\n this.elements.set(identifier.text, element);\r\n }\r\n }\r\n };\r\n Program.prototype.initializeExport = function (member, internalPath, queuedExports) {\r\n var externalName = member.range.source.internalPath + exports.PATH_DELIMITER + member.externalName.text;\r\n if (this.exports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n var referencedName;\r\n var referencedElement;\r\n var queuedExport;\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + exports.PATH_DELIMITER + member.name.text;\r\n // resolve right away if the element exists\r\n if (referencedElement = this.elements.get(referencedName)) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.referencedName = referencedName; // -> internal name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n // export external element\r\n }\r\n else {\r\n referencedName = internalPath + exports.PATH_DELIMITER + member.name.text;\r\n // resolve right away if the export exists\r\n referencedElement = this.elements.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n // walk already known queued exports\r\n var seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.exports.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n referencedName = queuedExport.referencedName;\r\n if (seen.has(queuedExport))\r\n break;\r\n seen.add(queuedExport);\r\n }\r\n else {\r\n referencedElement = this.elements.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(externalName, referencedElement, member.externalName);\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, member.externalName.range, externalName);\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.referencedName = referencedName; // -> export name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n };\r\n Program.prototype.initializeFunction = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new FunctionPrototype(this, declaration.name.text, internalName, declaration, null);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n };\r\n Program.prototype.initializeImports = function (statement, queuedExports, queuedImports) {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(declarations[i], statement.internalPath, queuedExports, queuedImports);\r\n }\r\n }\r\n else if (statement.namespaceName) {\r\n var internalName = (statement.range.source.internalPath +\r\n exports.PATH_DELIMITER +\r\n statement.namespaceName.text);\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, statement.namespaceName.range, internalName);\r\n return;\r\n }\r\n this.error(// TODO\r\n diagnostics_1.DiagnosticCode.Operation_not_supported, statement.range);\r\n }\r\n };\r\n Program.prototype.initializeImport = function (declaration, internalPath, queuedExports, queuedImports) {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var referencedName = internalPath + exports.PATH_DELIMITER + declaration.externalName.text;\r\n // resolve right away if the exact export exists\r\n var element;\r\n if (element = this.exports.get(referencedName)) {\r\n this.elements.set(internalName, element);\r\n return;\r\n }\r\n // otherwise queue it\r\n var indexPart = exports.PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.internalName = internalName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text);\r\n }\r\n else {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (internalPath +\r\n indexPart +\r\n exports.PATH_DELIMITER +\r\n declaration.externalName.text);\r\n }\r\n queuedImport.declaration = declaration;\r\n queuedImports.push(queuedImport);\r\n };\r\n Program.prototype.initializeInterface = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n var prototype = new InterfacePrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n this.checkInternalDecorators(prototype, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n }\r\n else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case ast_1.NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n case ast_1.NodeKind.METHODDECLARATION:\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter || ast_1.hasModifier(ast_1.ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n }\r\n else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n };\r\n Program.prototype.initializeNamespace = function (declaration, queuedExtendingClasses, parentNamespace) {\r\n if (parentNamespace === void 0) { parentNamespace = null; }\r\n var internalName = declaration.fileLevelInternalName;\r\n var namespace = this.elements.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, declaration.name.text, internalName, declaration);\r\n namespace.namespace = parentNamespace;\r\n this.elements.set(internalName, namespace);\r\n this.checkInternalDecorators(namespace, declaration);\r\n }\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n }\r\n else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(declaration.name.text, namespace);\r\n }\r\n else if (namespace.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0, declaration.name.range, internalName);\r\n return;\r\n }\r\n this.exports.set(internalName, namespace);\r\n }\r\n var members = declaration.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n this.initializeClass(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, members[i].range);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n };\r\n Program.prototype.initializeTypeAlias = function (declaration, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.types.has(name) || this.typeAliases.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, name);\r\n return;\r\n }\r\n this.typeAliases.set(name, declaration.alias);\r\n };\r\n Program.prototype.initializeVariables = function (statement, namespace) {\r\n if (namespace === void 0) { namespace = null; }\r\n var declarations = statement.declarations;\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n continue;\r\n }\r\n var global = new Global(this, declaration.name.text, internalName, declaration, types_1.Type.void // resolved later on\r\n );\r\n global.namespace = namespace;\r\n this.elements.set(internalName, global);\r\n this.checkInternalDecorators(global, declaration);\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n continue;\r\n }\r\n }\r\n else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, global);\r\n }\r\n else if (global.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, internalName);\r\n }\r\n else {\r\n this.exports.set(internalName, global);\r\n }\r\n }\r\n }\r\n };\r\n /** Resolves a {@link TypeNode} to a concrete {@link Type}. */\r\n Program.prototype.resolveType = function (node, contextualTypeArguments, reportNotFound) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (reportNotFound === void 0) { reportNotFound = true; }\r\n var globalName = node.name.text;\r\n var localName = node.range.source.internalPath + exports.PATH_DELIMITER + node.name.text;\r\n var element;\r\n // check file-global / program-global element\r\n if ((element = this.elements.get(localName)) || (element = this.elements.get(globalName))) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n var instance = element.resolveInclTypeArguments(node.typeArguments, contextualTypeArguments, null); // reports\r\n return instance ? instance.type : null;\r\n }\r\n }\r\n // resolve parameters\r\n var k = node.typeArguments.length;\r\n var paramTypes = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var paramType = this.resolveType(// reports\r\n node.typeArguments[i], contextualTypeArguments, reportNotFound);\r\n if (!paramType)\r\n return null;\r\n paramTypes[i] = paramType;\r\n }\r\n if (k) {\r\n var instanceKey = types_1.typesToString(paramTypes);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n }\r\n else if (contextualTypeArguments) {\r\n var placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType)\r\n return placeholderType;\r\n }\r\n var type;\r\n // check file-global / program-global type\r\n if ((type = this.types.get(localName)) || (type = this.types.get(globalName))) {\r\n return type;\r\n }\r\n // check type alias\r\n var alias = this.typeAliases.get(globalName);\r\n if (alias && (type = this.resolveType(alias, null, reportNotFound))) {\r\n return type;\r\n }\r\n if (reportNotFound) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, node.name.range, globalName);\r\n }\r\n return null;\r\n };\r\n /** Resolves an array of type parameters to concrete types. */\r\n Program.prototype.resolveTypeArguments = function (typeParameters, typeArgumentNodes, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var parameterCount = typeParameters.length;\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (parameterCount != argumentCount) {\r\n if (argumentCount) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, ast_1.Range.join(typeArgumentNodes[0].range, typeArgumentNodes[argumentCount - 1].range), parameterCount.toString(10), argumentCount.toString(10));\r\n }\r\n else if (alternativeReportNode) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\");\r\n }\r\n return null;\r\n }\r\n var typeArguments = new Array(parameterCount);\r\n for (var i = 0; i < parameterCount; ++i) {\r\n var type = this.resolveType(// reports\r\n typeArgumentNodes[i], contextualTypeArguments, true);\r\n if (!type)\r\n return null;\r\n // TODO: check extendsType\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n };\r\n /** Resolves an identifier to the element it refers to. */\r\n Program.prototype.resolveIdentifier = function (identifier, contextualFunction, contextualEnum) {\r\n if (contextualEnum === void 0) { contextualEnum = null; }\r\n var name = identifier.text;\r\n var element;\r\n var namespace;\r\n // check siblings\r\n if (contextualEnum) {\r\n if (contextualEnum.members &&\r\n (element = contextualEnum.members.get(name)) &&\r\n element.kind == ElementKind.ENUMVALUE) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n }\r\n else if (contextualFunction) {\r\n // check locals\r\n if (element = contextualFunction.flow.getScopedLocal(name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n // search contextual parent namespaces if applicable\r\n if (namespace = contextualFunction.prototype.namespace) {\r\n do {\r\n if (element = this.elements.get(namespace.internalName + exports.STATIC_DELIMITER + name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n } while (namespace = namespace.namespace);\r\n }\r\n }\r\n // search current file\r\n if (element = this.elements.get(identifier.range.source.internalPath + exports.PATH_DELIMITER + name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n // search global scope\r\n if (element = this.elements.get(name)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, identifier.range, name);\r\n return null;\r\n };\r\n /** Resolves a property access to the element it refers to. */\r\n Program.prototype.resolvePropertyAccess = function (propertyAccess, contextualFunction) {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n if (!resolvedElement)\r\n return null;\r\n var target = resolvedElement.element;\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n var targetType;\r\n var member;\r\n // Resolve variable-likes to their class type first\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n if (!(targetType = target.type).classType) {\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, targetType.toString());\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n case ElementKind.PROPERTY:\r\n var getter = assert(target.getterPrototype).resolve(); // reports\r\n if (!getter)\r\n return null;\r\n if (!(targetType = getter.returnType).classType) {\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, targetType.toString());\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n }\r\n // Look up the member within\r\n switch (target.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS:\r\n do {\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n // check inherited static members on the base prototype while target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if (target.basePrototype) {\r\n target = target.basePrototype;\r\n }\r\n else {\r\n break;\r\n }\r\n // or inherited instance members on the cbase class while target is a class instance\r\n }\r\n else if (target.kind == ElementKind.CLASS) {\r\n if (target.base) {\r\n target = target.base;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n default:// enums or other namespace-like elements\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Property_0_does_not_exist_on_type_1, propertyAccess.property.range, propertyName, target.internalName);\r\n return null;\r\n };\r\n Program.prototype.resolveElementAccess = function (elementAccess, contextualFunction) {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = elementAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction);\r\n if (!resolvedElement)\r\n return null;\r\n var target = resolvedElement.element;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n var type = target.type;\r\n if (type.classType) {\r\n var indexedGetName = (target = type.classType).prototype.fnIndexedGet;\r\n var indexedGet;\r\n if (indexedGetName != null &&\r\n target.members &&\r\n (indexedGet = target.members.get(indexedGetName)) &&\r\n indexedGet.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n return resolvedElement.set(indexedGet).withTarget(type.classType, targetExpression);\r\n }\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Index_signature_is_missing_in_type_0, targetExpression.range, target.internalName);\r\n return null;\r\n };\r\n Program.prototype.resolveExpression = function (expression, contextualFunction) {\r\n var classType;\r\n while (expression.kind == ast_1.NodeKind.PARENTHESIZED) {\r\n expression = expression.expression;\r\n }\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.ASSERTION:\r\n var type = this.resolveType(expression.toType); // reports\r\n if (type && (classType = type.classType)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n return null;\r\n case ast_1.NodeKind.BINARY:\r\n // TODO: string concatenation, mostly\r\n throw new Error(\"not implemented\");\r\n case ast_1.NodeKind.THIS:// -> Class\r\n if (classType = contextualFunction.instanceMethodOf) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._this_cannot_be_referenced_in_current_location, expression.range);\r\n return null;\r\n case ast_1.NodeKind.SUPER:// -> Class\r\n if ((classType = contextualFunction.instanceMethodOf) && (classType = classType.base)) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class, expression.range);\r\n return null;\r\n case ast_1.NodeKind.IDENTIFIER:\r\n return this.resolveIdentifier(expression, contextualFunction);\r\n case ast_1.NodeKind.PROPERTYACCESS:\r\n return this.resolvePropertyAccess(expression, contextualFunction);\r\n case ast_1.NodeKind.ELEMENTACCESS:\r\n return this.resolveElementAccess(expression, contextualFunction);\r\n case ast_1.NodeKind.CALL:\r\n var resolved = this.resolveExpression(expression.expression, contextualFunction);\r\n if (resolved) {\r\n var element = resolved.element;\r\n if (element && element.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = element.resolveInclTypeArguments(expression.typeArguments, null, expression);\r\n if (instance && instance.returnType.classType) {\r\n if (!resolvedElement)\r\n resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(instance.returnType.classType);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return null;\r\n };\r\n return Program;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Program = Program;\r\n/** Common result structure returned when calling any of the resolve functions on a {@link Program}. */\r\nvar ResolvedElement = /** @class */ (function () {\r\n function ResolvedElement() {\r\n }\r\n /** Clears the target and sets the resolved element. */\r\n ResolvedElement.prototype.set = function (element) {\r\n this.target = null;\r\n this.targetExpression = null;\r\n this.element = element;\r\n return this;\r\n };\r\n /** Sets the resolved target in addition to the previously set element. */\r\n ResolvedElement.prototype.withTarget = function (target, targetExpression) {\r\n this.target = target;\r\n this.targetExpression = targetExpression;\r\n return this;\r\n };\r\n return ResolvedElement;\r\n}());\r\nexports.ResolvedElement = ResolvedElement;\r\n// Cached result structure instance\r\nvar resolvedElement;\r\n/** Indicates the specific kind of an {@link Element}. */\r\nvar ElementKind;\r\n(function (ElementKind) {\r\n /** A {@link Global}. */\r\n ElementKind[ElementKind[\"GLOBAL\"] = 0] = \"GLOBAL\";\r\n /** A {@link Local}. */\r\n ElementKind[ElementKind[\"LOCAL\"] = 1] = \"LOCAL\";\r\n /** An {@link Enum}. */\r\n ElementKind[ElementKind[\"ENUM\"] = 2] = \"ENUM\";\r\n /** An {@link EnumValue}. */\r\n ElementKind[ElementKind[\"ENUMVALUE\"] = 3] = \"ENUMVALUE\";\r\n /** A {@link FunctionPrototype}. */\r\n ElementKind[ElementKind[\"FUNCTION_PROTOTYPE\"] = 4] = \"FUNCTION_PROTOTYPE\";\r\n /** A {@link Function}. */\r\n ElementKind[ElementKind[\"FUNCTION\"] = 5] = \"FUNCTION\";\r\n /** A {@link ClassPrototype}. */\r\n ElementKind[ElementKind[\"CLASS_PROTOTYPE\"] = 6] = \"CLASS_PROTOTYPE\";\r\n /** A {@link Class}. */\r\n ElementKind[ElementKind[\"CLASS\"] = 7] = \"CLASS\";\r\n /** An {@link InterfacePrototype}. */\r\n ElementKind[ElementKind[\"INTERFACE_PROTOTYPE\"] = 8] = \"INTERFACE_PROTOTYPE\";\r\n /** An {@link Interface}. */\r\n ElementKind[ElementKind[\"INTERFACE\"] = 9] = \"INTERFACE\";\r\n /** A {@link FieldPrototype}. */\r\n ElementKind[ElementKind[\"FIELD_PROTOTYPE\"] = 10] = \"FIELD_PROTOTYPE\";\r\n /** A {@link Field}. */\r\n ElementKind[ElementKind[\"FIELD\"] = 11] = \"FIELD\";\r\n /** A {@link Property}. */\r\n ElementKind[ElementKind[\"PROPERTY\"] = 12] = \"PROPERTY\";\r\n /** A {@link Namespace}. */\r\n ElementKind[ElementKind[\"NAMESPACE\"] = 13] = \"NAMESPACE\";\r\n})(ElementKind = exports.ElementKind || (exports.ElementKind = {}));\r\n/** Indicates traits of an {@link Element}. */\r\nvar ElementFlags;\r\n(function (ElementFlags) {\r\n /** No flags set. */\r\n ElementFlags[ElementFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** Is compiled. */\r\n ElementFlags[ElementFlags[\"COMPILED\"] = 1] = \"COMPILED\";\r\n /** Is an import. */\r\n ElementFlags[ElementFlags[\"IMPORTED\"] = 2] = \"IMPORTED\";\r\n /** Is an export. */\r\n ElementFlags[ElementFlags[\"EXPORTED\"] = 4] = \"EXPORTED\";\r\n /** Is built-in. */\r\n ElementFlags[ElementFlags[\"BUILTIN\"] = 8] = \"BUILTIN\";\r\n /** Is declared. */\r\n ElementFlags[ElementFlags[\"DECLARED\"] = 16] = \"DECLARED\";\r\n /** Is generic. */\r\n ElementFlags[ElementFlags[\"GENERIC\"] = 32] = \"GENERIC\";\r\n /** Is constant. */\r\n ElementFlags[ElementFlags[\"CONSTANT\"] = 64] = \"CONSTANT\";\r\n /** Has a constant value and is therefore inlined. */\r\n ElementFlags[ElementFlags[\"INLINED\"] = 128] = \"INLINED\";\r\n /** Is instance member. */\r\n ElementFlags[ElementFlags[\"INSTANCE\"] = 256] = \"INSTANCE\";\r\n /** Is getter. */\r\n ElementFlags[ElementFlags[\"GETTER\"] = 512] = \"GETTER\";\r\n /** Is setter. */\r\n ElementFlags[ElementFlags[\"SETTER\"] = 1024] = \"SETTER\";\r\n /** Is global. */\r\n ElementFlags[ElementFlags[\"GLOBAL\"] = 2048] = \"GLOBAL\";\r\n /** Is read-only. */\r\n ElementFlags[ElementFlags[\"READONLY\"] = 4096] = \"READONLY\";\r\n /** Is a public member. */\r\n ElementFlags[ElementFlags[\"PUBLIC\"] = 8192] = \"PUBLIC\";\r\n /** Is a protected member. */\r\n ElementFlags[ElementFlags[\"PROTECTED\"] = 16384] = \"PROTECTED\";\r\n /** Is a private member. */\r\n ElementFlags[ElementFlags[\"PRIVATE\"] = 32768] = \"PRIVATE\";\r\n /** Is an abstract member. */\r\n ElementFlags[ElementFlags[\"ABSTRACT\"] = 65536] = \"ABSTRACT\";\r\n /** Is a constructor. */\r\n ElementFlags[ElementFlags[\"CONSTRUCTOR\"] = 131072] = \"CONSTRUCTOR\";\r\n /** Is an unmanaged class with limited capabilites. */\r\n ElementFlags[ElementFlags[\"UNMANAGED\"] = 262144] = \"UNMANAGED\";\r\n /** Is scoped. */\r\n ElementFlags[ElementFlags[\"SCOPED\"] = 524288] = \"SCOPED\";\r\n /** Is the start function. */\r\n ElementFlags[ElementFlags[\"START\"] = 1048576] = \"START\";\r\n})(ElementFlags = exports.ElementFlags || (exports.ElementFlags = {}));\r\n/** Base class of all program elements. */\r\nvar Element = /** @class */ (function () {\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n function Element(program, simpleName, internalName) {\r\n /** Element flags. */\r\n this.flags = ElementFlags.NONE;\r\n /** Namespaced member elements. */\r\n this.members = null;\r\n /** Parent namespace, if applicable. */\r\n this.namespace = null;\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n /** Tests if this element has a specific flag or flags. */\r\n Element.prototype.is = function (flag) { return (this.flags & flag) == flag; };\r\n /** Sets a specific flag or flags. */\r\n Element.prototype.set = function (flag) { this.flags |= flag; };\r\n return Element;\r\n}());\r\nexports.Element = Element;\r\n/** A namespace. */\r\nvar Namespace = /** @class */ (function (_super) {\r\n __extends(Namespace, _super);\r\n /** Constructs a new namespace. */\r\n function Namespace(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n _this.kind = ElementKind.NAMESPACE;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n return Namespace;\r\n}(Element));\r\nexports.Namespace = Namespace;\r\n/** An enum. */\r\nvar Enum = /** @class */ (function (_super) {\r\n __extends(Enum, _super);\r\n /** Constructs a new enum. */\r\n function Enum(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.ENUM;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.CONST:\r\n _this.set(ElementFlags.CONSTANT);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n return Enum;\r\n}(Element));\r\nexports.Enum = Enum;\r\n/** An enum value. */\r\nvar EnumValue = /** @class */ (function (_super) {\r\n __extends(EnumValue, _super);\r\n function EnumValue(enm, program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.ENUMVALUE;\r\n /** Constant value, if applicable. */\r\n _this.constantValue = 0;\r\n _this.enum = enm;\r\n _this.declaration = declaration;\r\n return _this;\r\n }\r\n return EnumValue;\r\n}(Element));\r\nexports.EnumValue = EnumValue;\r\nvar ConstantValueKind;\r\n(function (ConstantValueKind) {\r\n ConstantValueKind[ConstantValueKind[\"NONE\"] = 0] = \"NONE\";\r\n ConstantValueKind[ConstantValueKind[\"INTEGER\"] = 1] = \"INTEGER\";\r\n ConstantValueKind[ConstantValueKind[\"FLOAT\"] = 2] = \"FLOAT\";\r\n})(ConstantValueKind = exports.ConstantValueKind || (exports.ConstantValueKind = {}));\r\nvar VariableLikeElement = /** @class */ (function (_super) {\r\n __extends(VariableLikeElement, _super);\r\n function VariableLikeElement() {\r\n // kind varies\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n /** Constant value kind. */\r\n _this.constantValueKind = 0 /* NONE */;\r\n return _this;\r\n }\r\n VariableLikeElement.prototype.withConstantIntegerValue = function (lo, hi) {\r\n this.constantValueKind = 1 /* INTEGER */;\r\n this.constantIntegerValue = i64_new(lo, hi);\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n };\r\n VariableLikeElement.prototype.withConstantFloatValue = function (value) {\r\n this.constantValueKind = 2 /* FLOAT */;\r\n this.constantFloatValue = value;\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n };\r\n return VariableLikeElement;\r\n}(Element));\r\nexports.VariableLikeElement = VariableLikeElement;\r\n/** A global variable. */\r\nvar Global = /** @class */ (function (_super) {\r\n __extends(Global, _super);\r\n function Global(program, simpleName, internalName, declaration, type) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.GLOBAL;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.CONST:\r\n _this.set(ElementFlags.CONSTANT);\r\n break;\r\n case ast_1.ModifierKind.LET:\r\n _this.set(ElementFlags.SCOPED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.READONLY:\r\n _this.set(_this.declaration.initializer\r\n ? ElementFlags.CONSTANT | ElementFlags.READONLY\r\n : ElementFlags.READONLY);\r\n break;\r\n case ast_1.ModifierKind.PUBLIC:\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.STATIC:\r\n break; // static fields become globals\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n _this.type = type; // resolved later if `void`\r\n return _this;\r\n }\r\n return Global;\r\n}(VariableLikeElement));\r\nexports.Global = Global;\r\n/** A function parameter. */\r\nvar Parameter = /** @class */ (function () {\r\n /** Constructs a new function parameter. */\r\n function Parameter(name, type, initializer) {\r\n if (initializer === void 0) { initializer = null; }\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n return Parameter;\r\n}());\r\nexports.Parameter = Parameter;\r\n/** A function local. */\r\nvar Local = /** @class */ (function (_super) {\r\n __extends(Local, _super);\r\n function Local(program, simpleName, index, type) {\r\n var _this = _super.call(this, program, simpleName, simpleName) || this;\r\n _this.kind = ElementKind.LOCAL;\r\n _this.index = index;\r\n _this.type = type;\r\n return _this;\r\n }\r\n return Local;\r\n}(VariableLikeElement));\r\nexports.Local = Local;\r\n/** A yet unresolved function prototype. */\r\nvar FunctionPrototype = /** @class */ (function (_super) {\r\n __extends(FunctionPrototype, _super);\r\n /** Constructs a new function prototype. */\r\n function FunctionPrototype(program, simpleName, internalName, declaration, classPrototype) {\r\n if (classPrototype === void 0) { classPrototype = null; }\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.FUNCTION_PROTOTYPE;\r\n /** Resolved instances. */\r\n _this.instances = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. */\r\n _this.classTypeArguments = null;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n case ast_1.ModifierKind.GET:\r\n _this.set(ElementFlags.GETTER);\r\n break;\r\n case ast_1.ModifierKind.SET:\r\n _this.set(ElementFlags.SETTER);\r\n break;\r\n case ast_1.ModifierKind.STATIC:\r\n case ast_1.ModifierKind.ABSTRACT:\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.PUBLIC:\r\n break; // already handled\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (_this.declaration.typeParameters.length) {\r\n _this.set(ElementFlags.GENERIC);\r\n }\r\n if (_this.classPrototype = classPrototype) {\r\n _this.set(ElementFlags.INSTANCE);\r\n }\r\n return _this;\r\n }\r\n FunctionPrototype.prototype.resolve = function (functionTypeArguments, contextualTypeArguments) {\r\n if (functionTypeArguments === void 0) { functionTypeArguments = null; }\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var instanceKey = functionTypeArguments ? types_1.typesToString(functionTypeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance)\r\n return instance;\r\n var declaration = this.declaration;\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n try {\r\n for (var inheritedTypeArguments_1 = __values(inheritedTypeArguments), inheritedTypeArguments_1_1 = inheritedTypeArguments_1.next(); !inheritedTypeArguments_1_1.done; inheritedTypeArguments_1_1 = inheritedTypeArguments_1.next()) {\r\n var _a = __read(inheritedTypeArguments_1_1.value, 2), inheritedName = _a[0], inheritedType = _a[1];\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (inheritedTypeArguments_1_1 && !inheritedTypeArguments_1_1.done && (_b = inheritedTypeArguments_1.return)) _b.call(inheritedTypeArguments_1);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n }\r\n var i, k;\r\n // inherit class type arguments if a partially resolved instance method (classTypeArguments is set)\r\n if (this.classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n var classDeclaration = this.classPrototype.declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n if ((k = this.classTypeArguments.length) != classTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(classTypeParameters[i].name.text, this.classTypeArguments[i]);\r\n }\r\n }\r\n // override call specific contextual type arguments\r\n var functionTypeParameters = declaration.typeParameters;\r\n if (functionTypeArguments && (k = functionTypeArguments.length)) {\r\n if (k != functionTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(functionTypeParameters[i].name.text, functionTypeArguments[i]);\r\n }\r\n }\r\n // resolve parameters\r\n // TODO: 'this' type\r\n k = declaration.parameters.length;\r\n var parameters = new Array(k);\r\n var parameterTypes = new Array(k);\r\n var typeNode;\r\n for (i = 0; i < k; ++i) {\r\n var parameterDeclaration = declaration.parameters[i];\r\n typeNode = assert(parameterDeclaration.type);\r\n var parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (parameterType) {\r\n parameters[i] = new Parameter(parameterDeclaration.name.text, parameterType, parameterDeclaration.initializer);\r\n parameterTypes[i] = parameterType;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n var classInstance = null;\r\n if (this.classPrototype) {\r\n classInstance = this.classPrototype.resolve(this.classTypeArguments, contextualTypeArguments); // reports\r\n if (!classInstance)\r\n return null;\r\n }\r\n // resolve return type\r\n // TODO: 'this' type\r\n var returnType;\r\n if (this.is(ElementFlags.SETTER) || this.is(ElementFlags.CONSTRUCTOR)) {\r\n returnType = types_1.Type.void; // not annotated\r\n }\r\n else {\r\n typeNode = assert(declaration.returnType);\r\n var type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (type) {\r\n returnType = type;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n instance = new Function(this, internalName, functionTypeArguments, parameters, returnType, classInstance);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n return instance;\r\n var e_2, _b;\r\n };\r\n FunctionPrototype.prototype.resolveInclTypeArguments = function (typeArgumentNodes, contextualTypeArguments, reportNode) {\r\n var resolvedTypeArguments = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(this.declaration.typeParameters, typeArgumentNodes, contextualTypeArguments, reportNode);\r\n if (!resolvedTypeArguments)\r\n return null;\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n };\r\n FunctionPrototype.prototype.resolvePartial = function (classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n if (classTypeArguments && classTypeArguments.length) {\r\n var partialPrototype = new FunctionPrototype(this.program, this.simpleName, this.internalName, this.declaration, this.classPrototype);\r\n partialPrototype.flags = this.flags;\r\n partialPrototype.classTypeArguments = classTypeArguments;\r\n return partialPrototype;\r\n }\r\n return this; // no need to clone\r\n };\r\n FunctionPrototype.prototype.toString = function () { return this.simpleName; };\r\n return FunctionPrototype;\r\n}(Element));\r\nexports.FunctionPrototype = FunctionPrototype;\r\n/** A resolved function. */\r\nvar Function = /** @class */ (function (_super) {\r\n __extends(Function, _super);\r\n /** Constructs a new concrete function. */\r\n function Function(prototype, internalName, typeArguments, parameters, returnType, instanceMethodOf) {\r\n if (instanceMethodOf === void 0) { instanceMethodOf = null; }\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.FUNCTION;\r\n /** Map of locals by name. */\r\n _this.locals = new Map();\r\n /** List of additional non-parameter locals. */\r\n _this.additionalLocals = [];\r\n /** Current break context label. */\r\n _this.breakContext = null;\r\n /** Remembered debug locations. */\r\n _this.debugLocations = null;\r\n _this.nextBreakId = 0;\r\n _this.breakStack = null;\r\n _this.tempI32s = null;\r\n _this.tempI64s = null;\r\n _this.tempF32s = null;\r\n _this.tempF64s = null;\r\n _this.prototype = prototype;\r\n _this.typeArguments = typeArguments;\r\n _this.parameters = parameters || [];\r\n _this.returnType = returnType;\r\n _this.instanceMethodOf = instanceMethodOf;\r\n _this.flags = prototype.flags;\r\n if (!(prototype.is(ElementFlags.BUILTIN) || prototype.is(ElementFlags.DECLARED))) {\r\n var localIndex = 0;\r\n if (instanceMethodOf) {\r\n assert(_this.is(ElementFlags.INSTANCE)); // internal error\r\n _this.locals.set(\"this\", new Local(prototype.program, \"this\", localIndex++, instanceMethodOf.type));\r\n if (instanceMethodOf.contextualTypeArguments) {\r\n if (!_this.contextualTypeArguments) {\r\n _this.contextualTypeArguments = new Map();\r\n }\r\n try {\r\n for (var _a = __values(instanceMethodOf.contextualTypeArguments), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var _c = __read(_b.value, 2), inheritedName = _c[0], inheritedType = _c[1];\r\n _this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_d = _a.return)) _d.call(_a);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n }\r\n }\r\n else {\r\n assert(!_this.is(ElementFlags.INSTANCE)); // internal error\r\n }\r\n for (var i = 0, k = _this.parameters.length; i < k; ++i) {\r\n var parameter = _this.parameters[i];\r\n var parameterName = assert(parameter.name, \"parameter must be named\"); // not a builtin or declared\r\n _this.locals.set(parameterName, new Local(prototype.program, parameterName, localIndex++, parameter.type));\r\n }\r\n }\r\n _this.flow = Flow.create(_this);\r\n return _this;\r\n var e_3, _d;\r\n }\r\n /** Adds a local of the specified type, with an optional name. */\r\n Function.prototype.addLocal = function (type, name) {\r\n if (name === void 0) { name = null; }\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = (this.parameters ? this.parameters.length : 0) + this.additionalLocals.length;\r\n if (this.is(ElementFlags.INSTANCE))\r\n localIndex++; // plus 'this'\r\n var local = new Local(this.prototype.program, name\r\n ? name\r\n : \"var$\" + localIndex.toString(10), localIndex, type);\r\n if (name) {\r\n if (this.locals.has(name))\r\n throw new Error(\"duplicate local name\");\r\n this.locals.set(name, local);\r\n }\r\n this.additionalLocals.push(type);\r\n return local;\r\n };\r\n /** Gets a free temporary local of the specified type. */\r\n Function.prototype.getTempLocal = function (type) {\r\n var temps;\r\n switch (type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s;\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s;\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s;\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s;\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps && temps.length) {\r\n var ret = temps.pop();\r\n ret.type = type;\r\n return ret;\r\n }\r\n return this.addLocal(type);\r\n };\r\n /** Frees the temporary local for reuse. */\r\n Function.prototype.freeTempLocal = function (local) {\r\n var temps;\r\n assert(local.type != null); // internal error\r\n switch (local.type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n temps.push(local);\r\n };\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n Function.prototype.getAndFreeTempLocal = function (type) {\r\n var temps;\r\n switch (type.toNativeType()) {\r\n case module_1.NativeType.I32:\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n case module_1.NativeType.I64:\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n case module_1.NativeType.F32:\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n case module_1.NativeType.F64:\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps.length > 0) {\r\n return temps[temps.length - 1];\r\n }\r\n var local = this.addLocal(type);\r\n temps.push(local);\r\n return local;\r\n };\r\n /** Enters a(nother) break context. */\r\n Function.prototype.enterBreakContext = function () {\r\n var id = this.nextBreakId++;\r\n if (!this.breakStack) {\r\n this.breakStack = [id];\r\n }\r\n else {\r\n this.breakStack.push(id);\r\n }\r\n return this.breakContext = id.toString(10);\r\n };\r\n /** Leaves the current break context. */\r\n Function.prototype.leaveBreakContext = function () {\r\n assert(this.breakStack != null);\r\n var length = this.breakStack.length;\r\n assert(length > 0);\r\n this.breakStack.pop();\r\n if (length > 1) {\r\n this.breakContext = this.breakStack[length - 2].toString(10);\r\n }\r\n else {\r\n this.breakContext = null;\r\n this.breakStack = null;\r\n }\r\n };\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n Function.prototype.finalize = function (module, ref) {\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakContext = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n var debugLocations = this.debugLocations;\r\n if (debugLocations) {\r\n for (var i = 0, k = debugLocations.length; i < k; ++i) {\r\n var debugLocation = debugLocations[i];\r\n module.setDebugLocation(ref, debugLocation.debugInfoRef, debugLocation.source.debugInfoIndex, debugLocation.line, debugLocation.column);\r\n }\r\n }\r\n }\r\n this.debugLocations = null;\r\n };\r\n /** Returns the TypeScript representation of this function. */\r\n Function.prototype.toString = function () { return this.prototype.simpleName; };\r\n /** Returns the function type TypeScript representation of this function.*/\r\n Function.prototype.toTypeString = function () { throw new Error(\"not implemented\"); };\r\n return Function;\r\n}(Element));\r\nexports.Function = Function;\r\n/** A yet unresolved instance field prototype. */\r\nvar FieldPrototype = /** @class */ (function (_super) {\r\n __extends(FieldPrototype, _super);\r\n /** Constructs a new field prototype. */\r\n function FieldPrototype(classPrototype, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, classPrototype.program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.FIELD_PROTOTYPE;\r\n _this.classPrototype = classPrototype;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.READONLY:\r\n _this.set(ElementFlags.READONLY);\r\n break;\r\n case ast_1.ModifierKind.PRIVATE:\r\n case ast_1.ModifierKind.PROTECTED:\r\n case ast_1.ModifierKind.PUBLIC:\r\n case ast_1.ModifierKind.STATIC:\r\n break; // already handled\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n return _this;\r\n }\r\n Object.defineProperty(FieldPrototype.prototype, \"isReadonly\", {\r\n /** Whether the field is read-only or not. */\r\n get: function () {\r\n return (this.flags & ElementFlags.READONLY) != 0;\r\n },\r\n set: function (is) {\r\n if (is) {\r\n this.flags |= ElementFlags.READONLY;\r\n }\r\n else {\r\n this.flags &= ~ElementFlags.READONLY;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return FieldPrototype;\r\n}(Element));\r\nexports.FieldPrototype = FieldPrototype;\r\n/** A resolved instance field. */\r\nvar Field = /** @class */ (function (_super) {\r\n __extends(Field, _super);\r\n /** Constructs a new field. */\r\n function Field(prototype, internalName, type) {\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.FIELD;\r\n /** Field memory offset, if an instance field. */\r\n _this.memoryOffset = -1;\r\n _this.prototype = prototype;\r\n _this.flags = prototype.flags;\r\n _this.type = type;\r\n return _this;\r\n }\r\n return Field;\r\n}(VariableLikeElement));\r\nexports.Field = Field;\r\n/** A property comprised of a getter and a setter function. */\r\nvar Property = /** @class */ (function (_super) {\r\n __extends(Property, _super);\r\n /** Constructs a new property prototype. */\r\n function Property(program, simpleName, internalName, parent) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.PROPERTY;\r\n /** Getter prototype. */\r\n _this.getterPrototype = null;\r\n /** Setter prototype. */\r\n _this.setterPrototype = null;\r\n _this.parent = parent;\r\n return _this;\r\n }\r\n return Property;\r\n}(Element));\r\nexports.Property = Property;\r\n/** A yet unresolved class prototype. */\r\nvar ClassPrototype = /** @class */ (function (_super) {\r\n __extends(ClassPrototype, _super);\r\n function ClassPrototype(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName) || this;\r\n _this.kind = ElementKind.CLASS_PROTOTYPE;\r\n /** Resolved instances. */\r\n _this.instances = new Map();\r\n /** Instance member prototypes. */\r\n _this.instanceMembers = null;\r\n /** Base class prototype, if applicable. */\r\n _this.basePrototype = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n _this.constructorPrototype = null;\r\n /** Overloaded indexed get method, if any. */\r\n _this.fnIndexedGet = null;\r\n /** Overloaded indexed set method, if any. */\r\n _this.fnIndexedSet = null;\r\n /** Overloaded concatenation method, if any. */\r\n _this.fnConcat = null;\r\n /** Overloaded equality comparison method, if any. */\r\n _this.fnEquals = null;\r\n _this.declaration = declaration;\r\n if (_this.declaration.modifiers) {\r\n for (var i = 0, k = _this.declaration.modifiers.length; i < k; ++i) {\r\n switch (_this.declaration.modifiers[i].modifierKind) {\r\n case ast_1.ModifierKind.IMPORT:\r\n _this.set(ElementFlags.IMPORTED);\r\n break;\r\n case ast_1.ModifierKind.EXPORT:\r\n _this.set(ElementFlags.EXPORTED);\r\n break;\r\n case ast_1.ModifierKind.DECLARE:\r\n _this.set(ElementFlags.DECLARED);\r\n break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (_this.declaration.typeParameters.length) {\r\n _this.set(ElementFlags.GENERIC);\r\n }\r\n return _this;\r\n }\r\n Object.defineProperty(ClassPrototype.prototype, \"isUnmanaged\", {\r\n /** Whether an unamanaged class or not. */\r\n get: function () {\r\n return (this.flags & ElementFlags.UNMANAGED) != 0;\r\n },\r\n set: function (is) {\r\n if (is) {\r\n this.flags |= ElementFlags.UNMANAGED;\r\n }\r\n else {\r\n this.flags &= ~ElementFlags.UNMANAGED;\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n ClassPrototype.prototype.resolve = function (typeArguments, contextualTypeArguments) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var instanceKey = typeArguments ? types_1.typesToString(typeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance)\r\n return instance;\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n try {\r\n for (var inheritedTypeArguments_2 = __values(inheritedTypeArguments), inheritedTypeArguments_2_1 = inheritedTypeArguments_2.next(); !inheritedTypeArguments_2_1.done; inheritedTypeArguments_2_1 = inheritedTypeArguments_2.next()) {\r\n var _a = __read(inheritedTypeArguments_2_1.value, 2), inheritedName = _a[0], inheritedType = _a[1];\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n catch (e_4_1) { e_4 = { error: e_4_1 }; }\r\n finally {\r\n try {\r\n if (inheritedTypeArguments_2_1 && !inheritedTypeArguments_2_1.done && (_b = inheritedTypeArguments_2.return)) _b.call(inheritedTypeArguments_2);\r\n }\r\n finally { if (e_4) throw e_4.error; }\r\n }\r\n }\r\n var declaration = this.declaration;\r\n var baseClass = null;\r\n if (declaration.extendsType) {\r\n var baseClassType = this.program.resolveType(declaration.extendsType, null); // reports\r\n if (!baseClassType)\r\n return null;\r\n if (!(baseClass = baseClassType.classType)) {\r\n this.program.error(diagnostics_1.DiagnosticCode.A_class_may_only_extend_another_class, declaration.extendsType.range);\r\n return null;\r\n }\r\n if (baseClass.prototype.isUnmanaged != this.isUnmanaged) {\r\n this.program.error(diagnostics_1.DiagnosticCode.Structs_cannot_extend_classes_and_vice_versa, ast_1.Range.join(declaration.name.range, declaration.extendsType.range));\r\n return null;\r\n }\r\n }\r\n // override call specific contextual type arguments if provided\r\n var i, k;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n else if (declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(this, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n var memoryOffset = 0;\r\n if (baseClass) {\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n if (baseClass.members) {\r\n if (!instance.members)\r\n instance.members = new Map();\r\n try {\r\n for (var _c = __values(baseClass.members.values()), _d = _c.next(); !_d.done; _d = _c.next()) {\r\n var inheritedMember = _d.value;\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n catch (e_5_1) { e_5 = { error: e_5_1 }; }\r\n finally {\r\n try {\r\n if (_d && !_d.done && (_e = _c.return)) _e.call(_c);\r\n }\r\n finally { if (e_5) throw e_5.error; }\r\n }\r\n }\r\n }\r\n if (this.constructorPrototype) {\r\n var partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports\r\n if (partialConstructor) {\r\n instance.constructorInstance = partialConstructor.resolve(); // reports\r\n }\r\n // TODO: ^ doesn't know the return type, hence returns null\r\n }\r\n if (this.instanceMembers) {\r\n try {\r\n for (var _f = __values(this.instanceMembers.values()), _g = _f.next(); !_g.done; _g = _f.next()) {\r\n var member = _g.value;\r\n switch (member.kind) {\r\n case ElementKind.FIELD_PROTOTYPE:// fields are layed out in advance\r\n if (!instance.members)\r\n instance.members = new Map();\r\n var fieldDeclaration = member.declaration;\r\n if (!fieldDeclaration.type) {\r\n throw new Error(\"type expected\"); // TODO: check if parent class defines a type\r\n }\r\n var fieldType = this.program.resolveType(// reports\r\n fieldDeclaration.type, instance.contextualTypeArguments);\r\n if (fieldType) {\r\n var fieldInstance = new Field(member, member.internalName, fieldType);\r\n switch (fieldType.byteSize) {\r\n case 1: break;\r\n case 2:\r\n if (memoryOffset & 1)\r\n ++memoryOffset;\r\n break;\r\n case 4:\r\n if (memoryOffset & 3)\r\n memoryOffset = (memoryOffset | 3) + 1;\r\n break;\r\n case 8:\r\n if (memoryOffset & 7)\r\n memoryOffset = (memoryOffset | 7) + 1;\r\n break;\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n }\r\n break;\r\n case ElementKind.FUNCTION_PROTOTYPE:// instance methods remain partially resolved prototypes until compiled\r\n if (!instance.members)\r\n instance.members = new Map();\r\n var methodPrototype = member.resolvePartial(typeArguments); // reports\r\n if (methodPrototype) {\r\n instance.members.set(member.simpleName, methodPrototype);\r\n }\r\n break;\r\n case ElementKind.PROPERTY:// instance properties are cloned with partially resolved getters and setters\r\n if (!instance.members)\r\n instance.members = new Map();\r\n assert(member.getterPrototype);\r\n var instanceProperty = new Property(this.program, member.simpleName, member.internalName, this);\r\n instanceProperty.getterPrototype = (member.getterPrototype.resolvePartial(typeArguments));\r\n if (member.setterPrototype) {\r\n instanceProperty.setterPrototype = (member.setterPrototype.resolvePartial(typeArguments));\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n default:\r\n throw new Error(\"instance member expected\");\r\n }\r\n }\r\n }\r\n catch (e_6_1) { e_6 = { error: e_6_1 }; }\r\n finally {\r\n try {\r\n if (_g && !_g.done && (_h = _f.return)) _h.call(_f);\r\n }\r\n finally { if (e_6) throw e_6.error; }\r\n }\r\n }\r\n instance.currentMemoryOffset = memoryOffset; // sizeof() is its byte size in memory\r\n return instance;\r\n var e_4, _b, e_5, _e, e_6, _h;\r\n };\r\n ClassPrototype.prototype.resolveInclTypeArguments = function (typeArgumentNodes, contextualTypeArguments, alternativeReportNode) {\r\n var resolvedTypeArguments = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(this.declaration.typeParameters, typeArgumentNodes, contextualTypeArguments, alternativeReportNode);\r\n if (!resolvedTypeArguments)\r\n return null;\r\n }\r\n else {\r\n assert(typeArgumentNodes == null || !typeArgumentNodes.length);\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n };\r\n ClassPrototype.prototype.toString = function () {\r\n return this.simpleName;\r\n };\r\n return ClassPrototype;\r\n}(Element));\r\nexports.ClassPrototype = ClassPrototype;\r\n/** A resolved class. */\r\nvar Class = /** @class */ (function (_super) {\r\n __extends(Class, _super);\r\n /** Constructs a new class. */\r\n function Class(prototype, internalName, typeArguments, base) {\r\n if (typeArguments === void 0) { typeArguments = null; }\r\n if (base === void 0) { base = null; }\r\n var _this = _super.call(this, prototype.program, prototype.simpleName, internalName) || this;\r\n _this.kind = ElementKind.CLASS;\r\n /** Contextual type arguments for fields and methods. */\r\n _this.contextualTypeArguments = null;\r\n /** Current member memory offset. */\r\n _this.currentMemoryOffset = 0;\r\n /** Constructor instance. */\r\n _this.constructorInstance = null;\r\n _this.prototype = prototype;\r\n _this.flags = prototype.flags;\r\n _this.typeArguments = typeArguments;\r\n _this.type = prototype.program.options.usizeType.asClass(_this);\r\n _this.base = base;\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n if (base.contextualTypeArguments) {\r\n if (!_this.contextualTypeArguments)\r\n _this.contextualTypeArguments = new Map();\r\n try {\r\n for (var _a = __values(base.contextualTypeArguments), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var _c = __read(_b.value, 2), baseName = _c[0], baseType = _c[1];\r\n _this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n catch (e_7_1) { e_7 = { error: e_7_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_d = _a.return)) _d.call(_a);\r\n }\r\n finally { if (e_7) throw e_7.error; }\r\n }\r\n }\r\n }\r\n // apply instance-specific contextual type arguments\r\n var declaration = _this.prototype.declaration;\r\n var i, k;\r\n if (declaration) {\r\n var typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!_this.contextualTypeArguments)\r\n _this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n _this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n }\r\n else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n return _this;\r\n var e_7, _d;\r\n }\r\n Class.prototype.toString = function () {\r\n return this.prototype.simpleName;\r\n };\r\n return Class;\r\n}(Element));\r\nexports.Class = Class;\r\n/** A yet unresolved interface. */\r\nvar InterfacePrototype = /** @class */ (function (_super) {\r\n __extends(InterfacePrototype, _super);\r\n /** Constructs a new interface prototype. */\r\n function InterfacePrototype(program, simpleName, internalName, declaration) {\r\n var _this = _super.call(this, program, simpleName, internalName, declaration) || this;\r\n _this.kind = ElementKind.INTERFACE_PROTOTYPE;\r\n return _this;\r\n }\r\n return InterfacePrototype;\r\n}(ClassPrototype));\r\nexports.InterfacePrototype = InterfacePrototype;\r\n/** A resolved interface. */\r\nvar Interface = /** @class */ (function (_super) {\r\n __extends(Interface, _super);\r\n /** Constructs a new interface. */\r\n function Interface(prototype, internalName, typeArguments, base) {\r\n if (typeArguments === void 0) { typeArguments = []; }\r\n if (base === void 0) { base = null; }\r\n var _this = _super.call(this, prototype, internalName, typeArguments, base) || this;\r\n _this.kind = ElementKind.INTERFACE;\r\n return _this;\r\n }\r\n return Interface;\r\n}(Class));\r\nexports.Interface = Interface;\r\n/** Control flow flags indicating specific conditions. */\r\nvar FlowFlags;\r\n(function (FlowFlags) {\r\n /** No specific conditions. */\r\n FlowFlags[FlowFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** This branch always returns. */\r\n FlowFlags[FlowFlags[\"RETURNS\"] = 1] = \"RETURNS\";\r\n /** This branch possibly throws. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_THROWS\"] = 2] = \"POSSIBLY_THROWS\";\r\n /** This branch possible breaks. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_BREAKS\"] = 4] = \"POSSIBLY_BREAKS\";\r\n /** This branch possible continues. */\r\n FlowFlags[FlowFlags[\"POSSIBLY_CONTINUES\"] = 8] = \"POSSIBLY_CONTINUES\";\r\n})(FlowFlags = exports.FlowFlags || (exports.FlowFlags = {}));\r\n/** A control flow evaluator. */\r\nvar Flow = /** @class */ (function () {\r\n function Flow() {\r\n /** Scoped local variables. */\r\n this.scopedLocals = null;\r\n }\r\n /** Creates the parent flow of the specified function. */\r\n Flow.create = function (currentFunction) {\r\n var parentFlow = new Flow();\r\n parentFlow.parent = null;\r\n parentFlow.flags = 0 /* NONE */;\r\n parentFlow.currentFunction = currentFunction;\r\n parentFlow.continueLabel = null;\r\n parentFlow.breakLabel = null;\r\n return parentFlow;\r\n };\r\n /** Tests if this flow has the specified flag or flags. */\r\n Flow.prototype.is = function (flag) { return (this.flags & flag) == flag; };\r\n /** Sets the specified flag or flags. */\r\n Flow.prototype.set = function (flag) { this.flags |= flag; };\r\n /** Enters a new branch or scope and returns the new flow. */\r\n Flow.prototype.enterBranchOrScope = function () {\r\n var branchFlow = new Flow();\r\n branchFlow.parent = this;\r\n branchFlow.flags = this.flags;\r\n branchFlow.currentFunction = this.currentFunction;\r\n branchFlow.continueLabel = this.continueLabel;\r\n branchFlow.breakLabel = this.breakLabel;\r\n return branchFlow;\r\n };\r\n /** Leaves the current branch or scope and returns the parent flow. */\r\n Flow.prototype.leaveBranchOrScope = function () {\r\n var parent = assert(this.parent);\r\n // Free block-scoped locals\r\n if (this.scopedLocals) {\r\n try {\r\n for (var _a = __values(this.scopedLocals.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var scopedLocal = _b.value;\r\n this.currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n catch (e_8_1) { e_8 = { error: e_8_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_8) throw e_8.error; }\r\n }\r\n this.scopedLocals = null;\r\n }\r\n // Propagate flags to parent\r\n if (this.is(2 /* POSSIBLY_THROWS */)) {\r\n parent.set(2 /* POSSIBLY_THROWS */);\r\n }\r\n if (this.is(4 /* POSSIBLY_BREAKS */) && parent.breakLabel == this.breakLabel) {\r\n parent.set(4 /* POSSIBLY_BREAKS */);\r\n }\r\n if (this.is(8 /* POSSIBLY_CONTINUES */) && parent.continueLabel == this.continueLabel) {\r\n parent.set(8 /* POSSIBLY_CONTINUES */);\r\n }\r\n return parent;\r\n var e_8, _c;\r\n };\r\n /** Adds a new scoped local of the specified name. */\r\n Flow.prototype.addScopedLocal = function (name, type, reportNode) {\r\n var scopedLocal = this.currentFunction.getTempLocal(type);\r\n if (!this.scopedLocals)\r\n this.scopedLocals = new Map();\r\n else if (this.scopedLocals.has(name)) {\r\n this.currentFunction.program.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, reportNode.range);\r\n return;\r\n }\r\n this.scopedLocals.set(name, scopedLocal);\r\n };\r\n /** Gets the local of the specified name in the current scope. */\r\n Flow.prototype.getScopedLocal = function (name) {\r\n var local;\r\n var current = this;\r\n do {\r\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n return local;\r\n }\r\n } while (current = current.parent);\r\n return this.currentFunction.locals.get(name);\r\n };\r\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n Flow.prototype.finalize = function () {\r\n assert(this.parent == null, \"must be the topmost parent flow\");\r\n this.continueLabel = null;\r\n this.breakLabel = null;\r\n return this.is(1 /* RETURNS */);\r\n };\r\n return Flow;\r\n}());\r\nexports.Flow = Flow;\r\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nvar __values = (this && this.__values) || function (o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar builtins_1 = __webpack_require__(16);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar module_1 = __webpack_require__(0);\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nvar ast_1 = __webpack_require__(6);\r\nvar types_1 = __webpack_require__(5);\r\n/** Compilation target. */\r\nvar Target;\r\n(function (Target) {\r\n /** WebAssembly with 32-bit pointers. */\r\n Target[Target[\"WASM32\"] = 0] = \"WASM32\";\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n Target[Target[\"WASM64\"] = 1] = \"WASM64\";\r\n})(Target = exports.Target || (exports.Target = {}));\r\n/** Compiler options. */\r\nvar Options = /** @class */ (function () {\r\n function Options() {\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n this.target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n this.noTreeShaking = false;\r\n /** If true, replaces assertions with nops. */\r\n this.noAssert = false;\r\n /** If true, does not set up a memory. */\r\n this.noMemory = false;\r\n /** Static memory start offset. */\r\n this.memoryBase = 0;\r\n /** Memory allocation implementation to use. */\r\n this.allocateImpl = \"allocate_memory\";\r\n /** Memory freeing implementation to use. */\r\n this.freeImpl = \"free_memory\";\r\n /** If true, generates information necessary for source maps. */\r\n this.sourceMap = false;\r\n }\r\n Object.defineProperty(Options.prototype, \"isWasm64\", {\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get: function () {\r\n return this.target == Target.WASM64;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"usizeType\", {\r\n /** Gets the unsigned size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"isizeType\", {\r\n /** Gets the signed size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? types_1.Type.isize64 : types_1.Type.isize32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Options.prototype, \"nativeSizeType\", {\r\n /** Gets the native size type matching the target. */\r\n get: function () {\r\n return this.target == Target.WASM64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Options;\r\n}());\r\nexports.Options = Options;\r\n/** Indicates the desired kind of a conversion. */\r\nvar ConversionKind;\r\n(function (ConversionKind) {\r\n /** No conversion. */\r\n ConversionKind[ConversionKind[\"NONE\"] = 0] = \"NONE\";\r\n /** Implicit conversion. */\r\n ConversionKind[ConversionKind[\"IMPLICIT\"] = 1] = \"IMPLICIT\";\r\n /** Explicit conversion. */\r\n ConversionKind[ConversionKind[\"EXPLICIT\"] = 2] = \"EXPLICIT\";\r\n})(ConversionKind = exports.ConversionKind || (exports.ConversionKind = {}));\r\n/** Compiler interface. */\r\nvar Compiler = /** @class */ (function (_super) {\r\n __extends(Compiler, _super);\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n function Compiler(program, options) {\r\n if (options === void 0) { options = null; }\r\n var _this = _super.call(this, program.diagnostics) || this;\r\n /** Start function statements. */\r\n _this.startFunctionBody = new Array();\r\n /** Current enum in compilation. */\r\n _this.currentEnum = null;\r\n /** Current type in compilation. */\r\n _this.currentType = types_1.Type.void;\r\n /** Memory segments being compiled. */\r\n _this.memorySegments = new Array();\r\n /** Map of already compiled static string segments. */\r\n _this.stringSegments = new Map();\r\n /** Already processed file names. */\r\n _this.files = new Set();\r\n _this.program = program;\r\n _this.options = options ? options : new Options();\r\n _this.memoryOffset = i64_new(max(_this.options.memoryBase, _this.options.usizeType.byteSize) // leave space for `null`\r\n );\r\n _this.module = module_1.Module.create();\r\n return _this;\r\n }\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n Compiler.compile = function (program, options) {\r\n if (options === void 0) { options = null; }\r\n return new Compiler(program, options).compile();\r\n };\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n Compiler.prototype.compile = function () {\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n this.program.initialize(this.options);\r\n // set up the start function wrapping top-level statements, of all files.\r\n var startFunctionPrototype = assert(this.program.elements.get(\"start\"));\r\n assert(startFunctionPrototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE);\r\n var startFunctionInstance = new program_1.Function(startFunctionPrototype, startFunctionPrototype.internalName, null, // not generic\r\n null, // no parameters\r\n types_1.Type.void);\r\n startFunctionInstance.set(program_1.ElementFlags.START);\r\n this.currentFunction = this.startFunction = startFunctionInstance;\r\n var sources = this.program.sources;\r\n // compile entry file(s) while traversing to reachable elements\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) {\r\n this.compileSource(sources[i]);\r\n }\r\n }\r\n // compile the start function if not empty\r\n if (this.startFunctionBody.length) {\r\n var typeRef = this.module.getFunctionTypeBySignature(module_1.NativeType.None, []);\r\n if (!typeRef)\r\n typeRef = this.module.addFunctionType(\"v\", module_1.NativeType.None, []);\r\n var ref;\r\n this.module.setStart(ref = this.module.addFunction(this.startFunction.prototype.internalName, typeRef, types_1.typesToNativeTypes(this.startFunction.additionalLocals), this.module.createBlock(null, this.startFunctionBody)));\r\n this.startFunction.finalize(this.module, ref);\r\n }\r\n // set up static memory segments and the heap base pointer\r\n if (!this.options.noMemory) {\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, this.options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n if (this.options.isWasm64) {\r\n this.module.addGlobal(\"HEAP_BASE\", module_1.NativeType.I64, false, this.module.createI64(i64_low(memoryOffset), i64_high(memoryOffset)));\r\n }\r\n else {\r\n this.module.addGlobal(\"HEAP_BASE\", module_1.NativeType.I32, false, this.module.createI32(i64_low(memoryOffset)));\r\n }\r\n // determine initial page size\r\n var pages = i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0));\r\n this.module.setMemory(i64_low(pages), module_1.Module.MAX_MEMORY_WASM32 /* TODO: not WASM64 compatible yet */, this.memorySegments, this.options.target, \"memory\");\r\n }\r\n return this.module;\r\n };\r\n // sources\r\n Compiler.prototype.compileSourceByPath = function (normalizedPathWithoutExtension, reportNode) {\r\n var sources = this.program.sources;\r\n var source;\r\n var expected = normalizedPathWithoutExtension + \".ts\";\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n expected = normalizedPathWithoutExtension + \"/index.ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n expected = program_1.LIBRARY_PREFIX + normalizedPathWithoutExtension + \".ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.File_0_not_found, reportNode.range, normalizedPathWithoutExtension);\r\n };\r\n Compiler.prototype.compileSource = function (source) {\r\n var files = this.files;\r\n if (files.has(source.normalizedPath))\r\n return;\r\n files.add(source.normalizedPath);\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (var i = 0, k = statements.length; i < k; ++i) {\r\n var statement = statements[i];\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n if ((noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) &&\r\n !statement.typeParameters.length) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n if (noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n if ((noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) &&\r\n !statement.typeParameters.length) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.IMPORT:\r\n this.compileSourceByPath(statement.normalizedPath, statement.path);\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n if (noTreeShaking ||\r\n (isEntry && ast_1.hasModifier(ast_1.ModifierKind.EXPORT, statement.modifiers))) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n case ast_1.NodeKind.VARIABLE:// global, always compiled as initializers might have side effects\r\n var variableInit = this.compileVariableStatement(statement);\r\n if (variableInit)\r\n startFunctionBody.push(variableInit);\r\n break;\r\n case ast_1.NodeKind.EXPORT:\r\n if (statement.normalizedPath != null) {\r\n this.compileSourceByPath(statement.normalizedPath, statement.path);\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n // otherwise a top-level statement that is part of the start function's body\r\n default:\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = this.startFunction;\r\n var expr = this.compileStatement(statement);\r\n this.startFunctionBody.push(expr);\r\n this.currentFunction = previousFunction;\r\n break;\r\n }\r\n }\r\n };\r\n // globals\r\n Compiler.prototype.compileGlobalDeclaration = function (declaration) {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.GLOBAL) {\r\n throw new Error(\"global expected\");\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return null;\r\n }\r\n return element;\r\n };\r\n Compiler.prototype.compileGlobal = function (global) {\r\n if (global.is(program_1.ElementFlags.COMPILED) || global.is(program_1.ElementFlags.BUILTIN)) {\r\n return true;\r\n }\r\n var declaration = global.declaration;\r\n var initExpr = 0;\r\n if (global.type == types_1.Type.void) {\r\n if (declaration.type) {\r\n var resolvedType = this.program.resolveType(declaration.type); // reports\r\n if (!resolvedType)\r\n return false;\r\n if (resolvedType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.type.range, \"*\", resolvedType.toString());\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n }\r\n else if (declaration.initializer) {\r\n initExpr = this.compileExpression(// reports\r\n declaration.initializer, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.initializer.range, this.currentType.toString(), \"\");\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, declaration.name.range.atEnd);\r\n return false;\r\n }\r\n }\r\n var nativeType = global.type.toNativeType();\r\n if (global.is(program_1.ElementFlags.DECLARED)) {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n this.module.addGlobalImport(global.internalName, global.namespace\r\n ? global.namespace.simpleName\r\n : \"env\", global.simpleName, nativeType);\r\n global.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, declaration.range);\r\n }\r\n return false;\r\n }\r\n var initializeInStart = false;\r\n if (global.is(program_1.ElementFlags.INLINED)) {\r\n initExpr = this.compileInlineConstant(global, global.type);\r\n }\r\n else {\r\n if (declaration.initializer) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(declaration.initializer, global.type);\r\n }\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, declaration.range);\r\n initializeInStart = true;\r\n }\r\n }\r\n else {\r\n initializeInStart = true;\r\n }\r\n }\r\n }\r\n else {\r\n initExpr = global.type.toNativeZero(this.module);\r\n }\r\n }\r\n var internalName = global.internalName;\r\n if (initializeInStart) {\r\n this.module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(this.module));\r\n var setExpr = this.module.createSetGlobal(internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n }\r\n else {\r\n if (global.is(program_1.ElementFlags.CONSTANT)) {\r\n var exprType = _BinaryenExpressionGetType(initExpr);\r\n switch (exprType) {\r\n case module_1.NativeType.I32:\r\n global.constantValueKind = 1 /* INTEGER */;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI32(initExpr), 0);\r\n break;\r\n case module_1.NativeType.I64:\r\n global.constantValueKind = 1 /* INTEGER */;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI64Low(initExpr), _BinaryenConstGetValueI64High(initExpr));\r\n break;\r\n case module_1.NativeType.F32:\r\n global.constantValueKind = 2 /* FLOAT */;\r\n global.constantFloatValue = _BinaryenConstGetValueF32(initExpr);\r\n break;\r\n case module_1.NativeType.F64:\r\n global.constantValueKind = 2 /* FLOAT */;\r\n global.constantFloatValue = _BinaryenConstGetValueF64(initExpr);\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n global.set(program_1.ElementFlags.INLINED);\r\n if (declaration.isTopLevel) {\r\n this.module.addGlobal(internalName, nativeType, !global.is(program_1.ElementFlags.CONSTANT), initExpr);\r\n }\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addGlobalExport(global.internalName, declaration.programLevelInternalName);\r\n }\r\n }\r\n else {\r\n this.module.addGlobal(internalName, nativeType, !global.is(program_1.ElementFlags.CONSTANT), initExpr);\r\n }\r\n }\r\n global.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n };\r\n // enums\r\n Compiler.prototype.compileEnumDeclaration = function (declaration) {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.ENUM)\r\n throw new Error(\"enum expected\");\r\n return this.compileEnum(element) ? element : null;\r\n };\r\n Compiler.prototype.compileEnum = function (element) {\r\n if (element.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n // members might reference each other, triggering another compile\r\n element.set(program_1.ElementFlags.COMPILED);\r\n this.currentEnum = element;\r\n var previousValue = null;\r\n if (element.members) {\r\n try {\r\n for (var _a = __values(element.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var member = _b.value;\r\n if (member.kind != program_1.ElementKind.ENUMVALUE)\r\n continue; // happens if an enum is also a namespace\r\n var initInStart = false;\r\n var val = member;\r\n var valueDeclaration = val.declaration;\r\n val.set(program_1.ElementFlags.COMPILED);\r\n if (val.is(program_1.ElementFlags.INLINED)) {\r\n if (element.declaration.isTopLevelExport) {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, false, // constant\r\n this.module.createI32(val.constantValue));\r\n }\r\n }\r\n else {\r\n var initExpr;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(valueDeclaration.value, types_1.Type.i32);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != module_1.ExpressionId.Const) {\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, valueDeclaration.range);\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n }\r\n else if (previousValue == null) {\r\n initExpr = this.module.createI32(0);\r\n }\r\n else if (previousValue.is(program_1.ElementFlags.INLINED)) {\r\n initExpr = this.module.createI32(previousValue.constantValue + 1);\r\n }\r\n else {\r\n // in TypeScript this errors with TS1061, but actually we can do:\r\n initExpr = this.module.createBinary(module_1.BinaryOp.AddI32, this.module.createGetGlobal(previousValue.internalName, module_1.NativeType.I32), this.module.createI32(1));\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, valueDeclaration.range);\r\n }\r\n initInStart = true;\r\n }\r\n if (initInStart) {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, true, // mutable\r\n this.module.createI32(0));\r\n var setExpr = this.module.createSetGlobal(val.internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n }\r\n else {\r\n this.module.addGlobal(val.internalName, module_1.NativeType.I32, false, initExpr);\r\n if (_BinaryenExpressionGetType(initExpr) == module_1.NativeType.I32) {\r\n val.constantValue = _BinaryenConstGetValueI32(initExpr);\r\n val.set(program_1.ElementFlags.INLINED);\r\n }\r\n else {\r\n throw new Error(\"i32 expected\");\r\n }\r\n }\r\n }\r\n previousValue = val;\r\n // export values if the enum is exported\r\n if (element.declaration.range.source.isEntry && element.declaration.isTopLevelExport) {\r\n if (member.is(program_1.ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(member.internalName, member.internalName);\r\n }\r\n else if (valueDeclaration) {\r\n this.warning(diagnostics_1.DiagnosticCode.Cannot_export_a_mutable_global, valueDeclaration.range);\r\n }\r\n }\r\n }\r\n }\r\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_1) throw e_1.error; }\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n var e_1, _c;\r\n };\r\n // functions\r\n Compiler.prototype.compileFunctionDeclaration = function (declaration, typeArguments, contextualTypeArguments) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n throw new Error(\"function expected\");\r\n }\r\n return this.compileFunctionUsingTypeArguments(// reports\r\n element, typeArguments, contextualTypeArguments, element.declaration.name);\r\n };\r\n Compiler.prototype.compileFunctionUsingTypeArguments = function (prototype, typeArguments, contextualTypeArguments, reportNode) {\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n typeArguments, contextualTypeArguments, reportNode);\r\n if (!instance)\r\n return null;\r\n return this.compileFunction(instance) ? instance : null;\r\n };\r\n Compiler.prototype.compileFunction = function (instance) {\r\n if (instance.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n assert(!instance.is(program_1.ElementFlags.BUILTIN) || instance.simpleName == \"abort\");\r\n var declaration = instance.prototype.declaration;\r\n if (instance.is(program_1.ElementFlags.DECLARED)) {\r\n if (declaration.statements) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, declaration.name.range);\r\n return false;\r\n }\r\n }\r\n else if (!declaration.statements) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, declaration.name.range);\r\n return false;\r\n }\r\n // might trigger compilation of other functions referring to this one\r\n instance.set(program_1.ElementFlags.COMPILED);\r\n // compile statements\r\n var stmts = null;\r\n if (!instance.is(program_1.ElementFlags.DECLARED)) {\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = instance;\r\n var statements = assert(declaration.statements, \"implementation expected\");\r\n stmts = this.compileStatements(statements);\r\n // make sure the top-level branch or all child branches return\r\n var allBranchesReturn = this.currentFunction.flow.finalize();\r\n if (instance.returnType != types_1.Type.void && !allBranchesReturn) {\r\n this.error(diagnostics_1.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value, assert(declaration.returnType, \"return type expected\").range);\r\n }\r\n this.currentFunction = previousFunction;\r\n }\r\n // create the function type\r\n var numParameters = instance.parameters ? instance.parameters.length : 0;\r\n var numParametersInclThis = instance.instanceMethodOf ? numParameters + 1 : numParameters;\r\n var paramIndex = 0;\r\n var nativeResultType = instance.returnType.toNativeType();\r\n var nativeParamTypes = new Array(numParametersInclThis);\r\n var signatureNameParts = new Array(numParametersInclThis + 1);\r\n if (instance.instanceMethodOf) {\r\n nativeParamTypes[paramIndex] = this.options.isWasm64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n signatureNameParts[paramIndex++] = instance.instanceMethodOf.type.toSignatureString();\r\n }\r\n if (instance.parameters) {\r\n for (var i = 0; i < numParameters; ++i) {\r\n nativeParamTypes[paramIndex] = instance.parameters[i].type.toNativeType();\r\n signatureNameParts[paramIndex++] = instance.parameters[i].type.toSignatureString();\r\n }\r\n }\r\n signatureNameParts[paramIndex] = instance.returnType.toSignatureString();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeResultType, nativeParamTypes);\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(signatureNameParts.join(\"\"), nativeResultType, nativeParamTypes);\r\n }\r\n // create the function\r\n var ref;\r\n if (instance.is(program_1.ElementFlags.DECLARED)) {\r\n ref = this.module.addFunctionImport(instance.internalName, instance.prototype.namespace\r\n ? instance.prototype.namespace.simpleName\r\n : \"env\", instance.simpleName, typeRef);\r\n }\r\n else {\r\n ref = this.module.addFunction(instance.internalName, typeRef, types_1.typesToNativeTypes(instance.additionalLocals), this.module.createBlock(null, stmts, module_1.NativeType.None));\r\n }\r\n // check module export\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addFunctionExport(instance.internalName, declaration.name.text);\r\n }\r\n instance.finalize(this.module, ref);\r\n return true;\r\n };\r\n // namespaces\r\n Compiler.prototype.compileNamespaceDeclaration = function (declaration) {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n switch (member.kind) {\r\n case ast_1.NodeKind.CLASSDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.INTERFACEDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.ENUMDECLARATION:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n case ast_1.NodeKind.FUNCTIONDECLARATION:\r\n if ((noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) && !member.typeParameters.length) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n case ast_1.NodeKind.NAMESPACEDECLARATION:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n if (noTreeShaking ||\r\n ast_1.hasModifier(ast_1.ModifierKind.EXPORT, member.modifiers)) {\r\n var variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit)\r\n this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n };\r\n Compiler.prototype.compileNamespace = function (ns) {\r\n if (!ns.members)\r\n return;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n try {\r\n for (var _a = __values(ns.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var element = _b.value;\r\n switch (element.kind) {\r\n case program_1.ElementKind.CLASS_PROTOTYPE:\r\n if ((noTreeShaking ||\r\n element.is(program_1.ElementFlags.EXPORTED)) && !element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n case program_1.ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if ((noTreeShaking || element.is(program_1.ElementFlags.EXPORTED)) && !element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileFunctionUsingTypeArguments(element, [], null, element.declaration.name);\r\n }\r\n break;\r\n case program_1.ElementKind.GLOBAL:\r\n this.compileGlobal(element);\r\n break;\r\n case program_1.ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_2) throw e_2.error; }\r\n }\r\n var e_2, _c;\r\n };\r\n // exports\r\n Compiler.prototype.compileExportStatement = function (statement) {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n var internalExportName = (statement.range.source.internalPath +\r\n program_1.PATH_DELIMITER +\r\n member.externalName.text);\r\n var element = this.program.exports.get(internalExportName);\r\n if (!element)\r\n continue; // reported in Program#initialize\r\n switch (element.kind) {\r\n case program_1.ElementKind.CLASS_PROTOTYPE:\r\n if (!element.is(program_1.ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n case program_1.ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (!element.is(program_1.ElementFlags.GENERIC) &&\r\n statement.range.source.isEntry) {\r\n var functionInstance = this.compileFunctionUsingTypeArguments(element, [], null, element.declaration.name);\r\n if (functionInstance) {\r\n var functionDeclaration = functionInstance.prototype.declaration;\r\n if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n this.module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n }\r\n }\r\n }\r\n break;\r\n case program_1.ElementKind.GLOBAL:\r\n if (this.compileGlobal(element) && statement.range.source.isEntry) {\r\n var globalDeclaration = element.declaration;\r\n if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(element.internalName, member.externalName.text);\r\n }\r\n else {\r\n this.warning(diagnostics_1.DiagnosticCode.Cannot_export_a_mutable_global, member.range);\r\n }\r\n }\r\n }\r\n break;\r\n case program_1.ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n };\r\n // classes\r\n Compiler.prototype.compileClassDeclaration = function (declaration, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != program_1.ElementKind.CLASS_PROTOTYPE) {\r\n throw new Error(\"class expected\");\r\n }\r\n this.compileClassUsingTypeArguments(element, typeArguments, contextualTypeArguments, alternativeReportNode);\r\n };\r\n Compiler.prototype.compileClassUsingTypeArguments = function (prototype, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n typeArguments, contextualTypeArguments, alternativeReportNode);\r\n if (!instance)\r\n return;\r\n this.compileClass(instance);\r\n };\r\n Compiler.prototype.compileClass = function (instance) {\r\n if (instance.is(program_1.ElementFlags.COMPILED))\r\n return true;\r\n instance.set(program_1.ElementFlags.COMPILED);\r\n return true;\r\n };\r\n Compiler.prototype.compileInterfaceDeclaration = function (declaration, typeArguments, contextualTypeArguments, alternativeReportNode) {\r\n if (contextualTypeArguments === void 0) { contextualTypeArguments = null; }\r\n if (alternativeReportNode === void 0) { alternativeReportNode = null; }\r\n throw new Error(\"not implemented\");\r\n };\r\n // memory\r\n /** Adds a static memory segment with the specified data. */\r\n Compiler.prototype.addMemorySegment = function (buffer, alignment) {\r\n if (alignment === void 0) { alignment = 8; }\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = module_1.MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n };\r\n // statements\r\n Compiler.prototype.compileStatement = function (statement) {\r\n var expr;\r\n switch (statement.kind) {\r\n case ast_1.NodeKind.BLOCK:\r\n expr = this.compileBlockStatement(statement);\r\n break;\r\n case ast_1.NodeKind.BREAK:\r\n expr = this.compileBreakStatement(statement);\r\n break;\r\n case ast_1.NodeKind.CONTINUE:\r\n expr = this.compileContinueStatement(statement);\r\n break;\r\n case ast_1.NodeKind.DO:\r\n expr = this.compileDoStatement(statement);\r\n break;\r\n case ast_1.NodeKind.EMPTY:\r\n expr = this.compileEmptyStatement(statement);\r\n break;\r\n case ast_1.NodeKind.EXPRESSION:\r\n expr = this.compileExpressionStatement(statement);\r\n break;\r\n case ast_1.NodeKind.FOR:\r\n expr = this.compileForStatement(statement);\r\n break;\r\n case ast_1.NodeKind.IF:\r\n expr = this.compileIfStatement(statement);\r\n break;\r\n case ast_1.NodeKind.RETURN:\r\n expr = this.compileReturnStatement(statement);\r\n break;\r\n case ast_1.NodeKind.SWITCH:\r\n expr = this.compileSwitchStatement(statement);\r\n break;\r\n case ast_1.NodeKind.THROW:\r\n expr = this.compileThrowStatement(statement);\r\n break;\r\n case ast_1.NodeKind.TRY:\r\n expr = this.compileTryStatement(statement);\r\n break;\r\n case ast_1.NodeKind.VARIABLE:\r\n var variableInit = this.compileVariableStatement(statement);\r\n expr = variableInit ? variableInit : this.module.createNop();\r\n break;\r\n case ast_1.NodeKind.WHILE:\r\n expr = this.compileWhileStatement(statement);\r\n break;\r\n case ast_1.NodeKind.TYPEDECLARATION:\r\n if (this.currentFunction == this.startFunction) {\r\n return this.module.createNop();\r\n }\r\n // fall-through: must be top-level; function bodies are not guaranteed to be evaluated\r\n default:\r\n throw new Error(\"statement expected\");\r\n }\r\n this.addDebugLocation(expr, statement.range);\r\n return expr;\r\n };\r\n Compiler.prototype.compileStatements = function (statements) {\r\n var k = statements.length;\r\n var stmts = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n stmts[i] = this.compileStatement(statements[i]);\r\n }\r\n return stmts; // array of 0-es in noEmit-mode\r\n };\r\n Compiler.prototype.compileBlockStatement = function (statement) {\r\n var statements = statement.statements;\r\n // NOTE that we could optimize this to a NOP if empty or unwrap a single\r\n // statement, but that's not what the source told us to do and left to the\r\n // optimizer.\r\n // Not actually a branch, but can contain its own scoped variables.\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var stmt = this.module.createBlock(null, this.compileStatements(statements), module_1.NativeType.None);\r\n var stmtReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n if (stmtReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n }\r\n return stmt;\r\n };\r\n Compiler.prototype.compileBreakStatement = function (statement) {\r\n if (statement.label) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, statement.label.range);\r\n return this.module.createUnreachable();\r\n }\r\n var breakLabel = this.currentFunction.flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(diagnostics_1.DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement, statement.range);\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(4 /* POSSIBLY_BREAKS */);\r\n return this.module.createBreak(breakLabel);\r\n };\r\n Compiler.prototype.compileContinueStatement = function (statement) {\r\n if (statement.label) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, statement.label.range);\r\n return this.module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var continueLabel = this.currentFunction.flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(diagnostics_1.DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement, statement.range);\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(8 /* POSSIBLY_CONTINUES */);\r\n return this.module.createBreak(continueLabel);\r\n };\r\n Compiler.prototype.compileDoStatement = function (statement) {\r\n // A do statement does not initiate a new branch because it is executed at\r\n // least once, but has its own break and continue labels.\r\n var label = this.currentFunction.enterBreakContext();\r\n var previousBreakLabel = this.currentFunction.flow.breakLabel;\r\n var previousContinueLabel = this.currentFunction.flow.continueLabel;\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n var body = this.compileStatement(statement.statement);\r\n // Reset to the previous break and continue labels, if any.\r\n this.currentFunction.flow.breakLabel = previousBreakLabel;\r\n this.currentFunction.flow.continueLabel = previousContinueLabel;\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n this.currentFunction.leaveBreakContext();\r\n return this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel, condition)\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None);\r\n };\r\n Compiler.prototype.compileEmptyStatement = function (statement) {\r\n return this.module.createNop();\r\n };\r\n Compiler.prototype.compileExpressionStatement = function (statement) {\r\n var expr = this.compileExpression(statement.expression, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType != types_1.Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = types_1.Type.void;\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileForStatement = function (statement) {\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var context = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + context;\r\n // Compile in correct order\r\n var initializer = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : this.module.createNop();\r\n var condition = statement.condition\r\n ? this.compileExpression(statement.condition, types_1.Type.i32)\r\n : this.module.createI32(1);\r\n var incrementor = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, types_1.Type.void)\r\n : this.module.createNop();\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = !statement.condition && this.currentFunction.flow.is(1 /* RETURNS */);\r\n // TODO: check other always-true conditions as well, not just omitted\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n var expr = this.module.createBlock(breakLabel, [\r\n initializer,\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n incrementor,\r\n this.module.createBreak(continueLabel)\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None))\r\n ], module_1.NativeType.None);\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileIfStatement = function (statement) {\r\n // The condition doesn't initiate a branch yet\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n // Each arm initiates a branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var ifTrue = this.compileStatement(statement.ifTrue);\r\n var ifTrueReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n var ifFalse = 0;\r\n var ifFalseReturns = false;\r\n if (statement.ifFalse) {\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n ifFalse = this.compileStatement(statement.ifFalse);\r\n ifFalseReturns = this.currentFunction.flow.is(1 /* RETURNS */);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n }\r\n if (ifTrueReturns && ifFalseReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n }\r\n return this.module.createIf(condition, ifTrue, ifFalse);\r\n };\r\n Compiler.prototype.compileReturnStatement = function (statement) {\r\n var expression = 0;\r\n if (statement.value) {\r\n expression = this.compileExpression(statement.value, this.currentFunction.returnType);\r\n }\r\n // Remember that this flow returns\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n return this.module.createReturn(expression);\r\n };\r\n Compiler.prototype.compileSwitchStatement = function (statement) {\r\n // Everything within a switch uses the same break context\r\n var context = this.currentFunction.enterBreakContext();\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = this.currentFunction.getTempLocal(types_1.Type.i32);\r\n var k = statement.cases.length;\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + k);\r\n breaks[0] = this.module.createSetLocal(// initializer\r\n tempLocal.index, this.compileExpression(statement.condition, types_1.Type.i32));\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (var i = 0; i < k; ++i) {\r\n var case_ = statement.cases[i];\r\n if (case_.label) {\r\n breaks[breakIndex++] = this.module.createBreak(\"case\" + i.toString(10) + \"|\" + context, this.module.createBinary(module_1.BinaryOp.EqI32, this.module.createGetLocal(tempLocal.index, module_1.NativeType.I32), this.compileExpression(case_.label, types_1.Type.i32)));\r\n }\r\n else {\r\n defaultIndex = i;\r\n }\r\n }\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = this.module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\") + \"|\" + context);\r\n // nest blocks in order\r\n var currentBlock = this.module.createBlock(\"case0|\" + context, breaks, module_1.NativeType.None);\r\n var alwaysReturns = true;\r\n for (i = 0; i < k; ++i) {\r\n case_ = statement.cases[i];\r\n var l = case_.statements.length;\r\n var body = new Array(1 + l);\r\n body[0] = currentBlock;\r\n // Each switch case initiates a new branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var fallsThrough = i != k - 1;\r\n var nextLabel = !fallsThrough ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n for (var j = 0; j < l; ++j) {\r\n body[j + 1] = this.compileStatement(case_.statements[j]);\r\n }\r\n if (!(fallsThrough || this.currentFunction.flow.is(1 /* RETURNS */))) {\r\n alwaysReturns = false; // ignore fall-throughs\r\n }\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n currentBlock = this.module.createBlock(nextLabel, body, module_1.NativeType.None);\r\n }\r\n this.currentFunction.leaveBreakContext();\r\n // If the switch has a default and always returns, propagate that\r\n if (defaultIndex >= 0 && alwaysReturns) {\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n // Binaryen understands that so we don't need a hint\r\n }\r\n return currentBlock;\r\n };\r\n Compiler.prototype.compileThrowStatement = function (statement) {\r\n // Remember that this branch possibly throws\r\n this.currentFunction.flow.set(2 /* POSSIBLY_THROWS */);\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n this.currentFunction.flow.set(1 /* RETURNS */);\r\n // TODO: requires exception-handling spec.\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileTryStatement = function (statement) {\r\n throw new Error(\"not implemented\");\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n };\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n Compiler.prototype.compileVariableStatement = function (statement, isKnownGlobal) {\r\n if (isKnownGlobal === void 0) { isKnownGlobal = false; }\r\n var declarations = statement.declarations;\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (this.currentFunction == this.startFunction &&\r\n statement.parent && statement.parent.kind == ast_1.NodeKind.SOURCE)) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n // other variables become locals\r\n var initializers = new Array();\r\n for (i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var name = declaration.name.text;\r\n var type = null;\r\n var init = 0;\r\n if (declaration.type) {\r\n type = this.program.resolveType(// reports\r\n declaration.type, this.currentFunction.contextualTypeArguments);\r\n if (!type)\r\n continue;\r\n if (declaration.initializer) {\r\n init = this.compileExpression(declaration.initializer, type); // reports\r\n }\r\n }\r\n else if (declaration.initializer) {\r\n init = this.compileExpression(// reports\r\n declaration.initializer, types_1.Type.void, 0 /* NONE */);\r\n if (this.currentType == types_1.Type.void) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, declaration.range, this.currentType.toString(), \"\");\r\n continue;\r\n }\r\n type = this.currentType;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, declaration.name.range.atEnd);\r\n continue;\r\n }\r\n if (ast_1.hasModifier(ast_1.ModifierKind.CONST, declaration.modifiers)) {\r\n if (init) {\r\n init = this.precomputeExpressionRef(init);\r\n if (_BinaryenExpressionGetId(init) == module_1.ExpressionId.Const) {\r\n var local = new program_1.Local(this.program, name, -1, type);\r\n switch (_BinaryenExpressionGetType(init)) {\r\n case module_1.NativeType.I32:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI32(init), 0);\r\n break;\r\n case module_1.NativeType.I64:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI64Low(init), _BinaryenConstGetValueI64High(init));\r\n break;\r\n case module_1.NativeType.F32:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF32(init));\r\n break;\r\n case module_1.NativeType.F64:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF64(init));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n var scopedLocals = this.currentFunction.flow.scopedLocals;\r\n if (!scopedLocals)\r\n scopedLocals = this.currentFunction.flow.scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(diagnostics_1.DiagnosticCode.Duplicate_identifier_0, declaration.name.range, name);\r\n return 0;\r\n }\r\n scopedLocals.set(name, local);\r\n return 0;\r\n }\r\n else {\r\n this.warning(diagnostics_1.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable, declaration.range);\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._const_declarations_must_be_initialized, declaration.range);\r\n }\r\n }\r\n if (ast_1.hasModifier(ast_1.ModifierKind.LET, declaration.modifiers)) {\r\n this.currentFunction.flow.addScopedLocal(name, type, declaration.name); // reports\r\n }\r\n else {\r\n this.currentFunction.addLocal(type, name); // reports\r\n }\r\n if (init) {\r\n initializers.push(this.compileAssignmentWithValue(declaration.name, init));\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, module_1.NativeType.None)\r\n : 0;\r\n };\r\n Compiler.prototype.compileWhileStatement = function (statement) {\r\n // The condition does not yet initialize a branch\r\n var condition = this.compileExpression(statement.condition, types_1.Type.i32);\r\n // Statements initiate a new branch with its own break context\r\n var label = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = false && this.currentFunction.flow.is(1 /* RETURNS */);\r\n // TODO: evaluate possible always-true conditions\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n var expr = this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel, this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel)\r\n ], module_1.NativeType.None)))\r\n ], module_1.NativeType.None);\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n };\r\n // expressions\r\n /** Compiles an inlined constant value of a variable-like element. */\r\n Compiler.prototype.compileInlineConstant = function (element, contextualType) {\r\n assert(element.is(program_1.ElementFlags.INLINED));\r\n switch (element.type.is(4 /* INTEGER */) &&\r\n contextualType.is(4 /* INTEGER */) &&\r\n element.type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = element.type).kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n var shift = element.type.computeSmallIntegerShift(types_1.Type.i32);\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0);\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n var mask = element.type.computeSmallIntegerMask(types_1.Type.i32);\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0);\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue)\r\n : 0);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(element.constantValueKind == 1 /* INTEGER */\r\n ? i64_low(element.constantIntegerValue)\r\n : 0);\r\n }\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return element.constantValueKind == 1 /* INTEGER */\r\n ? this.module.createI64(i64_low(element.constantIntegerValue), i64_high(element.constantIntegerValue))\r\n : this.module.createI64(0);\r\n case 11 /* F32 */:\r\n return this.module.createF32(element.constantFloatValue);\r\n case 12 /* F64 */:\r\n return this.module.createF64(element.constantFloatValue);\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n };\r\n Compiler.prototype.compileExpression = function (expression, contextualType, conversionKind, wrapSmallIntegers) {\r\n if (conversionKind === void 0) { conversionKind = 1 /* IMPLICIT */; }\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n this.currentType = contextualType;\r\n var expr;\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.ASSERTION:\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.BINARY:\r\n expr = this.compileBinaryExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n case ast_1.NodeKind.CALL:\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.COMMA:\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.ELEMENTACCESS:\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.IDENTIFIER:\r\n case ast_1.NodeKind.FALSE:\r\n case ast_1.NodeKind.NULL:\r\n case ast_1.NodeKind.THIS:\r\n case ast_1.NodeKind.TRUE:\r\n expr = this.compileIdentifierExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.LITERAL:\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.NEW:\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.PARENTHESIZED:\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.PROPERTYACCESS:\r\n expr = this.compilePropertyAccessExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.TERNARY:\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.UNARYPOSTFIX:\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n case ast_1.NodeKind.UNARYPREFIX:\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n default:\r\n throw new Error(\"expression expected\");\r\n }\r\n if (conversionKind != 0 /* NONE */ && this.currentType != contextualType) {\r\n expr = this.convertExpression(expr, this.currentType, contextualType, conversionKind, expression);\r\n this.currentType = contextualType;\r\n }\r\n this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n };\r\n Compiler.prototype.precomputeExpression = function (expression, contextualType, conversionKind) {\r\n if (conversionKind === void 0) { conversionKind = 1 /* IMPLICIT */; }\r\n return this.precomputeExpressionRef(this.compileExpression(expression, contextualType, conversionKind));\r\n };\r\n Compiler.prototype.precomputeExpressionRef = function (expr) {\r\n var nativeType = this.currentType.toNativeType();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeType, []);\r\n var typeRefAdded = false;\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(this.currentType.toSignatureString(), nativeType, []);\r\n typeRefAdded = true;\r\n }\r\n var funcRef = this.module.addFunction(\"__precompute\", typeRef, [], expr);\r\n this.module.runPasses([\"precompute\"], funcRef);\r\n var ret = _BinaryenFunctionGetBody(funcRef);\r\n this.module.removeFunction(\"__precompute\");\r\n if (typeRefAdded) {\r\n // TODO: also remove the function type somehow if no longer used or make the C-API accept\r\n // a `null` typeRef, using an implicit type.\r\n }\r\n return ret;\r\n };\r\n Compiler.prototype.convertExpression = function (expr, fromType, toType, conversionKind, reportNode) {\r\n if (conversionKind == 0 /* NONE */) {\r\n assert(false, \"concrete type expected\");\r\n return expr;\r\n }\r\n // void to any\r\n if (fromType.kind == 13 /* VOID */) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_0_is_not_assignable_to_type_1, reportNode.range, fromType.toString(), toType.toString());\r\n return this.module.createUnreachable();\r\n }\r\n // any to void\r\n if (toType.kind == 13 /* VOID */) {\r\n return this.module.createDrop(expr);\r\n }\r\n var mod = this.module;\r\n var losesInformation = false;\r\n if (fromType.is(8 /* FLOAT */)) {\r\n // float to float\r\n if (toType.is(8 /* FLOAT */)) {\r\n if (fromType.kind == 11 /* F32 */) {\r\n // f32 to f64\r\n if (toType.kind == 12 /* F64 */) {\r\n expr = mod.createUnary(module_1.UnaryOp.PromoteF32, expr);\r\n }\r\n // otherwise f32 to f32\r\n // f64 to f32\r\n }\r\n else if (toType.kind == 11 /* F32 */) {\r\n losesInformation = true;\r\n expr = mod.createUnary(module_1.UnaryOp.DemoteF64, expr);\r\n }\r\n // otherwise f64 to f64\r\n // float to int\r\n }\r\n else if (toType.is(4 /* INTEGER */)) {\r\n losesInformation = true;\r\n // f32 to int\r\n if (fromType.kind == 11 /* F32 */) {\r\n if (toType.is(1 /* SIGNED */)) {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToI64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToI32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n else {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToU64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF32ToU32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n // f64 to int\r\n }\r\n else {\r\n if (toType.is(1 /* SIGNED */)) {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToI64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToI32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n else {\r\n if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToU64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(module_1.UnaryOp.TruncF64ToU32, expr);\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n }\r\n // float to void\r\n }\r\n else {\r\n assert(toType.flags == 0 /* NONE */, \"void type expected\");\r\n expr = this.module.createDrop(expr);\r\n }\r\n // int to float\r\n }\r\n else if (fromType.is(4 /* INTEGER */) && toType.is(8 /* FLOAT */)) {\r\n // int to f32\r\n if (toType.kind == 11 /* F32 */) {\r\n if (fromType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI64ToF32\r\n : module_1.UnaryOp.ConvertU64ToF32, expr);\r\n }\r\n else {\r\n losesInformation = !fromType.is(32 /* SMALL */);\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI32ToF32\r\n : module_1.UnaryOp.ConvertU32ToF32, expr);\r\n }\r\n // int to f64\r\n }\r\n else {\r\n if (fromType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI64ToF64\r\n : module_1.UnaryOp.ConvertU64ToF64, expr);\r\n }\r\n else {\r\n expr = mod.createUnary(fromType.is(1 /* SIGNED */)\r\n ? module_1.UnaryOp.ConvertI32ToF64\r\n : module_1.UnaryOp.ConvertU32ToF64, expr);\r\n }\r\n }\r\n // int to int\r\n }\r\n else {\r\n if (fromType.is(64 /* LONG */)) {\r\n // i64 to i32\r\n if (!toType.is(64 /* LONG */)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(module_1.UnaryOp.WrapI64, expr); // discards upper bits\r\n if (toType.is(32 /* SMALL */)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n // i32 to i64\r\n }\r\n else if (toType.is(64 /* LONG */)) {\r\n expr = mod.createUnary(toType.is(1 /* SIGNED */) ? module_1.UnaryOp.ExtendI32 : module_1.UnaryOp.ExtendU32, expr);\r\n // i32 or smaller to even smaller or same size int with change of sign\r\n }\r\n else if (toType.is(32 /* SMALL */) &&\r\n (fromType.size > toType.size ||\r\n (fromType.size == toType.size &&\r\n fromType.is(1 /* SIGNED */) != toType.is(1 /* SIGNED */)))) {\r\n losesInformation = true;\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n // otherwise (smaller) i32/u32 to (same size) i32/u32\r\n }\r\n if (losesInformation && conversionKind == 1 /* IMPLICIT */) {\r\n this.error(diagnostics_1.DiagnosticCode.Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast, reportNode.range, fromType.toString(), toType.toString());\r\n }\r\n return expr;\r\n };\r\n Compiler.prototype.compileAssertionExpression = function (expression, contextualType) {\r\n var toType = this.program.resolveType(// reports\r\n expression.toType, this.currentFunction.contextualTypeArguments);\r\n if (!toType)\r\n return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, 2 /* EXPLICIT */);\r\n };\r\n Compiler.prototype.compileBinaryExpression = function (expression, contextualType, wrapSmallIntegers) {\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n var left;\r\n var right;\r\n var condition;\r\n var expr;\r\n var compound = false;\r\n var possiblyOverflows = false;\r\n var tempLocal = null;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.LESSTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtI64, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LtI64\r\n : module_1.BinaryOp.LtI32, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LtU64\r\n : module_1.BinaryOp.LtU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LtF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GtU64\r\n : module_1.BinaryOp.GtU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GtF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.LESSTHAN_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LeI64\r\n : module_1.BinaryOp.LeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.LeU64\r\n : module_1.BinaryOp.LeU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.LeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GeI64\r\n : module_1.BinaryOp.GeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.GeU64\r\n : module_1.BinaryOp.GeU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.GeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EQUALS_EQUALS_EQUALS:\r\n // TODO?\r\n case tokenizer_1.Token.EQUALS_EQUALS:\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.EqI64\r\n : module_1.BinaryOp.EqI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.EqF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS_EQUALS:\r\n // TODO?\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType);\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.NeI64\r\n : module_1.BinaryOp.NeI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.NeF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.EQUALS:\r\n return this.compileAssignment(expression.left, expression.right, contextualType);\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.PLUS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF64, left, right);\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.MINUS:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.ASTERISK:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n // fall-through\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulI32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.MulI64\r\n : module_1.BinaryOp.MulI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulI64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.MulF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.SLASH:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // TODO: when can division remain unwrapped? does it overflow?\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n possiblyOverflows = true;\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.DivI64\r\n : module_1.BinaryOp.DivI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.DivU64\r\n : module_1.BinaryOp.DivU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivF32, left, right);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.DivF64, left, right);\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.PERCENT:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // TODO: when can remainder remain unwrapped? may it overflow?\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemI32, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.RemI64\r\n : module_1.BinaryOp.RemI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemI64, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemU32, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.RemU64\r\n : module_1.BinaryOp.RemU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.RemU64, left, right);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n // TODO: internal fmod, possibly simply imported from JS\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n expr = this.module.createUnreachable();\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShlI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShlI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShlI64\r\n : module_1.BinaryOp.ShlI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, true // must wrap small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n default:\r\n // assumes signed shr on signed small integers does not overflow\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrI64, left, right);\r\n break;\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrI64\r\n : module_1.BinaryOp.ShrI32, left, right);\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n // assumes unsigned shr on unsigned small integers does not overflow\r\n case 7 /* U32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrU64\r\n : module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType == types_1.Type.void\r\n ? types_1.Type.u64\r\n : contextualType, 0 /* NONE */, true // modifies low bits of small integers if unsigned\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, true // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n possiblyOverflows = true;\r\n // fall-through\r\n default:\r\n // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.ShrU64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.ShrU64\r\n : module_1.BinaryOp.ShrU32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.AMPERSAND:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.AndI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AndI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AndI64\r\n : module_1.BinaryOp.AndI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.BAR:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.OrI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.OrI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.OrI64\r\n : module_1.BinaryOp.OrI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n compound = true;\r\n case tokenizer_1.Token.CARET:\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, 0 /* NONE */, false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false // ^\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI32, left, right);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI64, left, right);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.XorI64\r\n : module_1.BinaryOp.XorI32, left, right);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n // logical (no overloading)\r\n case tokenizer_1.Token.AMPERSAND_AMPERSAND:// left && right\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false);\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */);\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(condition, // left\r\n right, // ? right\r\n expr // : cloned left\r\n );\r\n }\r\n else {\r\n expr = this.module.createIf(condition, right, this.module.createGetLocal(assert(tempLocal, \"tempLocal must be set\").index, this.currentType.toNativeType()));\r\n }\r\n break;\r\n case tokenizer_1.Token.BAR_BAR:// left || right\r\n left = this.compileExpression(expression.left, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */);\r\n right = this.compileExpression(expression.right, this.currentType, 1 /* IMPLICIT */, false);\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */); // if right did\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(condition, // left\r\n expr, // ? cloned left\r\n right // : right\r\n );\r\n }\r\n else {\r\n expr = this.module.createIf(condition, this.module.createGetLocal(assert(tempLocal, \"tempLocal must be set\").index, this.currentType.toNativeType()), right);\r\n }\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"not implemented\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */), \"small integer type expected\");\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.left, expr, contextualType != types_1.Type.void)\r\n : expr;\r\n };\r\n Compiler.prototype.compileAssignment = function (expression, valueExpression, contextualType) {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n // to compile just the value, we need to know the target's type\r\n var element = resolved.element;\r\n var elementType;\r\n switch (element.kind) {\r\n case program_1.ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void, \"concrete type expected\");\r\n // fall-through\r\n case program_1.ElementKind.LOCAL:\r\n case program_1.ElementKind.FIELD:\r\n elementType = element.type;\r\n break;\r\n case program_1.ElementKind.PROPERTY:\r\n var setterPrototype = element.setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (!setterInstance)\r\n return this.module.createUnreachable();\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n elementType = setterInstance.parameters[0].type;\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == ast_1.NodeKind.ELEMENTACCESS) {\r\n assert(resolved.target &&\r\n resolved.target.kind == program_1.ElementKind.CLASS &&\r\n element.simpleName == resolved.target.prototype.fnIndexedGet);\r\n var resolvedIndexedSet = element.resolve(null);\r\n if (resolvedIndexedSet) {\r\n elementType = resolvedIndexedSet.returnType;\r\n break;\r\n }\r\n }\r\n // fall-through\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // now compile the value and do the assignment\r\n this.currentType = elementType;\r\n return this.compileAssignmentWithValue(expression, this.compileExpression(valueExpression, elementType), contextualType != types_1.Type.void);\r\n };\r\n Compiler.prototype.compileAssignmentWithValue = function (expression, valueWithCorrectType, tee) {\r\n if (tee === void 0) { tee = false; }\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n var tempLocal;\r\n var targetExpr;\r\n switch (element.kind) {\r\n case program_1.ElementKind.LOCAL:\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n return tee\r\n ? this.module.createTeeLocal(element.index, valueWithCorrectType)\r\n : this.module.createSetLocal(element.index, valueWithCorrectType);\r\n case program_1.ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void, \"concrete type expected\");\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n if (element.is(program_1.ElementFlags.CONSTANT)) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n if (!tee) {\r\n return this.module.createSetGlobal(element.internalName, valueWithCorrectType);\r\n }\r\n var globalNativeType = element.type.toNativeType();\r\n return this.module.createBlock(null, [\r\n this.module.createSetGlobal(element.internalName, valueWithCorrectType),\r\n this.module.createGetGlobal(element.internalName, globalNativeType)\r\n ], globalNativeType);\r\n case program_1.ElementKind.FIELD:\r\n if (element.prototype.isReadonly) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n assert(resolved.targetExpression != null, \"target expression expected\");\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType, \"class type expected\");\r\n this.currentType = tee ? element.type : types_1.Type.void;\r\n var elementNativeType = element.type.toNativeType();\r\n if (!tee) {\r\n return this.module.createStore(element.type.size >> 3, targetExpr, valueWithCorrectType, elementNativeType, element.memoryOffset);\r\n }\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(element.type);\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, valueWithCorrectType),\r\n this.module.createStore(element.type.size >> 3, targetExpr, this.module.createGetLocal(tempLocal.index, elementNativeType), elementNativeType, element.memoryOffset),\r\n this.module.createGetLocal(tempLocal.index, elementNativeType)\r\n ], elementNativeType);\r\n case program_1.ElementKind.PROPERTY:\r\n var setterPrototype = element.setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (setterInstance) {\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n if (!tee) {\r\n if (setterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n this.currentType = types_1.Type.void;\r\n return this.makeCall(setterInstance, [targetExpr, valueWithCorrectType]);\r\n }\r\n else {\r\n this.currentType = types_1.Type.void;\r\n return this.makeCall(setterInstance, [valueWithCorrectType]);\r\n }\r\n }\r\n var getterPrototype = element.getterPrototype;\r\n assert(getterPrototype != null);\r\n var getterInstance = getterPrototype.resolve(); // reports\r\n if (getterInstance) {\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n if (setterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(getterInstance.returnType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [\r\n this.module.createTeeLocal(tempLocal.index, targetExpr), valueWithCorrectType\r\n ]),\r\n this.makeCall(getterInstance, [\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ])\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n else {\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [valueWithCorrectType]),\r\n this.makeCall(getterInstance)\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property, expression.range, element.internalName);\r\n }\r\n return this.module.createUnreachable();\r\n case program_1.ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == ast_1.NodeKind.ELEMENTACCESS) {\r\n assert(resolved.target && resolved.target.kind == program_1.ElementKind.CLASS);\r\n var resolvedIndexedGet = element.resolve();\r\n if (!resolvedIndexedGet)\r\n return this.module.createUnreachable();\r\n var indexedSetName = resolved.target.prototype.fnIndexedSet;\r\n var indexedSet;\r\n if (indexedSetName != null &&\r\n resolved.target.members &&\r\n (indexedSet = resolved.target.members.get(indexedSetName)) &&\r\n indexedSet.kind == program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n var resolvedIndexedSet = indexedSet.resolve();\r\n if (!resolvedIndexedSet)\r\n return this.module.createUnreachable();\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32, 0 /* NONE */);\r\n assert(this.currentType.classType);\r\n var elementExpr = this.compileExpression(expression.elementExpression, types_1.Type.i32);\r\n if (!tee) {\r\n this.currentType = resolvedIndexedSet.returnType;\r\n return this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n this.currentType = resolvedIndexedGet.returnType;\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n this.module.createTeeLocal(tempLocal.index, valueWithCorrectType)\r\n ]),\r\n // TODO: could be different from an actual __get (needs 2 temp locals)\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ], this.currentType.toNativeType());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Index_signature_in_type_0_only_permits_reading, expression.range, resolved.target.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileCallExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveExpression(expression.expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n if (element.kind != program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures, expression.range, element.internalName);\r\n return this.module.createUnreachable();\r\n }\r\n var functionPrototype = element;\r\n var functionInstance = null;\r\n // TODO: generalize?\r\n if (functionPrototype.is(program_1.ElementFlags.BUILTIN)) {\r\n var resolvedTypeArguments = null;\r\n if (expression.typeArguments) {\r\n var k = expression.typeArguments.length;\r\n resolvedTypeArguments = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var resolvedType = this.program.resolveType(// reports\r\n expression.typeArguments[i], this.currentFunction.contextualTypeArguments, true);\r\n if (!resolvedType)\r\n return this.module.createUnreachable();\r\n resolvedTypeArguments[i] = resolvedType;\r\n }\r\n }\r\n var expr = builtins_1.compileCall(this, functionPrototype, resolvedTypeArguments, expression.arguments, contextualType, expression);\r\n if (!expr) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n // TODO: infer type arguments from parameter types if omitted\r\n functionInstance = functionPrototype.resolveInclTypeArguments(// reports\r\n expression.typeArguments, this.currentFunction.contextualTypeArguments, expression);\r\n if (!functionInstance)\r\n return this.module.createUnreachable();\r\n // TODO: generalize? (see above)\r\n /* if (functionInstance.is(ElementFlags.BUILTIN)) {\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n functionInstance.typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n } */\r\n var numArguments = expression.arguments.length;\r\n var numArgumentsInclThis = functionInstance.instanceMethodOf\r\n ? numArguments + 1\r\n : numArguments;\r\n var argumentIndex = 0;\r\n var args = new Array(numArgumentsInclThis);\r\n if (functionInstance.instanceMethodOf) {\r\n assert(resolved.targetExpression != null);\r\n args[argumentIndex++] = resolved.targetExpression;\r\n }\r\n for (i = 0; i < numArguments; ++i) {\r\n args[argumentIndex++] = expression.arguments[i];\r\n }\r\n return this.compileCall(functionInstance, args, expression);\r\n };\r\n /**\r\n * Compiles a call to a function. If an instance method, `this` is the first element in\r\n * `argumentExpressions` or can be specified explicitly as the last argument.\r\n */\r\n Compiler.prototype.compileCall = function (functionInstance, argumentExpressions, reportNode, thisArg) {\r\n if (thisArg === void 0) { thisArg = 0; }\r\n // validate and compile arguments\r\n var parameters = functionInstance.parameters;\r\n var numParameters = parameters ? parameters.length : 0;\r\n var numParametersInclThis = functionInstance.instanceMethodOf != null\r\n ? numParameters + 1\r\n : numParameters;\r\n var numArgumentsInclThis = argumentExpressions.length;\r\n var numArguments = functionInstance.instanceMethodOf != null\r\n ? numArgumentsInclThis - 1\r\n : numArgumentsInclThis;\r\n if (thisArg)\r\n numArgumentsInclThis++;\r\n if (numArgumentsInclThis > numParametersInclThis) {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, numParameters.toString(10), numArguments.toString(10));\r\n return this.module.createUnreachable();\r\n }\r\n var operands = new Array(numParametersInclThis);\r\n var operandIndex = 0;\r\n var argumentIndex = 0;\r\n if (functionInstance.instanceMethodOf) {\r\n if (thisArg) {\r\n operands[operandIndex++] = thisArg;\r\n }\r\n else {\r\n operands[operandIndex++] = this.compileExpression(argumentExpressions[argumentIndex++], functionInstance.instanceMethodOf.type);\r\n }\r\n }\r\n if (parameters) {\r\n for (; operandIndex < numParametersInclThis; ++operandIndex) {\r\n // argument has been provided\r\n if (numArgumentsInclThis > operandIndex) {\r\n operands[operandIndex] = this.compileExpression(argumentExpressions[argumentIndex++], parameters[operandIndex + numParameters - numParametersInclThis].type);\r\n // argument has been omitted\r\n }\r\n else {\r\n var initializer = parameters[operandIndex + numParameters - numParametersInclThis].initializer;\r\n if (initializer) {\r\n operands[operandIndex] = this.compileExpression(initializer, parameters[operandIndex + numParameters - numParametersInclThis].type);\r\n // FIXME: here, the initializer is compiled in the caller's scope.\r\n // a solution could be to use a stub for each possible overload, calling the\r\n // full function with optional arguments being part of the stub's body.\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, (operandIndex + numParameters - numParametersInclThis).toString(10), numArguments.toString(10));\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n }\r\n this.currentType = functionInstance.returnType;\r\n return this.makeCall(functionInstance, operands);\r\n };\r\n /** Makes a call operation as is. */\r\n Compiler.prototype.makeCall = function (functionInstance, operands) {\r\n if (operands === void 0) { operands = null; }\r\n if (!(functionInstance.is(program_1.ElementFlags.COMPILED) || this.compileFunction(functionInstance))) {\r\n return this.module.createUnreachable();\r\n }\r\n // imported function\r\n if (functionInstance.is(program_1.ElementFlags.DECLARED)) {\r\n return this.module.createCallImport(functionInstance.internalName, operands, functionInstance.returnType.toNativeType());\r\n }\r\n // internal function\r\n return this.module.createCall(functionInstance.internalName, operands, functionInstance.returnType.toNativeType());\r\n };\r\n Compiler.prototype.compileCommaExpression = function (expression, contextualType) {\r\n var expressions = expression.expressions;\r\n var k = expressions.length;\r\n var exprs = new Array(k--);\r\n for (var i = 0; i < k; ++i) {\r\n exprs[i] = this.compileExpression(expressions[i], types_1.Type.void); // drop all\r\n }\r\n exprs[i] = this.compileExpression(expressions[i], contextualType); // except last\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n };\r\n Compiler.prototype.compileElementAccessExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveElementAccess(expression, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n assert(resolved.element.kind == program_1.ElementKind.FUNCTION_PROTOTYPE &&\r\n resolved.target &&\r\n resolved.target.kind == program_1.ElementKind.CLASS);\r\n var instance = resolved.element.resolve(null, resolved.target.contextualTypeArguments);\r\n if (!instance)\r\n return this.module.createUnreachable();\r\n return this.compileCall(instance, [\r\n expression.expression,\r\n expression.elementExpression\r\n ], expression);\r\n };\r\n Compiler.prototype.compileIdentifierExpression = function (expression, contextualType) {\r\n // check special keywords first\r\n switch (expression.kind) {\r\n case ast_1.NodeKind.NULL:\r\n if (this.options.isWasm64) {\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == 9 /* USIZE */);\r\n this.currentType = types_1.Type.usize64;\r\n }\r\n return this.module.createI64(0);\r\n }\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == 9 /* USIZE */);\r\n this.currentType = types_1.Type.usize32;\r\n }\r\n return this.module.createI32(0);\r\n case ast_1.NodeKind.TRUE:\r\n this.currentType = types_1.Type.bool;\r\n return this.module.createI32(1);\r\n case ast_1.NodeKind.FALSE:\r\n this.currentType = types_1.Type.bool;\r\n return this.module.createI32(0);\r\n case ast_1.NodeKind.THIS:\r\n if (this.currentFunction.instanceMethodOf) {\r\n this.currentType = this.currentFunction.instanceMethodOf.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._this_cannot_be_referenced_in_current_location, expression.range);\r\n this.currentType = this.options.isWasm64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n return this.module.createUnreachable();\r\n case ast_1.NodeKind.SUPER:\r\n if (this.currentFunction.instanceMethodOf && this.currentFunction.instanceMethodOf.base) {\r\n this.currentType = this.currentFunction.instanceMethodOf.base.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(diagnostics_1.DiagnosticCode._super_can_only_be_referenced_in_a_derived_class, expression.range);\r\n this.currentType = this.options.isWasm64 ? types_1.Type.usize64 : types_1.Type.usize32;\r\n return this.module.createUnreachable();\r\n }\r\n // otherwise resolve\r\n var resolved = this.program.resolveIdentifier(// reports\r\n expression, this.currentFunction, this.currentEnum);\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n switch (element.kind) {\r\n case program_1.ElementKind.LOCAL:\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n assert(element.index >= 0);\r\n this.currentType = element.type;\r\n return this.module.createGetLocal(element.index, this.currentType.toNativeType());\r\n case program_1.ElementKind.GLOBAL:\r\n if (element.is(program_1.ElementFlags.BUILTIN)) {\r\n return builtins_1.compileGetConstant(this, element, expression);\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void);\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = element.type;\r\n return this.module.createGetGlobal(element.internalName, this.currentType.toNativeType());\r\n case program_1.ElementKind.ENUMVALUE:// here: if referenced from within the same enum\r\n if (!element.is(program_1.ElementFlags.COMPILED)) {\r\n this.error(diagnostics_1.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums, expression.range);\r\n this.currentType = types_1.Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = types_1.Type.i32;\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.module.createI32(element.constantValue);\r\n }\r\n return this.module.createGetGlobal(element.internalName, module_1.NativeType.I32);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileLiteralExpression = function (expression, contextualType, implicitNegate) {\r\n if (implicitNegate === void 0) { implicitNegate = false; }\r\n switch (expression.literalKind) {\r\n case 4 /* ARRAY */:\r\n assert(!implicitNegate);\r\n var classType = contextualType.classType;\r\n if (classType &&\r\n classType == this.program.elements.get(\"Array\") &&\r\n classType.typeArguments && classType.typeArguments.length == 1) {\r\n return this.compileStaticArray(classType.typeArguments[0], expression.elementExpressions);\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n case 0 /* FLOAT */: {\r\n var floatValue = expression.value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == types_1.Type.f32) {\r\n return this.module.createF32(floatValue);\r\n }\r\n this.currentType = types_1.Type.f64;\r\n return this.module.createF64(floatValue);\r\n }\r\n case 1 /* INTEGER */:\r\n var intValue = expression.value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(i64_new(0), intValue);\r\n }\r\n switch (contextualType.kind) {\r\n // compile to contextualType if matching\r\n case 0 /* I8 */:\r\n if (i64_is_i8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 1 /* I16 */:\r\n if (i64_is_i16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 2 /* I32 */:\r\n if (i64_is_i32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 5 /* U8 */:\r\n if (i64_is_u8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 6 /* U16 */:\r\n if (i64_is_u16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 7 /* U32 */:\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 10 /* BOOL */:\r\n if (i64_is_bool(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n case 4 /* ISIZE */:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 9 /* USIZE */:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n case 11 /* F32 */:\r\n if (i64_is_f32(intValue)) {\r\n return this.module.createF32(i64_to_f32(intValue));\r\n }\r\n break;\r\n case 12 /* F64 */:\r\n if (i64_is_f64(intValue)) {\r\n return this.module.createF64(i64_to_f64(intValue));\r\n }\r\n break;\r\n case 13 /* VOID */:\r\n break;\r\n default:\r\n assert(false);\r\n break;\r\n }\r\n // otherwise compile to best fitting native type\r\n if (i64_is_i32(intValue)) {\r\n this.currentType = types_1.Type.i32;\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n else {\r\n this.currentType = types_1.Type.i64;\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n }\r\n case 2 /* STRING */:\r\n assert(!implicitNegate);\r\n return this.compileStaticString(expression.value);\r\n }\r\n throw new Error(\"not implemented\");\r\n };\r\n Compiler.prototype.compileStaticString = function (stringValue) {\r\n var stringSegment = this.stringSegments.get(stringValue);\r\n if (!stringSegment) {\r\n var stringLength = stringValue.length;\r\n var stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n stringBuffer[0] = stringLength & 0xff;\r\n stringBuffer[1] = (stringLength >>> 8) & 0xff;\r\n stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n for (var i = 0; i < stringLength; ++i) {\r\n stringBuffer[4 + i * 2] = stringValue.charCodeAt(i) & 0xff;\r\n stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n }\r\n stringSegment = this.addMemorySegment(stringBuffer, this.options.usizeType.byteSize);\r\n this.stringSegments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n this.currentType = this.options.usizeType;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n }\r\n assert(i64_is_i32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n };\r\n Compiler.prototype.compileStaticArray = function (elementType, expressions) {\r\n // compile as static if all element expressions are precomputable, otherwise\r\n // initialize in place.\r\n var isStatic = true;\r\n var size = expressions.length;\r\n var nativeType = elementType.toNativeType();\r\n var values;\r\n switch (nativeType) {\r\n case module_1.NativeType.I32:\r\n values = changetype(new Int32Array(size));\r\n break;\r\n case module_1.NativeType.I64:\r\n values = changetype(new Array(size));\r\n break;\r\n case module_1.NativeType.F32:\r\n values = changetype(new Float32Array(size));\r\n break;\r\n case module_1.NativeType.F64:\r\n values = changetype(new Float64Array(size));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n var exprs = new Array(size);\r\n var expr;\r\n for (var i = 0; i < size; ++i) {\r\n exprs[i] = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType)\r\n : elementType.toNativeZero(this.module);\r\n if (isStatic) {\r\n expr = this.precomputeExpressionRef(exprs[i]);\r\n if (_BinaryenExpressionGetId(expr) == module_1.ExpressionId.Const) {\r\n assert(_BinaryenExpressionGetType(expr) == nativeType);\r\n switch (nativeType) {\r\n case module_1.NativeType.I32:\r\n changetype(values)[i] = _BinaryenConstGetValueI32(expr);\r\n break;\r\n case module_1.NativeType.I64:\r\n changetype(values)[i] = i64_new(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr));\r\n break;\r\n case module_1.NativeType.F32:\r\n changetype(values)[i] = _BinaryenConstGetValueF32(expr);\r\n break;\r\n case module_1.NativeType.F64:\r\n changetype(values)[i] = _BinaryenConstGetValueF64(expr);\r\n break;\r\n default:\r\n assert(false); // checked above\r\n }\r\n }\r\n else {\r\n // TODO: emit a warning if declared 'const'\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n if (isStatic) {\r\n // TODO: convert to Uint8Array and create the segment\r\n }\r\n else {\r\n // TODO: initialize in place\r\n }\r\n // TODO: alternatively, static elements could go into data segments while\r\n // dynamic ones are initialized on top? any benefits? (doesn't seem so)\r\n throw new Error(\"not implemented\");\r\n };\r\n Compiler.prototype.compileNewExpression = function (expression, contextualType) {\r\n var resolved = this.program.resolveExpression(// reports\r\n expression.expression, this.currentFunction);\r\n if (resolved) {\r\n if (resolved.element.kind == program_1.ElementKind.CLASS_PROTOTYPE) {\r\n var prototype = resolved.element;\r\n var instance = prototype.resolveInclTypeArguments(// reports\r\n expression.typeArguments, null, expression);\r\n if (instance) {\r\n var thisExpr = builtins_1.compileAllocate(this, instance, expression);\r\n var initializers = new Array();\r\n // use a temp local for 'this'\r\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\r\n initializers.push(this.module.createSetLocal(tempLocal.index, thisExpr));\r\n // apply field initializers\r\n if (instance.members) {\r\n try {\r\n for (var _a = __values(instance.members.values()), _b = _a.next(); !_b.done; _b = _a.next()) {\r\n var member = _b.value;\r\n if (member.kind == program_1.ElementKind.FIELD) {\r\n var field = member;\r\n var fieldDeclaration = field.prototype.declaration;\r\n if (field.is(program_1.ElementFlags.CONSTANT)) {\r\n assert(false); // there are no built-in fields currently\r\n }\r\n else if (fieldDeclaration && fieldDeclaration.initializer) {\r\n initializers.push(this.module.createStore(field.type.byteSize, this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType), this.compileExpression(fieldDeclaration.initializer, field.type), field.type.toNativeType(), field.memoryOffset));\r\n }\r\n }\r\n }\r\n }\r\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\r\n finally {\r\n try {\r\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\r\n }\r\n finally { if (e_3) throw e_3.error; }\r\n }\r\n }\r\n // apply constructor\r\n var constructorInstance = instance.constructorInstance;\r\n if (constructorInstance) {\r\n initializers.push(this.compileCall(constructorInstance, expression.arguments, expression, this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType)));\r\n }\r\n // return 'this'\r\n initializers.push(this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType));\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n thisExpr = this.module.createBlock(null, initializers, this.options.nativeSizeType);\r\n this.currentType = instance.type;\r\n return thisExpr;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature, expression.expression.range);\r\n }\r\n }\r\n return this.module.createUnreachable();\r\n var e_3, _c;\r\n };\r\n Compiler.prototype.compileParenthesizedExpression = function (expression, contextualType) {\r\n // does not change types, just order\r\n return this.compileExpression(expression.expression, contextualType, 0 /* NONE */);\r\n };\r\n Compiler.prototype.compilePropertyAccessExpression = function (propertyAccess, contextualType) {\r\n var resolved = this.program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n if (!resolved)\r\n return this.module.createUnreachable();\r\n var element = resolved.element;\r\n var targetExpr;\r\n switch (element.kind) {\r\n case program_1.ElementKind.GLOBAL:// static property\r\n if (element.is(program_1.ElementFlags.BUILTIN)) {\r\n return builtins_1.compileGetConstant(this, element, propertyAccess);\r\n }\r\n if (!this.compileGlobal(element)) {\r\n return this.module.createUnreachable();\r\n }\r\n assert(element.type != types_1.Type.void);\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = element.type;\r\n return this.module.createGetGlobal(element.internalName, this.currentType.toNativeType());\r\n case program_1.ElementKind.ENUMVALUE:// enum value\r\n if (!this.compileEnum(element.enum)) {\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = types_1.Type.i32;\r\n if (element.is(program_1.ElementFlags.INLINED)) {\r\n return this.module.createI32(element.constantValue);\r\n }\r\n return this.module.createGetGlobal(element.internalName, module_1.NativeType.I32);\r\n case program_1.ElementKind.FIELD:// instance field\r\n assert(resolved.target != null);\r\n assert(resolved.targetExpression != null);\r\n assert(element.memoryOffset >= 0);\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.usizeType);\r\n this.currentType = element.type;\r\n return this.module.createLoad(element.type.size >> 3, element.type.is(1 /* SIGNED */ | 4 /* INTEGER */), targetExpr, element.type.toNativeType(), element.memoryOffset);\r\n case program_1.ElementKind.PROPERTY:// instance property (here: getter)\r\n var getter = element.getterPrototype;\r\n assert(getter != null);\r\n var getterInstance = getter.resolve(null); // reports\r\n if (!getterInstance)\r\n return this.module.createUnreachable();\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n this.currentType = getterInstance.returnType;\r\n if (getterInstance.is(program_1.ElementFlags.INSTANCE)) {\r\n targetExpr = this.compileExpression(resolved.targetExpression, this.options.isWasm64\r\n ? types_1.Type.usize64\r\n : types_1.Type.usize32);\r\n this.currentType = getterInstance.returnType;\r\n return this.makeCall(getterInstance, [targetExpr]);\r\n }\r\n else {\r\n return this.makeCall(getterInstance);\r\n }\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, propertyAccess.range);\r\n return this.module.createUnreachable();\r\n };\r\n Compiler.prototype.compileTernaryExpression = function (expression, contextualType) {\r\n var condition = this.compileExpression(expression.condition, types_1.Type.i32);\r\n var ifThen = this.compileExpression(expression.ifThen, contextualType);\r\n var ifElse = this.compileExpression(expression.ifElse, contextualType);\r\n return this.module.createIf(condition, ifThen, ifElse);\r\n };\r\n Compiler.prototype.compileUnaryPostfixExpression = function (expression, contextualType) {\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n var op;\r\n var nativeType;\r\n var nativeOne;\r\n var possiblyOverflows = false;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n op = module_1.BinaryOp.AddI32;\r\n nativeType = module_1.NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n op = this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32;\r\n nativeType = this.options.isWasm64\r\n ? module_1.NativeType.I64\r\n : module_1.NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n op = module_1.BinaryOp.AddI64;\r\n nativeType = module_1.NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n case 11 /* F32 */:\r\n op = module_1.BinaryOp.AddF32;\r\n nativeType = module_1.NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n case 12 /* F64 */:\r\n op = module_1.BinaryOp.AddF64;\r\n nativeType = module_1.NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true;\r\n default:\r\n op = module_1.BinaryOp.SubI32;\r\n nativeType = module_1.NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: check operator overload\r\n case 4 /* ISIZE */:\r\n op = this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32;\r\n nativeType = this.options.isWasm64\r\n ? module_1.NativeType.I64\r\n : module_1.NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n op = module_1.BinaryOp.SubI64;\r\n nativeType = module_1.NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n case 11 /* F32 */:\r\n op = module_1.BinaryOp.SubF32;\r\n nativeType = module_1.NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n case 12 /* F64 */:\r\n op = module_1.BinaryOp.SubF64;\r\n nativeType = module_1.NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n case 13 /* VOID */:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"unary postfix operator expected\");\r\n }\r\n var setValue;\r\n var tempLocal = null;\r\n // simplify if dropped anyway\r\n if (contextualType == types_1.Type.void) {\r\n setValue = this.module.createBinary(op, getValue, nativeOne);\r\n // otherwise use a temp local for the intermediate value\r\n }\r\n else {\r\n tempLocal = this.currentFunction.getTempLocal(this.currentType);\r\n setValue = this.module.createBinary(op, this.module.createGetLocal(tempLocal.index, nativeType), nativeOne);\r\n }\r\n if (possiblyOverflows) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */));\r\n setValue = makeSmallIntegerWrap(setValue, this.currentType, this.module);\r\n }\r\n setValue = this.compileAssignmentWithValue(expression.operand, setValue, false);\r\n // ^ sets currentType = void\r\n if (contextualType == types_1.Type.void) {\r\n assert(!tempLocal);\r\n return setValue;\r\n }\r\n this.currentType = assert(tempLocal).type;\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, getValue),\r\n setValue,\r\n this.module.createGetLocal(tempLocal.index, nativeType)\r\n ], nativeType);\r\n };\r\n Compiler.prototype.compileUnaryPrefixExpression = function (expression, contextualType, wrapSmallIntegers) {\r\n if (wrapSmallIntegers === void 0) { wrapSmallIntegers = true; }\r\n var possiblyOverflows = false;\r\n var compound = false;\r\n var expr;\r\n switch (expression.operator) {\r\n case tokenizer_1.Token.PLUS:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n possiblyOverflows = this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */); // if operand already did\r\n break;\r\n case tokenizer_1.Token.MINUS:\r\n if (expression.operand.kind == ast_1.NodeKind.LITERAL && (expression.operand.literalKind == 1 /* INTEGER */ ||\r\n expression.operand.literalKind == 0 /* FLOAT */)) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n this.addDebugLocation(expr, expression.range); // compileExpression normally does this\r\n }\r\n else {\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, this.module.createI32(0), expr);\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, this.currentType.toNativeZero(this.module), expr);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, this.module.createI64(0), expr);\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createUnary(module_1.UnaryOp.NegF32, expr);\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createUnary(module_1.UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n }\r\n break;\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n compound = true;\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.AddI64\r\n : module_1.BinaryOp.AddI32, expr, this.currentType.toNativeOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddI64, expr, this.module.createI64(1));\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF32, expr, this.module.createF32(1));\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.AddF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n compound = true;\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n // fall-through\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI32, expr, this.module.createI32(1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, expr, this.currentType.toNativeOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubI64, expr, this.module.createI64(1));\r\n break;\r\n case 11 /* F32 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF32, expr, this.module.createF32(1));\r\n break;\r\n case 12 /* F64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.SubF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.EXCLAMATION:\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType, 0 /* NONE */, true // must wrap small integers\r\n );\r\n expr = makeIsFalseish(expr, this.currentType, this.module);\r\n this.currentType = types_1.Type.bool;\r\n break;\r\n case tokenizer_1.Token.TILDE:\r\n expr = this.compileExpression(expression.operand, contextualType == types_1.Type.void\r\n ? types_1.Type.i32\r\n : contextualType.is(8 /* FLOAT */)\r\n ? types_1.Type.i64\r\n : contextualType, contextualType == types_1.Type.void\r\n ? 0 /* NONE */\r\n : 1 /* IMPLICIT */, false // retains low bits of small integers\r\n );\r\n switch (this.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI32, expr, this.module.createI32(-1));\r\n break;\r\n case 9 /* USIZE */:\r\n if (this.currentType.isReference) {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n expr = this.module.createBinary(this.options.isWasm64\r\n ? module_1.BinaryOp.XorI64\r\n : module_1.BinaryOp.XorI32, expr, this.currentType.toNativeNegOne(this.module));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = this.module.createBinary(module_1.BinaryOp.XorI64, expr, this.module.createI64(-1, -1));\r\n break;\r\n }\r\n break;\r\n case tokenizer_1.Token.TYPEOF:\r\n // it might make sense to implement typeof in a way that a generic function can detect\r\n // whether its type argument is a class type or string. that could then be used, for\r\n // example, to generate hash codes for sets and maps, depending on the kind of type\r\n // parameter we have. ideally the comparison would not involve actual string comparison and\r\n // limit available operations to hard-coded string literals.\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"not implemented\");\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n throw new Error(\"unary operator expected\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(32 /* SMALL */ | 4 /* INTEGER */));\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != types_1.Type.void)\r\n : expr;\r\n };\r\n Compiler.prototype.addDebugLocation = function (expr, range) {\r\n if (this.options.sourceMap != null) {\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) {\r\n source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n }\r\n range.debugInfoRef = expr;\r\n if (!this.currentFunction.debugLocations)\r\n this.currentFunction.debugLocations = [];\r\n this.currentFunction.debugLocations.push(range);\r\n }\r\n };\r\n return Compiler;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Compiler = Compiler;\r\n// helpers\r\n/** Wraps a 32-bit integer expression so it evaluates to a valid value of the specified type. */\r\nfunction makeSmallIntegerWrap(expr, type, module) {\r\n switch (type.kind) {\r\n case 0 /* I8 */:\r\n expr = module.createBinary(module_1.BinaryOp.ShrI32, module.createBinary(module_1.BinaryOp.ShlI32, expr, module.createI32(24)), module.createI32(24));\r\n break;\r\n case 1 /* I16 */:\r\n expr = module.createBinary(module_1.BinaryOp.ShrI32, module.createBinary(module_1.BinaryOp.ShlI32, expr, module.createI32(16)), module.createI32(16));\r\n break;\r\n case 5 /* U8 */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0xff));\r\n break;\r\n case 6 /* U16 */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0xffff));\r\n break;\r\n case 10 /* BOOL */:\r\n expr = module.createBinary(module_1.BinaryOp.AndI32, expr, module.createI32(0x1));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeSmallIntegerWrap = makeSmallIntegerWrap;\r\n/** Creates a comparison whether an expression is not 'true' in a broader sense. */\r\nfunction makeIsFalseish(expr, type, module) {\r\n switch (type.kind) {\r\n default:// any integer up to 32 bits\r\n expr = module.createUnary(module_1.UnaryOp.EqzI32, expr);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = module.createUnary(module_1.UnaryOp.EqzI64, expr);\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: strings\r\n case 4 /* ISIZE */:\r\n expr = module.createUnary(type.size == 64 ? module_1.UnaryOp.EqzI64 : module_1.UnaryOp.EqzI32, expr);\r\n break;\r\n case 11 /* F32 */:\r\n expr = module.createBinary(module_1.BinaryOp.EqF32, expr, module.createF32(0));\r\n break;\r\n case 12 /* F64 */:\r\n expr = module.createBinary(module_1.BinaryOp.EqF64, expr, module.createF64(0));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeIsFalseish = makeIsFalseish;\r\n/** Creates a comparison whether an expression is 'true' in a broader sense. */\r\nfunction makeIsTrueish(expr, type, module) {\r\n switch (type.kind) {\r\n default:// any integer up to 32 bits\r\n expr = module.createBinary(module_1.BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeI64, expr, module.createI64(0));\r\n break;\r\n case 9 /* USIZE */:\r\n // TODO: strings\r\n case 4 /* ISIZE */:\r\n expr = type.size == 64\r\n ? module.createBinary(module_1.BinaryOp.NeI64, expr, module.createI64(0))\r\n : module.createBinary(module_1.BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n case 11 /* F32 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeF32, expr, module.createF32(0));\r\n break;\r\n case 12 /* F64 */:\r\n expr = module.createBinary(module_1.BinaryOp.NeF64, expr, module.createF64(0));\r\n break;\r\n case 13 /* VOID */:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\nexports.makeIsTrueish = makeIsTrueish;\r\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar module_1 = __webpack_require__(0);\r\n/** Indicates the kind of a type. */\r\nvar TypeKind;\r\n(function (TypeKind) {\r\n // signed integers\r\n TypeKind[TypeKind[\"I8\"] = 0] = \"I8\";\r\n TypeKind[TypeKind[\"I16\"] = 1] = \"I16\";\r\n TypeKind[TypeKind[\"I32\"] = 2] = \"I32\";\r\n TypeKind[TypeKind[\"I64\"] = 3] = \"I64\";\r\n TypeKind[TypeKind[\"ISIZE\"] = 4] = \"ISIZE\";\r\n // unsigned integers\r\n TypeKind[TypeKind[\"U8\"] = 5] = \"U8\";\r\n TypeKind[TypeKind[\"U16\"] = 6] = \"U16\";\r\n TypeKind[TypeKind[\"U32\"] = 7] = \"U32\";\r\n TypeKind[TypeKind[\"U64\"] = 8] = \"U64\";\r\n TypeKind[TypeKind[\"USIZE\"] = 9] = \"USIZE\";\r\n TypeKind[TypeKind[\"BOOL\"] = 10] = \"BOOL\";\r\n // floats\r\n TypeKind[TypeKind[\"F32\"] = 11] = \"F32\";\r\n TypeKind[TypeKind[\"F64\"] = 12] = \"F64\";\r\n // other\r\n TypeKind[TypeKind[\"VOID\"] = 13] = \"VOID\";\r\n})(TypeKind = exports.TypeKind || (exports.TypeKind = {}));\r\n/** Indicates capabilities of a type. */\r\nvar TypeFlags;\r\n(function (TypeFlags) {\r\n TypeFlags[TypeFlags[\"NONE\"] = 0] = \"NONE\";\r\n /** Is a signed type that can represent negative values. */\r\n TypeFlags[TypeFlags[\"SIGNED\"] = 1] = \"SIGNED\";\r\n /** Is an unsigned type that cannot represent negative values. */\r\n TypeFlags[TypeFlags[\"UNSIGNED\"] = 2] = \"UNSIGNED\";\r\n /** Is an integer type. */\r\n TypeFlags[TypeFlags[\"INTEGER\"] = 4] = \"INTEGER\";\r\n /** Is a floating point type. */\r\n TypeFlags[TypeFlags[\"FLOAT\"] = 8] = \"FLOAT\";\r\n /** Is a sized integer type with a target specific bit size. */\r\n TypeFlags[TypeFlags[\"SIZE\"] = 16] = \"SIZE\";\r\n /** Is a small type that is emulated in a larger type. */\r\n TypeFlags[TypeFlags[\"SMALL\"] = 32] = \"SMALL\";\r\n /** Is a long type larger than 32-bits. */\r\n TypeFlags[TypeFlags[\"LONG\"] = 64] = \"LONG\";\r\n /** Is a value type. */\r\n TypeFlags[TypeFlags[\"VALUE\"] = 128] = \"VALUE\";\r\n /** Is a reference type. */\r\n TypeFlags[TypeFlags[\"REFERENCE\"] = 256] = \"REFERENCE\";\r\n /** Is a nullable type. */\r\n TypeFlags[TypeFlags[\"NULLABLE\"] = 512] = \"NULLABLE\";\r\n})(TypeFlags = exports.TypeFlags || (exports.TypeFlags = {}));\r\n/** Represents a resolved type. */\r\nvar Type = /** @class */ (function () {\r\n /** Constructs a new resolved type. */\r\n function Type(kind, flags, size) {\r\n /** Respective nullable type, if non-nullable. */\r\n this.nullableType = null;\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classType = null;\r\n this.nonNullableType = this;\r\n }\r\n /** Computes the sign-extending shift in the target type. */\r\n Type.prototype.computeSmallIntegerShift = function (targetType) {\r\n return targetType.size - this.size;\r\n };\r\n /** Computes the truncating mask in the target type. */\r\n Type.prototype.computeSmallIntegerMask = function (targetType) {\r\n return -1 >>> (targetType.size - this.size);\r\n };\r\n /** Tests if this type has the specified capabilities. */\r\n Type.prototype.is = function (flags) {\r\n return (this.flags & flags) == flags;\r\n };\r\n Object.defineProperty(Type.prototype, \"isClass\", {\r\n /** Tests if this type is a class type. */\r\n get: function () { return this.classType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Type.prototype, \"isFunction\", {\r\n /** Tests if this type is a function type. */\r\n get: function () { return this.functionType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Type.prototype, \"isReference\", {\r\n /** Tests if this type is a reference type. */\r\n get: function () { return this.classType != null || this.functionType != null; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** Composes a class type from this type and a class. */\r\n Type.prototype.asClass = function (classType) {\r\n assert(this.kind == 9 /* USIZE */);\r\n var ret = new Type(this.kind, this.flags & ~128 /* VALUE */ | 256 /* REFERENCE */, this.size);\r\n ret.classType = classType;\r\n return ret;\r\n };\r\n /** Composes a function type from this type and a function. */\r\n Type.prototype.asFunction = function (functionType) {\r\n assert(this.kind == 9 /* USIZE */ && !this.isReference);\r\n var ret = new Type(this.kind, this.flags & ~128 /* VALUE */ | 256 /* REFERENCE */, this.size);\r\n ret.functionType = functionType;\r\n return ret;\r\n };\r\n /** Composes the respective nullable type of this type. */\r\n Type.prototype.asNullable = function () {\r\n assert(this.kind == 9 /* USIZE */);\r\n if (!this.nullableType) {\r\n assert(!this.is(512 /* NULLABLE */) && this.isReference);\r\n this.nullableType = new Type(this.kind, this.flags | 512 /* NULLABLE */, this.size);\r\n this.nullableType.classType = this.classType;\r\n this.nullableType.functionType = this.functionType;\r\n }\r\n return this.nullableType;\r\n };\r\n /** Converts this type to its TypeScript representation. */\r\n Type.prototype.toString = function (kindOnly) {\r\n if (kindOnly === void 0) { kindOnly = false; }\r\n switch (this.kind) {\r\n case 0 /* I8 */: return \"i8\";\r\n case 1 /* I16 */: return \"i16\";\r\n case 2 /* I32 */: return \"i32\";\r\n case 3 /* I64 */: return \"i64\";\r\n case 4 /* ISIZE */: return \"isize\";\r\n case 5 /* U8 */: return \"u8\";\r\n case 6 /* U16 */: return \"u16\";\r\n case 7 /* U32 */: return \"u32\";\r\n case 8 /* U64 */: return \"u64\";\r\n case 9 /* USIZE */:\r\n if (kindOnly)\r\n return \"usize\";\r\n return this.classType\r\n ? this.classType.toString()\r\n : this.functionType\r\n ? this.functionType.toTypeString()\r\n : \"usize\";\r\n case 10 /* BOOL */: return \"bool\";\r\n case 11 /* F32 */: return \"f32\";\r\n case 12 /* F64 */: return \"f64\";\r\n case 13 /* VOID */: return \"void\";\r\n default:\r\n assert(false);\r\n return \"\";\r\n }\r\n };\r\n // Binaryen specific\r\n /** Converts this type to its respective native type. */\r\n Type.prototype.toNativeType = function () {\r\n switch (this.kind) {\r\n default:\r\n return module_1.NativeType.I32;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module_1.NativeType.I64;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n return this.size == 64 ? module_1.NativeType.I64 : module_1.NativeType.I32;\r\n case 11 /* F32 */:\r\n return module_1.NativeType.F32;\r\n case 12 /* F64 */:\r\n return module_1.NativeType.F64;\r\n case 13 /* VOID */:\r\n return module_1.NativeType.None;\r\n }\r\n };\r\n /** Converts this type to its native `0` value. */\r\n Type.prototype.toNativeZero = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(0);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(0);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(0);\r\n case 11 /* F32 */:\r\n return module.createF32(0);\r\n case 12 /* F64 */:\r\n return module.createF64(0);\r\n }\r\n };\r\n /** Converts this type to its native `1` value. */\r\n Type.prototype.toNativeOne = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(1);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(1);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(1);\r\n case 11 /* F32 */:\r\n return module.createF32(1);\r\n case 12 /* F64 */:\r\n return module.createF64(1);\r\n }\r\n };\r\n /** Converts this type to its native `-1` value. */\r\n Type.prototype.toNativeNegOne = function (module) {\r\n switch (this.kind) {\r\n case 13 /* VOID */:\r\n assert(false);\r\n default:\r\n return module.createI32(-1);\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n if (this.size != 64)\r\n return module.createI32(-1);\r\n // fall-through\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return module.createI64(-1, -1);\r\n case 11 /* F32 */:\r\n return module.createF32(-1);\r\n case 12 /* F64 */:\r\n return module.createF64(-1);\r\n }\r\n };\r\n /** Converts this type to its signature string. */\r\n Type.prototype.toSignatureString = function () {\r\n switch (this.kind) {\r\n default:\r\n return \"i\";\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n return \"I\";\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n return this.size == 64 ? \"I\" : \"i\";\r\n case 11 /* F32 */:\r\n return \"f\";\r\n case 12 /* F64 */:\r\n return \"F\";\r\n case 13 /* VOID */:\r\n return \"v\";\r\n }\r\n };\r\n // Types\r\n /** An 8-bit signed integer. */\r\n Type.i8 = new Type(0 /* I8 */, 1 /* SIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 8);\r\n /** A 16-bit signed integer. */\r\n Type.i16 = new Type(1 /* I16 */, 1 /* SIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 16);\r\n /** A 32-bit signed integer. */\r\n Type.i32 = new Type(2 /* I32 */, 1 /* SIGNED */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit signed integer. */\r\n Type.i64 = new Type(3 /* I64 */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 32-bit signed size. WASM32 only. */\r\n Type.isize32 = new Type(4 /* ISIZE */, 1 /* SIGNED */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit signed size. WASM64 only. */\r\n Type.isize64 = new Type(4 /* ISIZE */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** An 8-bit unsigned integer. */\r\n Type.u8 = new Type(5 /* U8 */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 8);\r\n /** A 16-bit unsigned integer. */\r\n Type.u16 = new Type(6 /* U16 */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 16);\r\n /** A 32-bit unsigned integer. */\r\n Type.u32 = new Type(7 /* U32 */, 2 /* UNSIGNED */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit unsigned integer. */\r\n Type.u64 = new Type(8 /* U64 */, 2 /* UNSIGNED */ |\r\n 64 /* LONG */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n Type.usize32 = new Type(9 /* USIZE */, 2 /* UNSIGNED */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n Type.usize64 = new Type(9 /* USIZE */, 2 /* UNSIGNED */ |\r\n 64 /* LONG */ |\r\n 16 /* SIZE */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 64);\r\n /** A 1-bit unsigned integer. */\r\n Type.bool = new Type(10 /* BOOL */, 2 /* UNSIGNED */ |\r\n 32 /* SMALL */ |\r\n 4 /* INTEGER */ |\r\n 128 /* VALUE */, 1);\r\n /** A 32-bit float. */\r\n Type.f32 = new Type(11 /* F32 */, 1 /* SIGNED */ |\r\n 8 /* FLOAT */ |\r\n 128 /* VALUE */, 32);\r\n /** A 64-bit float. */\r\n Type.f64 = new Type(12 /* F64 */, 1 /* SIGNED */ |\r\n 64 /* LONG */ |\r\n 8 /* FLOAT */ |\r\n 128 /* VALUE */, 64);\r\n /** No return type. */\r\n Type.void = new Type(13 /* VOID */, 0 /* NONE */, 0);\r\n return Type;\r\n}());\r\nexports.Type = Type;\r\n/** Converts an array of types to an array of native types. */\r\nfunction typesToNativeTypes(types) {\r\n var k = types.length;\r\n var ret = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n ret[i] = types[i].toNativeType();\r\n }\r\n return ret;\r\n}\r\nexports.typesToNativeTypes = typesToNativeTypes;\r\n/** Converts an array of types to its combined string representation. */\r\nfunction typesToString(types) {\r\n var k = types.length;\r\n if (!k)\r\n return \"\";\r\n var sb = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n sb[i] = types[i].toString();\r\n }\r\n return sb.join(\", \");\r\n}\r\nexports.typesToString = typesToString;\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nexports.Token = tokenizer_1.Token;\r\nexports.Range = tokenizer_1.Range;\r\nvar path_1 = __webpack_require__(10);\r\n/** Indicates the kind of a node. */\r\nvar NodeKind;\r\n(function (NodeKind) {\r\n NodeKind[NodeKind[\"SOURCE\"] = 0] = \"SOURCE\";\r\n // types\r\n NodeKind[NodeKind[\"TYPE\"] = 1] = \"TYPE\";\r\n NodeKind[NodeKind[\"TYPEPARAMETER\"] = 2] = \"TYPEPARAMETER\";\r\n // expressions\r\n NodeKind[NodeKind[\"IDENTIFIER\"] = 3] = \"IDENTIFIER\";\r\n NodeKind[NodeKind[\"ASSERTION\"] = 4] = \"ASSERTION\";\r\n NodeKind[NodeKind[\"BINARY\"] = 5] = \"BINARY\";\r\n NodeKind[NodeKind[\"CALL\"] = 6] = \"CALL\";\r\n NodeKind[NodeKind[\"COMMA\"] = 7] = \"COMMA\";\r\n NodeKind[NodeKind[\"ELEMENTACCESS\"] = 8] = \"ELEMENTACCESS\";\r\n NodeKind[NodeKind[\"FALSE\"] = 9] = \"FALSE\";\r\n NodeKind[NodeKind[\"LITERAL\"] = 10] = \"LITERAL\";\r\n NodeKind[NodeKind[\"NEW\"] = 11] = \"NEW\";\r\n NodeKind[NodeKind[\"NULL\"] = 12] = \"NULL\";\r\n NodeKind[NodeKind[\"PARENTHESIZED\"] = 13] = \"PARENTHESIZED\";\r\n NodeKind[NodeKind[\"PROPERTYACCESS\"] = 14] = \"PROPERTYACCESS\";\r\n NodeKind[NodeKind[\"TERNARY\"] = 15] = \"TERNARY\";\r\n NodeKind[NodeKind[\"SUPER\"] = 16] = \"SUPER\";\r\n NodeKind[NodeKind[\"THIS\"] = 17] = \"THIS\";\r\n NodeKind[NodeKind[\"TRUE\"] = 18] = \"TRUE\";\r\n NodeKind[NodeKind[\"CONSTRUCTOR\"] = 19] = \"CONSTRUCTOR\";\r\n NodeKind[NodeKind[\"UNARYPOSTFIX\"] = 20] = \"UNARYPOSTFIX\";\r\n NodeKind[NodeKind[\"UNARYPREFIX\"] = 21] = \"UNARYPREFIX\";\r\n // statements\r\n NodeKind[NodeKind[\"BLOCK\"] = 22] = \"BLOCK\";\r\n NodeKind[NodeKind[\"BREAK\"] = 23] = \"BREAK\";\r\n NodeKind[NodeKind[\"CONTINUE\"] = 24] = \"CONTINUE\";\r\n NodeKind[NodeKind[\"DO\"] = 25] = \"DO\";\r\n NodeKind[NodeKind[\"EMPTY\"] = 26] = \"EMPTY\";\r\n NodeKind[NodeKind[\"EXPORT\"] = 27] = \"EXPORT\";\r\n NodeKind[NodeKind[\"EXPORTIMPORT\"] = 28] = \"EXPORTIMPORT\";\r\n NodeKind[NodeKind[\"EXPRESSION\"] = 29] = \"EXPRESSION\";\r\n NodeKind[NodeKind[\"FOR\"] = 30] = \"FOR\";\r\n NodeKind[NodeKind[\"IF\"] = 31] = \"IF\";\r\n NodeKind[NodeKind[\"IMPORT\"] = 32] = \"IMPORT\";\r\n NodeKind[NodeKind[\"RETURN\"] = 33] = \"RETURN\";\r\n NodeKind[NodeKind[\"SWITCH\"] = 34] = \"SWITCH\";\r\n NodeKind[NodeKind[\"THROW\"] = 35] = \"THROW\";\r\n NodeKind[NodeKind[\"TRY\"] = 36] = \"TRY\";\r\n NodeKind[NodeKind[\"VARIABLE\"] = 37] = \"VARIABLE\";\r\n NodeKind[NodeKind[\"WHILE\"] = 38] = \"WHILE\";\r\n // declaration statements\r\n NodeKind[NodeKind[\"CLASSDECLARATION\"] = 39] = \"CLASSDECLARATION\";\r\n NodeKind[NodeKind[\"ENUMDECLARATION\"] = 40] = \"ENUMDECLARATION\";\r\n NodeKind[NodeKind[\"ENUMVALUEDECLARATION\"] = 41] = \"ENUMVALUEDECLARATION\";\r\n NodeKind[NodeKind[\"FIELDDECLARATION\"] = 42] = \"FIELDDECLARATION\";\r\n NodeKind[NodeKind[\"FUNCTIONDECLARATION\"] = 43] = \"FUNCTIONDECLARATION\";\r\n NodeKind[NodeKind[\"IMPORTDECLARATION\"] = 44] = \"IMPORTDECLARATION\";\r\n NodeKind[NodeKind[\"INTERFACEDECLARATION\"] = 45] = \"INTERFACEDECLARATION\";\r\n NodeKind[NodeKind[\"METHODDECLARATION\"] = 46] = \"METHODDECLARATION\";\r\n NodeKind[NodeKind[\"NAMESPACEDECLARATION\"] = 47] = \"NAMESPACEDECLARATION\";\r\n NodeKind[NodeKind[\"TYPEDECLARATION\"] = 48] = \"TYPEDECLARATION\";\r\n NodeKind[NodeKind[\"VARIABLEDECLARATION\"] = 49] = \"VARIABLEDECLARATION\";\r\n // other\r\n NodeKind[NodeKind[\"DECORATOR\"] = 50] = \"DECORATOR\";\r\n NodeKind[NodeKind[\"EXPORTMEMBER\"] = 51] = \"EXPORTMEMBER\";\r\n NodeKind[NodeKind[\"MODIFIER\"] = 52] = \"MODIFIER\";\r\n NodeKind[NodeKind[\"PARAMETER\"] = 53] = \"PARAMETER\";\r\n NodeKind[NodeKind[\"SWITCHCASE\"] = 54] = \"SWITCHCASE\";\r\n})(NodeKind = exports.NodeKind || (exports.NodeKind = {}));\r\n/** Base class of all nodes. */\r\nvar Node = /** @class */ (function () {\r\n function Node() {\r\n /** Parent node. */\r\n this.parent = null;\r\n }\r\n // types\r\n Node.createType = function (identifier, typeArguments, isNullable, range) {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = identifier;\r\n type.typeArguments = typeArguments;\r\n type.isNullable = isNullable;\r\n return type;\r\n };\r\n // expressions\r\n Node.createIdentifierExpression = function (name, range) {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n };\r\n Node.createArrayLiteralExpression = function (elements, range) {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements;\r\n setParentOpt(elements, expr);\r\n return expr;\r\n };\r\n Node.createAssertionExpression = function (assertionKind, expression, toType, range) {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.toType = toType;\r\n toType.parent = expr;\r\n return expr;\r\n };\r\n Node.createBinaryExpression = function (operator, left, right, range) {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left;\r\n left.parent = expr;\r\n expr.right = right;\r\n right.parent = expr;\r\n return expr;\r\n };\r\n Node.createCallExpression = function (expression, typeArgs, args, range) {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.typeArguments = typeArgs;\r\n if (typeArgs)\r\n setParent(typeArgs, expr);\r\n expr.arguments = args;\r\n setParent(args, expr);\r\n return expr;\r\n };\r\n Node.createCommaExpression = function (expressions, range) {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions;\r\n setParent(expressions, expr);\r\n return expr;\r\n };\r\n Node.createConstructorExpression = function (range) {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createElementAccessExpression = function (expression, element, range) {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.elementExpression = element;\r\n element.parent = expr;\r\n return expr;\r\n };\r\n Node.createFalseExpression = function (range) {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createFloatLiteralExpression = function (value, range) {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createIntegerLiteralExpression = function (value, range) {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createNewExpression = function (expression, typeArgs, args, range) {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.typeArguments = typeArgs;\r\n if (typeArgs)\r\n setParent(typeArgs, expr);\r\n expr.arguments = args;\r\n setParent(args, expr);\r\n return expr;\r\n };\r\n Node.createNullExpression = function (range) {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createParenthesizedExpression = function (expression, range) {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n return expr;\r\n };\r\n Node.createPropertyAccessExpression = function (expression, property, range) {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expression.parent = expr;\r\n expr.property = property;\r\n property.parent = expr;\r\n return expr;\r\n };\r\n Node.createRegexpLiteralExpression = function (pattern, flags, range) {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n };\r\n Node.createTernaryExpression = function (condition, ifThen, ifElse, range) {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition;\r\n condition.parent = expr;\r\n expr.ifThen = ifThen;\r\n ifThen.parent = expr;\r\n expr.ifElse = ifElse;\r\n ifElse.parent = expr;\r\n return expr;\r\n };\r\n Node.createStringLiteralExpression = function (value, range) {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n };\r\n Node.createSuperExpression = function (range) {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createThisExpression = function (range) {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createTrueExpression = function (range) {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n };\r\n Node.createUnaryPostfixExpression = function (operator, operand, range) {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n operand.parent = expr;\r\n return expr;\r\n };\r\n Node.createUnaryPrefixExpression = function (operator, operand, range) {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n operand.parent = expr;\r\n return expr;\r\n };\r\n // statements\r\n Node.createBlockStatement = function (statements, range) {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n setParent(statements, stmt);\r\n return stmt;\r\n };\r\n Node.createBreakStatement = function (label, range) {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n if (label)\r\n label.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createClassDeclaration = function (identifier, typeParameters, extendsType, implementsTypes, members, modifiers, decorators, range) {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.name = identifier;\r\n identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes;\r\n setParent(implementsTypes, stmt);\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createContinueStatement = function (label, range) {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n if (label)\r\n label.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createDecorator = function (expression, args, range) {\r\n var stmt = new Decorator();\r\n stmt.range = range;\r\n stmt.name = expression;\r\n expression.parent = stmt;\r\n stmt.arguments = args;\r\n if (args)\r\n setParent(args, stmt);\r\n if (expression.kind == NodeKind.IDENTIFIER) {\r\n switch (expression.text) {\r\n case \"global\":\r\n stmt.decoratorKind = 1 /* GLOBAL */;\r\n break;\r\n case \"operator\":\r\n stmt.decoratorKind = 2 /* OPERATOR */;\r\n break;\r\n case \"unmanaged\":\r\n stmt.decoratorKind = 3 /* UNMANAGED */;\r\n break;\r\n case \"offset\":\r\n stmt.decoratorKind = 4 /* OFFSET */;\r\n break;\r\n default:\r\n stmt.decoratorKind = 0 /* CUSTOM */;\r\n break;\r\n }\r\n }\r\n else {\r\n stmt.decoratorKind = 0 /* CUSTOM */;\r\n }\r\n return stmt;\r\n };\r\n Node.createDoStatement = function (statement, condition, range) {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createEmptyStatement = function (range) {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n };\r\n Node.createEnumDeclaration = function (name, members, modifiers, decorators, range) {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.values = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createEnumValueDeclaration = function (name, value, range) {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.value = value;\r\n if (value)\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createExportStatement = function (members, path, modifiers, range) {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n var normalizedPath = path_1.normalize(path.value);\r\n if (path.value.startsWith(\".\")) {\r\n stmt.normalizedPath = path_1.resolve(normalizedPath, range.source.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n return stmt;\r\n };\r\n Node.createExportImportStatement = function (name, externalName, range) {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.externalName = externalName;\r\n externalName.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createExportMember = function (name, externalName, range) {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n }\r\n else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n };\r\n Node.createExpressionStatement = function (expression) {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression;\r\n expression.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createIfStatement = function (condition, ifTrue, ifFalse, range) {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.ifTrue = ifTrue;\r\n ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse;\r\n if (ifFalse)\r\n ifFalse.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createImportStatement = function (decls, path, range) {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls;\r\n if (decls)\r\n setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = path_1.normalize(path.value);\r\n if (path.value.startsWith(\".\")) {\r\n stmt.normalizedPath = path_1.resolve(normalizedPath, range.source.normalizedPath);\r\n }\r\n else {\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n };\r\n Node.createImportStatementWithWildcard = function (identifier, path, range) {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = path_1.resolve(path_1.normalize(path.value), range.source.normalizedPath);\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n };\r\n Node.createImportDeclaration = function (externalName, name, range) {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName;\r\n externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n }\r\n else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n };\r\n Node.createInterfaceDeclaration = function (name, extendsType, members, modifiers, range) {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = stmt;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n return stmt;\r\n };\r\n Node.createFieldDeclaration = function (name, type, initializer, modifiers, decorators, range) {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.type = type;\r\n if (type)\r\n type.parent = stmt;\r\n stmt.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = stmt;\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createForStatement = function (initializer, condition, incrementor, statement, range) {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = stmt;\r\n stmt.condition = condition;\r\n if (condition)\r\n condition.parent = stmt;\r\n stmt.incrementor = incrementor;\r\n if (incrementor)\r\n incrementor.parent = stmt;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createTypeParameter = function (name, extendsType, range) {\r\n var elem = new TypeParameter();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.extendsType = extendsType;\r\n if (extendsType)\r\n extendsType.parent = elem;\r\n return elem;\r\n };\r\n Node.createParameter = function (name, type, initializer, kind, range) {\r\n var elem = new Parameter();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.type = type;\r\n if (type)\r\n type.parent = elem;\r\n elem.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n };\r\n Node.createFunctionDeclaration = function (name, typeParameters, parameters, returnType, statements, modifiers, decorators, range) {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.parameters = parameters;\r\n setParent(parameters, stmt);\r\n stmt.returnType = returnType;\r\n if (returnType)\r\n returnType.parent = stmt;\r\n stmt.statements = statements;\r\n if (statements)\r\n setParent(statements, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createMethodDeclaration = function (name, typeParameters, parameters, returnType, statements, modifiers, decorators, range) {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.typeParameters = typeParameters;\r\n setParent(typeParameters, stmt);\r\n stmt.parameters = parameters;\r\n setParent(parameters, stmt);\r\n stmt.returnType = returnType;\r\n if (returnType)\r\n returnType.parent = stmt;\r\n stmt.statements = statements;\r\n if (statements)\r\n setParent(statements, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createModifier = function (kind, range) {\r\n var elem = new Modifier();\r\n elem.range = range;\r\n elem.modifierKind = kind;\r\n return elem;\r\n };\r\n Node.createNamespaceDeclaration = function (name, members, modifiers, decorators, range) {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.members = members;\r\n setParent(members, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createReturnStatement = function (value, range) {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n if (value)\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createSwitchStatement = function (condition, cases, range) {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.cases = cases;\r\n setParent(cases, stmt);\r\n return stmt;\r\n };\r\n Node.createSwitchCase = function (label, statements, range) {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label;\r\n if (label)\r\n label.parent = elem;\r\n elem.statements = statements;\r\n setParent(statements, elem);\r\n return elem;\r\n };\r\n Node.createThrowStatement = function (value, range) {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n value.parent = stmt;\r\n return stmt;\r\n };\r\n Node.createTryStatement = function (statements, catchVariable, catchStatements, finallyStatements, range) {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable)\r\n catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements)\r\n setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements)\r\n setParent(finallyStatements, stmt);\r\n return stmt;\r\n };\r\n Node.createTypeDeclaration = function (name, alias, modifiers, decorators, range) {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.name = name;\r\n name.parent = stmt;\r\n stmt.alias = alias;\r\n alias.parent = stmt;\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createVariableStatement = function (declarations, modifiers, decorators, range) {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.declarations = declarations;\r\n setParent(declarations, stmt);\r\n stmt.modifiers = modifiers;\r\n if (modifiers)\r\n setParent(modifiers, stmt);\r\n stmt.decorators = decorators;\r\n if (decorators)\r\n setParent(decorators, stmt);\r\n return stmt;\r\n };\r\n Node.createVariableDeclaration = function (name, type, initializer, modifiers, decorators, range) {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.name = name;\r\n name.parent = elem;\r\n elem.type = type;\r\n if (type)\r\n type.parent = elem;\r\n elem.initializer = initializer;\r\n if (initializer)\r\n initializer.parent = elem;\r\n elem.modifiers = modifiers; // inherited from parent VariableStatement\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n };\r\n Node.createWhileStatement = function (condition, statement, range) {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n condition.parent = stmt;\r\n stmt.statement = statement;\r\n statement.parent = stmt;\r\n return stmt;\r\n };\r\n return Node;\r\n}());\r\nexports.Node = Node;\r\n// types\r\n/** Represents a type annotation. */\r\nvar TypeNode = /** @class */ (function (_super) {\r\n __extends(TypeNode, _super);\r\n function TypeNode() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPE;\r\n return _this;\r\n }\r\n return TypeNode;\r\n}(Node));\r\nexports.TypeNode = TypeNode;\r\n/** Represents a type parameter. */\r\nvar TypeParameter = /** @class */ (function (_super) {\r\n __extends(TypeParameter, _super);\r\n function TypeParameter() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPEPARAMETER;\r\n return _this;\r\n }\r\n return TypeParameter;\r\n}(Node));\r\nexports.TypeParameter = TypeParameter;\r\n// expressions\r\n/** Base class of all expression nodes. */\r\nvar Expression = /** @class */ (function (_super) {\r\n __extends(Expression, _super);\r\n function Expression() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Expression;\r\n}(Node));\r\nexports.Expression = Expression;\r\n/** Represents an identifier expression. */\r\nvar IdentifierExpression = /** @class */ (function (_super) {\r\n __extends(IdentifierExpression, _super);\r\n function IdentifierExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IDENTIFIER;\r\n return _this;\r\n }\r\n return IdentifierExpression;\r\n}(Expression));\r\nexports.IdentifierExpression = IdentifierExpression;\r\n/** Indicates the kind of a literal. */\r\nvar LiteralKind;\r\n(function (LiteralKind) {\r\n LiteralKind[LiteralKind[\"FLOAT\"] = 0] = \"FLOAT\";\r\n LiteralKind[LiteralKind[\"INTEGER\"] = 1] = \"INTEGER\";\r\n LiteralKind[LiteralKind[\"STRING\"] = 2] = \"STRING\";\r\n LiteralKind[LiteralKind[\"REGEXP\"] = 3] = \"REGEXP\";\r\n LiteralKind[LiteralKind[\"ARRAY\"] = 4] = \"ARRAY\";\r\n LiteralKind[LiteralKind[\"OBJECT\"] = 5] = \"OBJECT\";\r\n})(LiteralKind = exports.LiteralKind || (exports.LiteralKind = {}));\r\n/** Base class of all literal expressions. */\r\nvar LiteralExpression = /** @class */ (function (_super) {\r\n __extends(LiteralExpression, _super);\r\n function LiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.LITERAL;\r\n return _this;\r\n }\r\n return LiteralExpression;\r\n}(Expression));\r\nexports.LiteralExpression = LiteralExpression;\r\n/** Represents an `[]` literal expression. */\r\nvar ArrayLiteralExpression = /** @class */ (function (_super) {\r\n __extends(ArrayLiteralExpression, _super);\r\n function ArrayLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 4 /* ARRAY */;\r\n return _this;\r\n }\r\n return ArrayLiteralExpression;\r\n}(LiteralExpression));\r\nexports.ArrayLiteralExpression = ArrayLiteralExpression;\r\n/** Indicates the kind of an assertion. */\r\nvar AssertionKind;\r\n(function (AssertionKind) {\r\n AssertionKind[AssertionKind[\"PREFIX\"] = 0] = \"PREFIX\";\r\n AssertionKind[AssertionKind[\"AS\"] = 1] = \"AS\";\r\n})(AssertionKind = exports.AssertionKind || (exports.AssertionKind = {}));\r\n/** Represents an assertion expression. */\r\nvar AssertionExpression = /** @class */ (function (_super) {\r\n __extends(AssertionExpression, _super);\r\n function AssertionExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ASSERTION;\r\n return _this;\r\n }\r\n return AssertionExpression;\r\n}(Expression));\r\nexports.AssertionExpression = AssertionExpression;\r\n/** Represents a binary expression. */\r\nvar BinaryExpression = /** @class */ (function (_super) {\r\n __extends(BinaryExpression, _super);\r\n function BinaryExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BINARY;\r\n return _this;\r\n }\r\n return BinaryExpression;\r\n}(Expression));\r\nexports.BinaryExpression = BinaryExpression;\r\n/** Represents a call expression. */\r\nvar CallExpression = /** @class */ (function (_super) {\r\n __extends(CallExpression, _super);\r\n function CallExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CALL;\r\n return _this;\r\n }\r\n return CallExpression;\r\n}(Expression));\r\nexports.CallExpression = CallExpression;\r\n/** Represents a comma expression composed of multiple expressions. */\r\nvar CommaExpression = /** @class */ (function (_super) {\r\n __extends(CommaExpression, _super);\r\n function CommaExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.COMMA;\r\n return _this;\r\n }\r\n return CommaExpression;\r\n}(Expression));\r\nexports.CommaExpression = CommaExpression;\r\n/** Represents a `constructor` expression. */\r\nvar ConstructorExpression = /** @class */ (function (_super) {\r\n __extends(ConstructorExpression, _super);\r\n function ConstructorExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CONSTRUCTOR;\r\n _this.text = \"constructor\";\r\n return _this;\r\n }\r\n return ConstructorExpression;\r\n}(IdentifierExpression));\r\nexports.ConstructorExpression = ConstructorExpression;\r\n/** Represents an element access expression, e.g., array access. */\r\nvar ElementAccessExpression = /** @class */ (function (_super) {\r\n __extends(ElementAccessExpression, _super);\r\n function ElementAccessExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ELEMENTACCESS;\r\n return _this;\r\n }\r\n return ElementAccessExpression;\r\n}(Expression));\r\nexports.ElementAccessExpression = ElementAccessExpression;\r\n/** Represents a float literal expression. */\r\nvar FloatLiteralExpression = /** @class */ (function (_super) {\r\n __extends(FloatLiteralExpression, _super);\r\n function FloatLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 0 /* FLOAT */;\r\n return _this;\r\n }\r\n return FloatLiteralExpression;\r\n}(LiteralExpression));\r\nexports.FloatLiteralExpression = FloatLiteralExpression;\r\n/** Represents an integer literal expression. */\r\nvar IntegerLiteralExpression = /** @class */ (function (_super) {\r\n __extends(IntegerLiteralExpression, _super);\r\n function IntegerLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 1 /* INTEGER */;\r\n return _this;\r\n }\r\n return IntegerLiteralExpression;\r\n}(LiteralExpression));\r\nexports.IntegerLiteralExpression = IntegerLiteralExpression;\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nvar NewExpression = /** @class */ (function (_super) {\r\n __extends(NewExpression, _super);\r\n function NewExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NEW;\r\n return _this;\r\n }\r\n return NewExpression;\r\n}(CallExpression));\r\nexports.NewExpression = NewExpression;\r\n/** Represents a `null` expression. */\r\nvar NullExpression = /** @class */ (function (_super) {\r\n __extends(NullExpression, _super);\r\n function NullExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NULL;\r\n _this.text = \"null\";\r\n return _this;\r\n }\r\n return NullExpression;\r\n}(IdentifierExpression));\r\nexports.NullExpression = NullExpression;\r\n/** Represents a parenthesized expression. */\r\nvar ParenthesizedExpression = /** @class */ (function (_super) {\r\n __extends(ParenthesizedExpression, _super);\r\n function ParenthesizedExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PARENTHESIZED;\r\n return _this;\r\n }\r\n return ParenthesizedExpression;\r\n}(Expression));\r\nexports.ParenthesizedExpression = ParenthesizedExpression;\r\n/** Represents a property access expression. */\r\nvar PropertyAccessExpression = /** @class */ (function (_super) {\r\n __extends(PropertyAccessExpression, _super);\r\n function PropertyAccessExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PROPERTYACCESS;\r\n return _this;\r\n }\r\n return PropertyAccessExpression;\r\n}(Expression));\r\nexports.PropertyAccessExpression = PropertyAccessExpression;\r\n/** Represents a regular expression literal expression. */\r\nvar RegexpLiteralExpression = /** @class */ (function (_super) {\r\n __extends(RegexpLiteralExpression, _super);\r\n function RegexpLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 3 /* REGEXP */;\r\n return _this;\r\n }\r\n return RegexpLiteralExpression;\r\n}(LiteralExpression));\r\nexports.RegexpLiteralExpression = RegexpLiteralExpression;\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nvar TernaryExpression = /** @class */ (function (_super) {\r\n __extends(TernaryExpression, _super);\r\n function TernaryExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TERNARY;\r\n return _this;\r\n }\r\n return TernaryExpression;\r\n}(Expression));\r\nexports.TernaryExpression = TernaryExpression;\r\n/** Represents a string literal expression. */\r\nvar StringLiteralExpression = /** @class */ (function (_super) {\r\n __extends(StringLiteralExpression, _super);\r\n function StringLiteralExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.literalKind = 2 /* STRING */;\r\n return _this;\r\n }\r\n return StringLiteralExpression;\r\n}(LiteralExpression));\r\nexports.StringLiteralExpression = StringLiteralExpression;\r\n/** Represents a `super` expression. */\r\nvar SuperExpression = /** @class */ (function (_super) {\r\n __extends(SuperExpression, _super);\r\n function SuperExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SUPER;\r\n _this.text = \"super\";\r\n return _this;\r\n }\r\n return SuperExpression;\r\n}(IdentifierExpression));\r\nexports.SuperExpression = SuperExpression;\r\n/** Represents a `this` expression. */\r\nvar ThisExpression = /** @class */ (function (_super) {\r\n __extends(ThisExpression, _super);\r\n function ThisExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.THIS;\r\n _this.text = \"this\";\r\n return _this;\r\n }\r\n return ThisExpression;\r\n}(IdentifierExpression));\r\nexports.ThisExpression = ThisExpression;\r\n/** Represents a `true` expression. */\r\nvar TrueExpression = /** @class */ (function (_super) {\r\n __extends(TrueExpression, _super);\r\n function TrueExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TRUE;\r\n _this.text = \"true\";\r\n return _this;\r\n }\r\n return TrueExpression;\r\n}(IdentifierExpression));\r\nexports.TrueExpression = TrueExpression;\r\n/** Represents a `false` expression. */\r\nvar FalseExpression = /** @class */ (function (_super) {\r\n __extends(FalseExpression, _super);\r\n function FalseExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FALSE;\r\n _this.text = \"false\";\r\n return _this;\r\n }\r\n return FalseExpression;\r\n}(IdentifierExpression));\r\nexports.FalseExpression = FalseExpression;\r\n/** Base class of all unary expressions. */\r\nvar UnaryExpression = /** @class */ (function (_super) {\r\n __extends(UnaryExpression, _super);\r\n function UnaryExpression() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return UnaryExpression;\r\n}(Expression));\r\nexports.UnaryExpression = UnaryExpression;\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nvar UnaryPostfixExpression = /** @class */ (function (_super) {\r\n __extends(UnaryPostfixExpression, _super);\r\n function UnaryPostfixExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.UNARYPOSTFIX;\r\n return _this;\r\n }\r\n return UnaryPostfixExpression;\r\n}(UnaryExpression));\r\nexports.UnaryPostfixExpression = UnaryPostfixExpression;\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nvar UnaryPrefixExpression = /** @class */ (function (_super) {\r\n __extends(UnaryPrefixExpression, _super);\r\n function UnaryPrefixExpression() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.UNARYPREFIX;\r\n return _this;\r\n }\r\n return UnaryPrefixExpression;\r\n}(UnaryExpression));\r\nexports.UnaryPrefixExpression = UnaryPrefixExpression;\r\n// statements\r\n/** Indicates the specific kind of a modifier. */\r\nvar ModifierKind;\r\n(function (ModifierKind) {\r\n ModifierKind[ModifierKind[\"ASYNC\"] = 0] = \"ASYNC\";\r\n ModifierKind[ModifierKind[\"CONST\"] = 1] = \"CONST\";\r\n ModifierKind[ModifierKind[\"LET\"] = 2] = \"LET\";\r\n ModifierKind[ModifierKind[\"DECLARE\"] = 3] = \"DECLARE\";\r\n ModifierKind[ModifierKind[\"EXPORT\"] = 4] = \"EXPORT\";\r\n ModifierKind[ModifierKind[\"IMPORT\"] = 5] = \"IMPORT\";\r\n ModifierKind[ModifierKind[\"STATIC\"] = 6] = \"STATIC\";\r\n ModifierKind[ModifierKind[\"ABSTRACT\"] = 7] = \"ABSTRACT\";\r\n ModifierKind[ModifierKind[\"PUBLIC\"] = 8] = \"PUBLIC\";\r\n ModifierKind[ModifierKind[\"PRIVATE\"] = 9] = \"PRIVATE\";\r\n ModifierKind[ModifierKind[\"PROTECTED\"] = 10] = \"PROTECTED\";\r\n ModifierKind[ModifierKind[\"READONLY\"] = 11] = \"READONLY\";\r\n ModifierKind[ModifierKind[\"GET\"] = 12] = \"GET\";\r\n ModifierKind[ModifierKind[\"SET\"] = 13] = \"SET\";\r\n})(ModifierKind = exports.ModifierKind || (exports.ModifierKind = {}));\r\n/** Base class of all statement nodes. */\r\nvar Statement = /** @class */ (function (_super) {\r\n __extends(Statement, _super);\r\n function Statement() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return Statement;\r\n}(Node));\r\nexports.Statement = Statement;\r\n/** Indicates the specific kind of a source. */\r\nvar SourceKind;\r\n(function (SourceKind) {\r\n /** Default source. Usually imported from an entry file. */\r\n SourceKind[SourceKind[\"DEFAULT\"] = 0] = \"DEFAULT\";\r\n /** Entry file. */\r\n SourceKind[SourceKind[\"ENTRY\"] = 1] = \"ENTRY\";\r\n /** Library file. */\r\n SourceKind[SourceKind[\"LIBRARY\"] = 2] = \"LIBRARY\";\r\n})(SourceKind = exports.SourceKind || (exports.SourceKind = {}));\r\n/** A top-level source node. */\r\nvar Source = /** @class */ (function (_super) {\r\n __extends(Source, _super);\r\n /** Constructs a new source node. */\r\n function Source(normalizedPath, text, kind) {\r\n var _this = _super.call(this) || this;\r\n _this.kind = NodeKind.SOURCE;\r\n _this.parent = null;\r\n /** Tokenizer reference. */\r\n _this.tokenizer = null;\r\n /** Source map index. */\r\n _this.debugInfoIndex = -1;\r\n _this.sourceKind = kind;\r\n _this.normalizedPath = normalizedPath;\r\n _this.internalPath = mangleInternalPath(_this.normalizedPath);\r\n _this.statements = new Array();\r\n _this.range = new tokenizer_1.Range(_this, 0, text.length);\r\n _this.text = text;\r\n return _this;\r\n }\r\n Object.defineProperty(Source.prototype, \"isEntry\", {\r\n /** Tests if this source is an entry file. */\r\n get: function () { return this.sourceKind == SourceKind.ENTRY; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Source.prototype, \"isLibrary\", {\r\n /** Tests if this source is a stdlib file. */\r\n get: function () { return this.sourceKind == SourceKind.LIBRARY; },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n return Source;\r\n}(Node));\r\nexports.Source = Source;\r\n/** Base class of all declaration statements. */\r\nvar DeclarationStatement = /** @class */ (function (_super) {\r\n __extends(DeclarationStatement, _super);\r\n function DeclarationStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n /** Array of decorators. */\r\n _this.decorators = null;\r\n _this.cachedProgramLevelInternalName = null;\r\n _this.cachedFileLevelInternalName = null;\r\n return _this;\r\n }\r\n Object.defineProperty(DeclarationStatement.prototype, \"programLevelInternalName\", {\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get: function () {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"fileLevelInternalName\", {\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get: function () {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"isTopLevel\", {\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get: function () {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(DeclarationStatement.prototype, \"isTopLevelExport\", {\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get: function () {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return (hasModifier(ModifierKind.EXPORT, this.modifiers) &&\r\n parent.isTopLevelExport);\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return (hasModifier(ModifierKind.STATIC, this.modifiers) &&\r\n parent.isTopLevelExport);\r\n }\r\n return (parent.kind == NodeKind.SOURCE &&\r\n hasModifier(ModifierKind.EXPORT, this.modifiers));\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /** Tests if this declaration needs an explicit export. */\r\n DeclarationStatement.prototype.needsExplicitExport = function (member) {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n };\r\n return DeclarationStatement;\r\n}(Statement));\r\nexports.DeclarationStatement = DeclarationStatement;\r\n/** Base class of all variable-like declaration statements. */\r\nvar VariableLikeDeclarationStatement = /** @class */ (function (_super) {\r\n __extends(VariableLikeDeclarationStatement, _super);\r\n function VariableLikeDeclarationStatement() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n return VariableLikeDeclarationStatement;\r\n}(DeclarationStatement));\r\nexports.VariableLikeDeclarationStatement = VariableLikeDeclarationStatement;\r\n/** Represents a block statement. */\r\nvar BlockStatement = /** @class */ (function (_super) {\r\n __extends(BlockStatement, _super);\r\n function BlockStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BLOCK;\r\n return _this;\r\n }\r\n return BlockStatement;\r\n}(Statement));\r\nexports.BlockStatement = BlockStatement;\r\n/** Represents a `break` statement. */\r\nvar BreakStatement = /** @class */ (function (_super) {\r\n __extends(BreakStatement, _super);\r\n function BreakStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.BREAK;\r\n return _this;\r\n }\r\n return BreakStatement;\r\n}(Statement));\r\nexports.BreakStatement = BreakStatement;\r\n/** Represents a `class` declaration. */\r\nvar ClassDeclaration = /** @class */ (function (_super) {\r\n __extends(ClassDeclaration, _super);\r\n function ClassDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CLASSDECLARATION;\r\n return _this;\r\n }\r\n return ClassDeclaration;\r\n}(DeclarationStatement));\r\nexports.ClassDeclaration = ClassDeclaration;\r\n/** Represents a `continue` statement. */\r\nvar ContinueStatement = /** @class */ (function (_super) {\r\n __extends(ContinueStatement, _super);\r\n function ContinueStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.CONTINUE;\r\n return _this;\r\n }\r\n return ContinueStatement;\r\n}(Statement));\r\nexports.ContinueStatement = ContinueStatement;\r\n/** Built-in decorator kinds. */\r\nvar DecoratorKind;\r\n(function (DecoratorKind) {\r\n DecoratorKind[DecoratorKind[\"CUSTOM\"] = 0] = \"CUSTOM\";\r\n DecoratorKind[DecoratorKind[\"GLOBAL\"] = 1] = \"GLOBAL\";\r\n DecoratorKind[DecoratorKind[\"OPERATOR\"] = 2] = \"OPERATOR\";\r\n DecoratorKind[DecoratorKind[\"UNMANAGED\"] = 3] = \"UNMANAGED\";\r\n DecoratorKind[DecoratorKind[\"OFFSET\"] = 4] = \"OFFSET\";\r\n})(DecoratorKind = exports.DecoratorKind || (exports.DecoratorKind = {}));\r\n/** Depresents a decorator. */\r\nvar Decorator = /** @class */ (function (_super) {\r\n __extends(Decorator, _super);\r\n function Decorator() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.DECORATOR;\r\n return _this;\r\n }\r\n return Decorator;\r\n}(Statement));\r\nexports.Decorator = Decorator;\r\n/** Represents a `do` statement. */\r\nvar DoStatement = /** @class */ (function (_super) {\r\n __extends(DoStatement, _super);\r\n function DoStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.DO;\r\n return _this;\r\n }\r\n return DoStatement;\r\n}(Statement));\r\nexports.DoStatement = DoStatement;\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nvar EmptyStatement = /** @class */ (function (_super) {\r\n __extends(EmptyStatement, _super);\r\n function EmptyStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EMPTY;\r\n return _this;\r\n }\r\n return EmptyStatement;\r\n}(Statement));\r\nexports.EmptyStatement = EmptyStatement;\r\n/** Represents an `enum` declaration. */\r\nvar EnumDeclaration = /** @class */ (function (_super) {\r\n __extends(EnumDeclaration, _super);\r\n function EnumDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ENUMDECLARATION;\r\n return _this;\r\n }\r\n return EnumDeclaration;\r\n}(DeclarationStatement));\r\nexports.EnumDeclaration = EnumDeclaration;\r\n/** Represents a value of an `enum` declaration. */\r\nvar EnumValueDeclaration = /** @class */ (function (_super) {\r\n __extends(EnumValueDeclaration, _super);\r\n function EnumValueDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.ENUMVALUEDECLARATION;\r\n _this.modifiers = null;\r\n return _this;\r\n }\r\n return EnumValueDeclaration;\r\n}(DeclarationStatement));\r\nexports.EnumValueDeclaration = EnumValueDeclaration;\r\n/** Represents an `export import` statement of an interface. */\r\nvar ExportImportStatement = /** @class */ (function (_super) {\r\n __extends(ExportImportStatement, _super);\r\n function ExportImportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORTIMPORT;\r\n return _this;\r\n }\r\n return ExportImportStatement;\r\n}(Node));\r\nexports.ExportImportStatement = ExportImportStatement;\r\n/** Represents a member of an `export` statement. */\r\nvar ExportMember = /** @class */ (function (_super) {\r\n __extends(ExportMember, _super);\r\n function ExportMember() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORTMEMBER;\r\n return _this;\r\n }\r\n return ExportMember;\r\n}(Node));\r\nexports.ExportMember = ExportMember;\r\n/** Represents an `export` statement. */\r\nvar ExportStatement = /** @class */ (function (_super) {\r\n __extends(ExportStatement, _super);\r\n function ExportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPORT;\r\n return _this;\r\n }\r\n return ExportStatement;\r\n}(Statement));\r\nexports.ExportStatement = ExportStatement;\r\n/** Represents an expression that is used as a statement. */\r\nvar ExpressionStatement = /** @class */ (function (_super) {\r\n __extends(ExpressionStatement, _super);\r\n function ExpressionStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.EXPRESSION;\r\n return _this;\r\n }\r\n return ExpressionStatement;\r\n}(Statement));\r\nexports.ExpressionStatement = ExpressionStatement;\r\n/** Represents a field declaration within a `class`. */\r\nvar FieldDeclaration = /** @class */ (function (_super) {\r\n __extends(FieldDeclaration, _super);\r\n function FieldDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FIELDDECLARATION;\r\n return _this;\r\n }\r\n return FieldDeclaration;\r\n}(VariableLikeDeclarationStatement));\r\nexports.FieldDeclaration = FieldDeclaration;\r\n/** Represents a `for` statement. */\r\nvar ForStatement = /** @class */ (function (_super) {\r\n __extends(ForStatement, _super);\r\n function ForStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FOR;\r\n return _this;\r\n }\r\n return ForStatement;\r\n}(Statement));\r\nexports.ForStatement = ForStatement;\r\n/** Represents a `function` declaration. */\r\nvar FunctionDeclaration = /** @class */ (function (_super) {\r\n __extends(FunctionDeclaration, _super);\r\n function FunctionDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.FUNCTIONDECLARATION;\r\n return _this;\r\n }\r\n return FunctionDeclaration;\r\n}(DeclarationStatement));\r\nexports.FunctionDeclaration = FunctionDeclaration;\r\n/** Represents an `if` statement. */\r\nvar IfStatement = /** @class */ (function (_super) {\r\n __extends(IfStatement, _super);\r\n function IfStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IF;\r\n return _this;\r\n }\r\n return IfStatement;\r\n}(Statement));\r\nexports.IfStatement = IfStatement;\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nvar ImportDeclaration = /** @class */ (function (_super) {\r\n __extends(ImportDeclaration, _super);\r\n function ImportDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IMPORTDECLARATION;\r\n _this.modifiers = null;\r\n return _this;\r\n }\r\n return ImportDeclaration;\r\n}(DeclarationStatement));\r\nexports.ImportDeclaration = ImportDeclaration;\r\n/** Represents an `import` statement. */\r\nvar ImportStatement = /** @class */ (function (_super) {\r\n __extends(ImportStatement, _super);\r\n function ImportStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.IMPORT;\r\n return _this;\r\n }\r\n return ImportStatement;\r\n}(Statement));\r\nexports.ImportStatement = ImportStatement;\r\n/** Represents an `interfarce` declaration. */\r\nvar InterfaceDeclaration = /** @class */ (function (_super) {\r\n __extends(InterfaceDeclaration, _super);\r\n function InterfaceDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.INTERFACEDECLARATION;\r\n return _this;\r\n }\r\n return InterfaceDeclaration;\r\n}(ClassDeclaration));\r\nexports.InterfaceDeclaration = InterfaceDeclaration;\r\n/** Represents a method declaration within a `class`. */\r\nvar MethodDeclaration = /** @class */ (function (_super) {\r\n __extends(MethodDeclaration, _super);\r\n function MethodDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.METHODDECLARATION;\r\n return _this;\r\n }\r\n return MethodDeclaration;\r\n}(FunctionDeclaration));\r\nexports.MethodDeclaration = MethodDeclaration;\r\n/** Represents a `namespace` declaration. */\r\nvar NamespaceDeclaration = /** @class */ (function (_super) {\r\n __extends(NamespaceDeclaration, _super);\r\n function NamespaceDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.NAMESPACEDECLARATION;\r\n return _this;\r\n }\r\n return NamespaceDeclaration;\r\n}(DeclarationStatement));\r\nexports.NamespaceDeclaration = NamespaceDeclaration;\r\n/** Represents the kind of a parameter. */\r\nvar ParameterKind;\r\n(function (ParameterKind) {\r\n /** No specific flags. */\r\n ParameterKind[ParameterKind[\"DEFAULT\"] = 0] = \"DEFAULT\";\r\n /** Is an optional parameter. */\r\n ParameterKind[ParameterKind[\"OPTIONAL\"] = 1] = \"OPTIONAL\";\r\n /** Is a rest parameter. */\r\n ParameterKind[ParameterKind[\"REST\"] = 2] = \"REST\";\r\n})(ParameterKind = exports.ParameterKind || (exports.ParameterKind = {}));\r\n/** Represents a function parameter. */\r\nvar Parameter = /** @class */ (function (_super) {\r\n __extends(Parameter, _super);\r\n function Parameter() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.PARAMETER;\r\n return _this;\r\n }\r\n return Parameter;\r\n}(Node));\r\nexports.Parameter = Parameter;\r\n/** Represents a single modifier. */\r\nvar Modifier = /** @class */ (function (_super) {\r\n __extends(Modifier, _super);\r\n function Modifier() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.MODIFIER;\r\n return _this;\r\n }\r\n return Modifier;\r\n}(Node));\r\nexports.Modifier = Modifier;\r\n/** Represents a `return` statement. */\r\nvar ReturnStatement = /** @class */ (function (_super) {\r\n __extends(ReturnStatement, _super);\r\n function ReturnStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.RETURN;\r\n return _this;\r\n }\r\n return ReturnStatement;\r\n}(Statement));\r\nexports.ReturnStatement = ReturnStatement;\r\n/** Represents a single `case` within a `switch` statement. */\r\nvar SwitchCase = /** @class */ (function (_super) {\r\n __extends(SwitchCase, _super);\r\n function SwitchCase() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SWITCHCASE;\r\n return _this;\r\n }\r\n return SwitchCase;\r\n}(Node));\r\nexports.SwitchCase = SwitchCase;\r\n/** Represents a `switch` statement. */\r\nvar SwitchStatement = /** @class */ (function (_super) {\r\n __extends(SwitchStatement, _super);\r\n function SwitchStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.SWITCH;\r\n return _this;\r\n }\r\n return SwitchStatement;\r\n}(Statement));\r\nexports.SwitchStatement = SwitchStatement;\r\n/** Represents a `throw` statement. */\r\nvar ThrowStatement = /** @class */ (function (_super) {\r\n __extends(ThrowStatement, _super);\r\n function ThrowStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.THROW;\r\n return _this;\r\n }\r\n return ThrowStatement;\r\n}(Statement));\r\nexports.ThrowStatement = ThrowStatement;\r\n/** Represents a `try` statement. */\r\nvar TryStatement = /** @class */ (function (_super) {\r\n __extends(TryStatement, _super);\r\n function TryStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TRY;\r\n return _this;\r\n }\r\n return TryStatement;\r\n}(Statement));\r\nexports.TryStatement = TryStatement;\r\n/** Represents a `type` declaration. */\r\nvar TypeDeclaration = /** @class */ (function (_super) {\r\n __extends(TypeDeclaration, _super);\r\n function TypeDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.TYPEDECLARATION;\r\n return _this;\r\n }\r\n return TypeDeclaration;\r\n}(DeclarationStatement));\r\nexports.TypeDeclaration = TypeDeclaration;\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nvar VariableDeclaration = /** @class */ (function (_super) {\r\n __extends(VariableDeclaration, _super);\r\n function VariableDeclaration() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.VARIABLEDECLARATION;\r\n return _this;\r\n }\r\n return VariableDeclaration;\r\n}(VariableLikeDeclarationStatement));\r\nexports.VariableDeclaration = VariableDeclaration;\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nvar VariableStatement = /** @class */ (function (_super) {\r\n __extends(VariableStatement, _super);\r\n function VariableStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.VARIABLE;\r\n return _this;\r\n }\r\n return VariableStatement;\r\n}(Statement));\r\nexports.VariableStatement = VariableStatement;\r\n/** Represents a `while` statement. */\r\nvar WhileStatement = /** @class */ (function (_super) {\r\n __extends(WhileStatement, _super);\r\n function WhileStatement() {\r\n var _this = _super !== null && _super.apply(this, arguments) || this;\r\n _this.kind = NodeKind.WHILE;\r\n return _this;\r\n }\r\n return WhileStatement;\r\n}(Statement));\r\nexports.WhileStatement = WhileStatement;\r\n/** Cached unused modifiers for reuse. */\r\nvar reusableModifiers = null;\r\nfunction setReusableModifiers(modifiers) {\r\n reusableModifiers = modifiers;\r\n}\r\nexports.setReusableModifiers = setReusableModifiers;\r\n/** Creates a new modifiers array. */\r\nfunction createModifiers() {\r\n var ret;\r\n if (reusableModifiers != null) {\r\n ret = reusableModifiers;\r\n reusableModifiers = null;\r\n }\r\n else {\r\n ret = [];\r\n }\r\n ret.length = 0;\r\n return ret;\r\n}\r\nexports.createModifiers = createModifiers;\r\n// Utility\r\n/** Adds a modifier to a set of modifiers. Creates a new set if `null`. */\r\nfunction addModifier(modifier, modifiers) {\r\n if (modifiers == null)\r\n modifiers = createModifiers();\r\n modifiers.push(modifier);\r\n return modifiers;\r\n}\r\nexports.addModifier = addModifier;\r\n/** Gets a specific modifier from the specified set of modifiers. */\r\nfunction getModifier(kind, modifiers) {\r\n if (modifiers) {\r\n for (var i = 0, k = modifiers.length; i < k; ++i) {\r\n if (modifiers[i].modifierKind == kind) {\r\n return modifiers[i];\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\nexports.getModifier = getModifier;\r\n/** Tests whether a modifier exists in the specified set of modifiers. */\r\nfunction hasModifier(kind, modifiers) {\r\n return getModifier(kind, modifiers) != null;\r\n}\r\nexports.hasModifier = hasModifier;\r\n/** Gets the first decorator by name within at set of decorators, if present. */\r\nfunction getFirstDecorator(name, decorators) {\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n var expression = decorator.name;\r\n if (expression.kind == NodeKind.IDENTIFIER && expression.text == name) {\r\n return decorator;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\nexports.getFirstDecorator = getFirstDecorator;\r\n/** Tests if a specific decorator is present within the specified decorators. */\r\nfunction hasDecorator(name, decorators) {\r\n return getFirstDecorator(name, decorators) != null;\r\n}\r\nexports.hasDecorator = hasDecorator;\r\n/** Mangles a declaration's name to an internal name. */\r\nfunction mangleInternalName(declaration, asGlobal) {\r\n if (asGlobal === void 0) { asGlobal = false; }\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent)\r\n return name;\r\n if (declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE) {\r\n if (!(parent = parent.parent))\r\n return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (hasModifier(ModifierKind.STATIC, declaration.modifiers)\r\n ? program_1.STATIC_DELIMITER\r\n : program_1.INSTANCE_DELIMITER) + name;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) +\r\n program_1.STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + program_1.PATH_DELIMITER + name;\r\n}\r\nexports.mangleInternalName = mangleInternalName;\r\n/** Mangles an external to an internal path. */\r\nfunction mangleInternalPath(path) {\r\n if (path.endsWith(\".ts\"))\r\n path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\nexports.mangleInternalPath = mangleInternalPath;\r\n// Helpers\r\nfunction setParent(nodes, parent) {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\nfunction setParentOpt(nodes, parent) {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n var node = nodes[i];\r\n if (node)\r\n node.parent = parent;\r\n }\r\n}\r\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n/*\r\n\r\n This is a modified version of TypeScript's scanner that doesn't perform as much bookkeeping, simply\r\n skips over trivia and provides a more general mark/reset mechanism for the parser to utilize on\r\n ambiguous tokens.\r\n\r\n next() advances the token\r\n peek() peeks for the next token\r\n skip(token) skips over a token if possible\r\n mark() marks at current token\r\n reset() resets to marked state\r\n range() gets the range of the current token\r\n\r\n readFloat() on FLOATLITERAL\r\n readIdentifier() on IDENTIFIER\r\n readInteger() on INTEGERLITERAL\r\n readString() on STRINGLITERAL\r\n\r\n*/\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar charcode_1 = __webpack_require__(9);\r\n/** Named token types. */\r\nvar Token;\r\n(function (Token) {\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n Token[Token[\"ABSTRACT\"] = 0] = \"ABSTRACT\";\r\n Token[Token[\"AS\"] = 1] = \"AS\";\r\n Token[Token[\"ASYNC\"] = 2] = \"ASYNC\";\r\n Token[Token[\"AWAIT\"] = 3] = \"AWAIT\";\r\n Token[Token[\"BREAK\"] = 4] = \"BREAK\";\r\n Token[Token[\"CASE\"] = 5] = \"CASE\";\r\n Token[Token[\"CATCH\"] = 6] = \"CATCH\";\r\n Token[Token[\"CLASS\"] = 7] = \"CLASS\";\r\n Token[Token[\"CONST\"] = 8] = \"CONST\";\r\n Token[Token[\"CONTINUE\"] = 9] = \"CONTINUE\";\r\n Token[Token[\"CONSTRUCTOR\"] = 10] = \"CONSTRUCTOR\";\r\n Token[Token[\"DEBUGGER\"] = 11] = \"DEBUGGER\";\r\n Token[Token[\"DECLARE\"] = 12] = \"DECLARE\";\r\n Token[Token[\"DEFAULT\"] = 13] = \"DEFAULT\";\r\n Token[Token[\"DELETE\"] = 14] = \"DELETE\";\r\n Token[Token[\"DO\"] = 15] = \"DO\";\r\n Token[Token[\"ELSE\"] = 16] = \"ELSE\";\r\n Token[Token[\"ENUM\"] = 17] = \"ENUM\";\r\n Token[Token[\"EXPORT\"] = 18] = \"EXPORT\";\r\n Token[Token[\"EXTENDS\"] = 19] = \"EXTENDS\";\r\n Token[Token[\"FALSE\"] = 20] = \"FALSE\";\r\n Token[Token[\"FINALLY\"] = 21] = \"FINALLY\";\r\n Token[Token[\"FOR\"] = 22] = \"FOR\";\r\n Token[Token[\"FROM\"] = 23] = \"FROM\";\r\n Token[Token[\"FUNCTION\"] = 24] = \"FUNCTION\";\r\n Token[Token[\"GET\"] = 25] = \"GET\";\r\n Token[Token[\"IF\"] = 26] = \"IF\";\r\n Token[Token[\"IMPLEMENTS\"] = 27] = \"IMPLEMENTS\";\r\n Token[Token[\"IMPORT\"] = 28] = \"IMPORT\";\r\n Token[Token[\"IN\"] = 29] = \"IN\";\r\n Token[Token[\"INSTANCEOF\"] = 30] = \"INSTANCEOF\";\r\n Token[Token[\"INTERFACE\"] = 31] = \"INTERFACE\";\r\n Token[Token[\"IS\"] = 32] = \"IS\";\r\n Token[Token[\"KEYOF\"] = 33] = \"KEYOF\";\r\n Token[Token[\"LET\"] = 34] = \"LET\";\r\n Token[Token[\"MODULE\"] = 35] = \"MODULE\";\r\n Token[Token[\"NAMESPACE\"] = 36] = \"NAMESPACE\";\r\n Token[Token[\"NEW\"] = 37] = \"NEW\";\r\n Token[Token[\"NULL\"] = 38] = \"NULL\";\r\n Token[Token[\"OF\"] = 39] = \"OF\";\r\n Token[Token[\"PACKAGE\"] = 40] = \"PACKAGE\";\r\n Token[Token[\"PRIVATE\"] = 41] = \"PRIVATE\";\r\n Token[Token[\"PROTECTED\"] = 42] = \"PROTECTED\";\r\n Token[Token[\"PUBLIC\"] = 43] = \"PUBLIC\";\r\n Token[Token[\"READONLY\"] = 44] = \"READONLY\";\r\n Token[Token[\"RETURN\"] = 45] = \"RETURN\";\r\n Token[Token[\"SET\"] = 46] = \"SET\";\r\n Token[Token[\"STATIC\"] = 47] = \"STATIC\";\r\n Token[Token[\"SUPER\"] = 48] = \"SUPER\";\r\n Token[Token[\"SWITCH\"] = 49] = \"SWITCH\";\r\n Token[Token[\"THIS\"] = 50] = \"THIS\";\r\n Token[Token[\"THROW\"] = 51] = \"THROW\";\r\n Token[Token[\"TRUE\"] = 52] = \"TRUE\";\r\n Token[Token[\"TRY\"] = 53] = \"TRY\";\r\n Token[Token[\"TYPE\"] = 54] = \"TYPE\";\r\n Token[Token[\"TYPEOF\"] = 55] = \"TYPEOF\";\r\n Token[Token[\"VAR\"] = 56] = \"VAR\";\r\n Token[Token[\"VOID\"] = 57] = \"VOID\";\r\n Token[Token[\"WHILE\"] = 58] = \"WHILE\";\r\n Token[Token[\"WITH\"] = 59] = \"WITH\";\r\n Token[Token[\"YIELD\"] = 60] = \"YIELD\";\r\n // punctuation\r\n Token[Token[\"OPENBRACE\"] = 61] = \"OPENBRACE\";\r\n Token[Token[\"CLOSEBRACE\"] = 62] = \"CLOSEBRACE\";\r\n Token[Token[\"OPENPAREN\"] = 63] = \"OPENPAREN\";\r\n Token[Token[\"CLOSEPAREN\"] = 64] = \"CLOSEPAREN\";\r\n Token[Token[\"OPENBRACKET\"] = 65] = \"OPENBRACKET\";\r\n Token[Token[\"CLOSEBRACKET\"] = 66] = \"CLOSEBRACKET\";\r\n Token[Token[\"DOT\"] = 67] = \"DOT\";\r\n Token[Token[\"DOT_DOT_DOT\"] = 68] = \"DOT_DOT_DOT\";\r\n Token[Token[\"SEMICOLON\"] = 69] = \"SEMICOLON\";\r\n Token[Token[\"COMMA\"] = 70] = \"COMMA\";\r\n Token[Token[\"LESSTHAN\"] = 71] = \"LESSTHAN\";\r\n Token[Token[\"GREATERTHAN\"] = 72] = \"GREATERTHAN\";\r\n Token[Token[\"LESSTHAN_EQUALS\"] = 73] = \"LESSTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_EQUALS\"] = 74] = \"GREATERTHAN_EQUALS\";\r\n Token[Token[\"EQUALS_EQUALS\"] = 75] = \"EQUALS_EQUALS\";\r\n Token[Token[\"EXCLAMATION_EQUALS\"] = 76] = \"EXCLAMATION_EQUALS\";\r\n Token[Token[\"EQUALS_EQUALS_EQUALS\"] = 77] = \"EQUALS_EQUALS_EQUALS\";\r\n Token[Token[\"EXCLAMATION_EQUALS_EQUALS\"] = 78] = \"EXCLAMATION_EQUALS_EQUALS\";\r\n Token[Token[\"EQUALS_GREATERTHAN\"] = 79] = \"EQUALS_GREATERTHAN\";\r\n Token[Token[\"PLUS\"] = 80] = \"PLUS\";\r\n Token[Token[\"MINUS\"] = 81] = \"MINUS\";\r\n Token[Token[\"ASTERISK_ASTERISK\"] = 82] = \"ASTERISK_ASTERISK\";\r\n Token[Token[\"ASTERISK\"] = 83] = \"ASTERISK\";\r\n Token[Token[\"SLASH\"] = 84] = \"SLASH\";\r\n Token[Token[\"PERCENT\"] = 85] = \"PERCENT\";\r\n Token[Token[\"PLUS_PLUS\"] = 86] = \"PLUS_PLUS\";\r\n Token[Token[\"MINUS_MINUS\"] = 87] = \"MINUS_MINUS\";\r\n Token[Token[\"LESSTHAN_LESSTHAN\"] = 88] = \"LESSTHAN_LESSTHAN\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN\"] = 89] = \"GREATERTHAN_GREATERTHAN\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_GREATERTHAN\"] = 90] = \"GREATERTHAN_GREATERTHAN_GREATERTHAN\";\r\n Token[Token[\"AMPERSAND\"] = 91] = \"AMPERSAND\";\r\n Token[Token[\"BAR\"] = 92] = \"BAR\";\r\n Token[Token[\"CARET\"] = 93] = \"CARET\";\r\n Token[Token[\"EXCLAMATION\"] = 94] = \"EXCLAMATION\";\r\n Token[Token[\"TILDE\"] = 95] = \"TILDE\";\r\n Token[Token[\"AMPERSAND_AMPERSAND\"] = 96] = \"AMPERSAND_AMPERSAND\";\r\n Token[Token[\"BAR_BAR\"] = 97] = \"BAR_BAR\";\r\n Token[Token[\"QUESTION\"] = 98] = \"QUESTION\";\r\n Token[Token[\"COLON\"] = 99] = \"COLON\";\r\n Token[Token[\"EQUALS\"] = 100] = \"EQUALS\";\r\n Token[Token[\"PLUS_EQUALS\"] = 101] = \"PLUS_EQUALS\";\r\n Token[Token[\"MINUS_EQUALS\"] = 102] = \"MINUS_EQUALS\";\r\n Token[Token[\"ASTERISK_EQUALS\"] = 103] = \"ASTERISK_EQUALS\";\r\n Token[Token[\"ASTERISK_ASTERISK_EQUALS\"] = 104] = \"ASTERISK_ASTERISK_EQUALS\";\r\n Token[Token[\"SLASH_EQUALS\"] = 105] = \"SLASH_EQUALS\";\r\n Token[Token[\"PERCENT_EQUALS\"] = 106] = \"PERCENT_EQUALS\";\r\n Token[Token[\"LESSTHAN_LESSTHAN_EQUALS\"] = 107] = \"LESSTHAN_LESSTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_EQUALS\"] = 108] = \"GREATERTHAN_GREATERTHAN_EQUALS\";\r\n Token[Token[\"GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS\"] = 109] = \"GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS\";\r\n Token[Token[\"AMPERSAND_EQUALS\"] = 110] = \"AMPERSAND_EQUALS\";\r\n Token[Token[\"BAR_EQUALS\"] = 111] = \"BAR_EQUALS\";\r\n Token[Token[\"CARET_EQUALS\"] = 112] = \"CARET_EQUALS\";\r\n Token[Token[\"AT\"] = 113] = \"AT\";\r\n // literals\r\n Token[Token[\"IDENTIFIER\"] = 114] = \"IDENTIFIER\";\r\n Token[Token[\"STRINGLITERAL\"] = 115] = \"STRINGLITERAL\";\r\n Token[Token[\"INTEGERLITERAL\"] = 116] = \"INTEGERLITERAL\";\r\n Token[Token[\"FLOATLITERAL\"] = 117] = \"FLOATLITERAL\";\r\n // meta\r\n Token[Token[\"INVALID\"] = 118] = \"INVALID\";\r\n Token[Token[\"ENDOFFILE\"] = 119] = \"ENDOFFILE\";\r\n})(Token = exports.Token || (exports.Token = {}));\r\n(function (Token) {\r\n function fromKeyword(text) {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n case \"break\": return Token.BREAK;\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n case \"get\": return Token.GET;\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n case \"keyof\": return Token.KEYOF;\r\n case \"let\": return Token.LET;\r\n case \"module\": return Token.MODULE;\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n case \"of\": return Token.OF;\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n case \"yield\": return Token.YIELD;\r\n default: return Token.INVALID;\r\n }\r\n }\r\n Token.fromKeyword = fromKeyword;\r\n function isAlsoIdentifier(token) {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n Token.isAlsoIdentifier = isAlsoIdentifier;\r\n})(Token = exports.Token || (exports.Token = {}));\r\nvar Range = /** @class */ (function () {\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n function Range(source, start, end) {\r\n this.debugInfoRef = 0;\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n Range.join = function (a, b) {\r\n if (a.source != b.source)\r\n throw new Error(\"source mismatch\");\r\n return new Range(a.source, a.start < b.start ? a.start : b.start, a.end > b.end ? a.end : b.end);\r\n };\r\n Object.defineProperty(Range.prototype, \"atStart\", {\r\n get: function () {\r\n return new Range(this.source, this.start, this.start);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"atEnd\", {\r\n get: function () {\r\n return new Range(this.source, this.end, this.end);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"line\", {\r\n get: function () {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var line = 1;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == 10 /* LINEFEED */) {\r\n line++;\r\n }\r\n }\r\n return line;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(Range.prototype, \"column\", {\r\n get: function () {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var column = 0;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == 10 /* LINEFEED */)\r\n break;\r\n column++;\r\n }\r\n return column;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Range.prototype.toString = function () {\r\n return this.source.text.substring(this.start, this.end);\r\n };\r\n return Range;\r\n}());\r\nexports.Range = Range;\r\nvar Tokenizer = /** @class */ (function (_super) {\r\n __extends(Tokenizer, _super);\r\n function Tokenizer(source, diagnostics) {\r\n if (diagnostics === void 0) { diagnostics = null; }\r\n var _this = _super.call(this, diagnostics) || this;\r\n _this.end = 0;\r\n _this.pos = 0;\r\n _this.token = -1;\r\n _this.tokenPos = 0;\r\n _this.markedPos = 0;\r\n _this.markedToken = -1;\r\n _this.markedTokenPos = 0;\r\n _this.nextToken = -1;\r\n _this.nextTokenOnNewLine = false;\r\n _this.source = source;\r\n _this.pos = 0;\r\n _this.end = source.text.length;\r\n _this.diagnostics = diagnostics ? diagnostics : new Array();\r\n var text = source.text;\r\n // skip bom\r\n if (_this.pos < _this.end &&\r\n text.charCodeAt(_this.pos) == 65279 /* BYTEORDERMARK */) {\r\n ++_this.pos;\r\n }\r\n // skip shebang\r\n if (_this.pos + 1 < _this.end &&\r\n text.charCodeAt(_this.pos) == 35 /* HASH */ &&\r\n text.charCodeAt(_this.pos + 1) == 33 /* EXCLAMATION */) {\r\n _this.pos += 2;\r\n while (_this.pos < _this.end &&\r\n text.charCodeAt(_this.pos) != 10 /* LINEFEED */) {\r\n ++_this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n return _this;\r\n }\r\n Tokenizer.prototype.next = function (preferIdentifier) {\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(preferIdentifier);\r\n };\r\n Tokenizer.prototype.unsafeNext = function (preferIdentifier, maxTokenLength) {\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n if (maxTokenLength === void 0) { maxTokenLength = i32.MAX_VALUE; }\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n var c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n case 13 /* CARRIAGERETURN */:\r\n if (++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 10 /* LINEFEED */) {\r\n ++this.pos;\r\n }\r\n break;\r\n case 10 /* LINEFEED */:\r\n case 9 /* TAB */:\r\n case 11 /* VERTICALTAB */:\r\n case 12 /* FORMFEED */:\r\n case 32 /* SPACE */:\r\n ++this.pos;\r\n break;\r\n case 33 /* EXCLAMATION */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n case 34 /* DOUBLEQUOTE */:\r\n case 39 /* SINGLEQUOTE */:\r\n case 96 /* BACKTICK */:// TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n case 37 /* PERCENT */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n case 38 /* AMPERSAND */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 38 /* AMPERSAND */) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n case 40 /* OPENPAREN */:\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n case 41 /* CLOSEPAREN */:\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n case 42 /* ASTERISK */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == 42 /* ASTERISK */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n case 43 /* PLUS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 43 /* PLUS */) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n case 44 /* COMMA */:\r\n ++this.pos;\r\n return Token.COMMA;\r\n case 45 /* MINUS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 45 /* MINUS */) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n case 46 /* DOT */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == 46 /* DOT */ &&\r\n text.charCodeAt(this.pos + 1) == 46 /* DOT */) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n case 47 /* SLASH */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 47 /* SLASH */) {\r\n // TODO: triple-slash?\r\n // if (\r\n // this.pos + 1 < this.end &&\r\n // text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n // ) {\r\n // }\r\n while (++this.pos < this.end) {\r\n if (charcode_1.isLineBreak(text.charCodeAt(this.pos)))\r\n break;\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == 42 /* ASTERISK */) {\r\n var closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (c == 42 /* ASTERISK */ &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == 47 /* SLASH */) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, this.range(this.pos), \"*/\");\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n case 48 /* _0 */:\r\n case 49 /* _1 */:\r\n case 50 /* _2 */:\r\n case 51 /* _3 */:\r\n case 52 /* _4 */:\r\n case 53 /* _5 */:\r\n case 54 /* _6 */:\r\n case 55 /* _7 */:\r\n case 56 /* _8 */:\r\n case 57 /* _9 */:\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n case 58 /* COLON */:\r\n ++this.pos;\r\n return Token.COLON;\r\n case 59 /* SEMICOLON */:\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n case 60 /* LESSTHAN */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 60 /* LESSTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n case 61 /* EQUALS */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n case 62 /* GREATERTHAN */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 62 /* GREATERTHAN */) {\r\n ++this.pos;\r\n if (maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n case 63 /* QUESTION */:\r\n ++this.pos;\r\n return Token.QUESTION;\r\n case 91 /* OPENBRACKET */:\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n case 93 /* CLOSEBRACKET */:\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n case 94 /* CARET */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n case 123 /* OPENBRACE */:\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n case 124 /* BAR */:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == 124 /* BAR */) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == 61 /* EQUALS */) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n case 125 /* CLOSEBRACE */:\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n case 126 /* TILDE */:\r\n ++this.pos;\r\n return Token.TILDE;\r\n case 64 /* AT */:\r\n ++this.pos;\r\n return Token.AT;\r\n default:\r\n if (charcode_1.isIdentifierStart(c)) {\r\n if (charcode_1.isKeywordCharacter(c)) {\r\n var posBefore = this.pos;\r\n while (++this.pos < this.end &&\r\n charcode_1.isIdentifierPart(c = text.charCodeAt(this.pos))) {\r\n if (!charcode_1.isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n var keywordText = text.substring(posBefore, this.pos);\r\n var keywordToken = Token.fromKeyword(keywordText);\r\n if (keywordToken != Token.INVALID &&\r\n !(preferIdentifier && Token.isAlsoIdentifier(keywordToken))) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n }\r\n else if (charcode_1.isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(diagnostics_1.DiagnosticCode.Invalid_character, this.range(this.pos, this.pos + 1));\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n };\r\n Tokenizer.prototype.peek = function (checkOnNewLine, preferIdentifier, maxCompoundLength) {\r\n if (checkOnNewLine === void 0) { checkOnNewLine = false; }\r\n if (preferIdentifier === void 0) { preferIdentifier = false; }\r\n if (maxCompoundLength === void 0) { maxCompoundLength = i32.MAX_VALUE; }\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(preferIdentifier, maxCompoundLength);\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n while (--this.tokenPos > posBefore) {\r\n if (charcode_1.isLineBreak(text.charCodeAt(this.tokenPos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n };\r\n Tokenizer.prototype.skip = function (token) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN:// where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n this.token = this.unsafeNext(token == Token.IDENTIFIER, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n }\r\n else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n };\r\n // skipUntil(token1: Token, token2: Token = -1): bool {\r\n // var next: Token;\r\n // do {\r\n // if ((next = this.peek()) == Token.ENDOFFILE)\r\n // return false;\r\n // if (next == token1 || next == token2)\r\n // return true;\r\n // this.next();\r\n // } while (true);\r\n // }\r\n Tokenizer.prototype.mark = function () {\r\n this.markedPos = this.pos;\r\n this.markedToken = this.token;\r\n this.markedTokenPos = this.tokenPos;\r\n };\r\n Tokenizer.prototype.reset = function () {\r\n this.pos = this.markedPos;\r\n this.token = this.markedToken;\r\n this.tokenPos = this.markedTokenPos;\r\n this.nextToken = -1;\r\n };\r\n Tokenizer.prototype.range = function (start, end) {\r\n if (start === void 0) { start = -1; }\r\n if (end === void 0) { end = -1; }\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n }\r\n else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n };\r\n Tokenizer.prototype.readIdentifier = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (++this.pos < this.end &&\r\n charcode_1.isIdentifierPart(text.charCodeAt(this.pos)))\r\n ;\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.readString = function () {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_string_literal, this.range(start - 1, this.end));\r\n break;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == 92 /* BACKSLASH */) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (charcode_1.isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_string_literal, this.range(start - 1, this.pos));\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n };\r\n Tokenizer.prototype.readEscapeSequence = function () {\r\n if (++this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(this.end));\r\n return \"\";\r\n }\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n case 48 /* _0 */:\r\n return \"\\0\";\r\n case 98 /* b */:\r\n return \"\\b\";\r\n case 116 /* t */:\r\n return \"\\t\";\r\n case 110 /* n */:\r\n return \"\\n\";\r\n case 118 /* v */:\r\n return \"\\v\";\r\n case 102 /* f */:\r\n return \"\\f\";\r\n case 114 /* r */:\r\n return \"\\r\";\r\n case 39 /* SINGLEQUOTE */:\r\n return \"'\";\r\n case 34 /* DOUBLEQUOTE */:\r\n return \"\\\"\";\r\n case 117 /* u */: {\r\n if (this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 123 /* OPENBRACE */) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n case 13 /* CARRIAGERETURN */:\r\n if (this.pos < this.end &&\r\n text.charCodeAt(this.pos) == 10 /* LINEFEED */) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n case 10 /* LINEFEED */:\r\n case 8232 /* LINESEPARATOR */:\r\n case 8233 /* PARAGRAPHSEPARATOR */:\r\n return \"\";\r\n default:\r\n return String.fromCharCode(c);\r\n }\r\n };\r\n Tokenizer.prototype.readRegexpPattern = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_regular_expression_literal, this.range(start, this.end));\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == 92 /* BACKSLASH */) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 47 /* SLASH */ && !escaped)\r\n break;\r\n if (charcode_1.isLineBreak(c)) {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_regular_expression_literal, this.range(start, this.pos));\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.readRegexpFlags = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (!charcode_1.isIdentifierPart(c))\r\n break;\r\n ++this.pos;\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n case 103 /* g */:\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n case 105 /* i */:\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n case 109 /* m */:\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n default:\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(diagnostics_1.DiagnosticCode.Invalid_regular_expression_flags, this.range(start, this.pos));\r\n }\r\n return text.substring(start, this.pos);\r\n };\r\n Tokenizer.prototype.testInteger = function () {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == 48 /* _0 */ && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case 88 /* X */:\r\n case 120 /* x */:\r\n case 66 /* B */:\r\n case 98 /* b */:\r\n case 79 /* O */:\r\n case 111 /* o */:\r\n return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n var c = text.charCodeAt(pos);\r\n if (c == 46 /* DOT */ || c == 69 /* E */ || c == 101 /* e */) {\r\n return false;\r\n }\r\n if (c < 48 /* _0 */ || c > 57 /* _9 */)\r\n break;\r\n pos++;\r\n }\r\n return true;\r\n };\r\n Tokenizer.prototype.readInteger = function () {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == 48 /* _0 */ && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n case 88 /* X */:\r\n case 120 /* x */:\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n case 66 /* B */:\r\n case 98 /* b */:\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n case 79 /* O */:\r\n case 111 /* o */:\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n if (charcode_1.isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n var start = this.pos;\r\n ++this.pos;\r\n var value = this.readOctalInteger();\r\n this.error(diagnostics_1.DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode, this.range(start, this.pos));\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n };\r\n Tokenizer.prototype.readHexInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else if (c >= 65 /* A */ && c <= 70 /* F */) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(10 + c - 65 /* A */, 0));\r\n }\r\n else if (c >= 97 /* a */ && c <= 102 /* f */) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(i64_mul(value, i64_16), i64_new(10 + c - 97 /* a */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Hexadecimal_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readDecimalInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_10), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readOctalInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= 48 /* _0 */ && c <= 55 /* _7 */) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(i64_mul(value, i64_8), i64_new(c - 48 /* _0 */, 0));\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Octal_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readBinaryInteger = function () {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 48 /* _0 */) {\r\n // value = value * 2;\r\n value = i64_mul(value, i64_2);\r\n }\r\n else if (c == 49 /* _1 */) {\r\n // value = value * 2 + 1;\r\n value = i64_add(i64_mul(value, i64_2), i64_1);\r\n }\r\n else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(diagnostics_1.DiagnosticCode.Binary_digit_expected, this.range(start));\r\n }\r\n return value;\r\n };\r\n Tokenizer.prototype.readFloat = function () {\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == 46 /* DOT */) {\r\n ++this.pos;\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == 69 /* E */ || c == 101 /* e */) {\r\n if (++this.pos < this.end && (text.charCodeAt(this.pos) == 45 /* MINUS */ ||\r\n text.charCodeAt(this.pos) == 43 /* PLUS */) &&\r\n charcode_1.isDecimalDigit(text.charCodeAt(this.pos + 1))) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && charcode_1.isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n };\r\n Tokenizer.prototype.readUnicodeEscape = function () {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos++);\r\n if (c >= 48 /* _0 */ && c <= 57 /* _9 */) {\r\n value = value * 16 + c - 48 /* _0 */;\r\n }\r\n else if (c >= 65 /* A */ && c <= 70 /* F */) {\r\n value = value * 16 + 10 + c - 65 /* A */;\r\n }\r\n else if (c >= 97 /* a */ && c <= 102 /* f */) {\r\n value = value * 16 + 10 + c - 97 /* a */;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Hexadecimal_digit_expected, this.range(this.pos - 1, this.pos));\r\n return \"\";\r\n }\r\n if (--remain == 0)\r\n break;\r\n }\r\n if (remain) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(this.pos));\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n };\r\n Tokenizer.prototype.readExtendedUnicodeEscape = function () {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(diagnostics_1.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive, this.range(start, this.pos));\r\n invalid = true;\r\n }\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(diagnostics_1.DiagnosticCode.Unexpected_end_of_text, this.range(start, this.end));\r\n invalid = true;\r\n }\r\n else if (text.charCodeAt(this.pos) == 125 /* CLOSEBRACE */) {\r\n ++this.pos;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Unterminated_Unicode_escape_sequence, this.range(start, this.pos));\r\n invalid = true;\r\n }\r\n if (invalid)\r\n return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode((((value32 - 65536) / 1024 | 0) + 0xD800), ((value32 - 65536) % 1024 + 0xDC00));\r\n };\r\n Tokenizer.prototype.finish = function () {\r\n };\r\n return Tokenizer;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Tokenizer = Tokenizer;\r\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n// code below is generated from diagnosticsMessages.json by scripts/build-diagnostics\r\n/* tslint:disable:max-line-length */\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar DiagnosticCode;\r\n(function (DiagnosticCode) {\r\n DiagnosticCode[DiagnosticCode[\"Operation_not_supported\"] = 100] = \"Operation_not_supported\";\r\n DiagnosticCode[DiagnosticCode[\"Operation_is_unsafe\"] = 101] = \"Operation_is_unsafe\";\r\n DiagnosticCode[DiagnosticCode[\"Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast\"] = 200] = \"Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast\";\r\n DiagnosticCode[DiagnosticCode[\"Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit\"] = 201] = \"Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_cannot_be_changed_to_type_1\"] = 202] = \"Type_0_cannot_be_changed_to_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_cannot_be_reinterpreted_as_type_1\"] = 203] = \"Type_0_cannot_be_reinterpreted_as_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Basic_type_0_cannot_be_nullable\"] = 204] = \"Basic_type_0_cannot_be_nullable\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_export_a_mutable_global\"] = 205] = \"Cannot_export_a_mutable_global\";\r\n DiagnosticCode[DiagnosticCode[\"Compiling_constant_with_non_constant_initializer_as_mutable\"] = 206] = \"Compiling_constant_with_non_constant_initializer_as_mutable\";\r\n DiagnosticCode[DiagnosticCode[\"Structs_cannot_extend_classes_and_vice_versa\"] = 207] = \"Structs_cannot_extend_classes_and_vice_versa\";\r\n DiagnosticCode[DiagnosticCode[\"Structs_cannot_implement_interfaces\"] = 208] = \"Structs_cannot_implement_interfaces\";\r\n DiagnosticCode[DiagnosticCode[\"Invalid_regular_expression_flags\"] = 209] = \"Invalid_regular_expression_flags\";\r\n DiagnosticCode[DiagnosticCode[\"Implementation_0_must_match_the_signature_1\"] = 210] = \"Implementation_0_must_match_the_signature_1\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_string_literal\"] = 1002] = \"Unterminated_string_literal\";\r\n DiagnosticCode[DiagnosticCode[\"Identifier_expected\"] = 1003] = \"Identifier_expected\";\r\n DiagnosticCode[DiagnosticCode[\"_0_expected\"] = 1005] = \"_0_expected\";\r\n DiagnosticCode[DiagnosticCode[\"A_file_cannot_have_a_reference_to_itself\"] = 1006] = \"A_file_cannot_have_a_reference_to_itself\";\r\n DiagnosticCode[DiagnosticCode[\"Trailing_comma_not_allowed\"] = 1009] = \"Trailing_comma_not_allowed\";\r\n DiagnosticCode[DiagnosticCode[\"Unexpected_token\"] = 1012] = \"Unexpected_token\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_must_be_last_in_a_parameter_list\"] = 1014] = \"A_rest_parameter_must_be_last_in_a_parameter_list\";\r\n DiagnosticCode[DiagnosticCode[\"Parameter_cannot_have_question_mark_and_initializer\"] = 1015] = \"Parameter_cannot_have_question_mark_and_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_required_parameter_cannot_follow_an_optional_parameter\"] = 1016] = \"A_required_parameter_cannot_follow_an_optional_parameter\";\r\n DiagnosticCode[DiagnosticCode[\"Enum_member_must_have_initializer\"] = 1061] = \"Enum_member_must_have_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"Statements_are_not_allowed_in_ambient_contexts\"] = 1036] = \"Statements_are_not_allowed_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"Initializers_are_not_allowed_in_ambient_contexts\"] = 1039] = \"Initializers_are_not_allowed_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"_0_modifier_cannot_be_used_here\"] = 1042] = \"_0_modifier_cannot_be_used_here\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_cannot_be_optional\"] = 1047] = \"A_rest_parameter_cannot_be_optional\";\r\n DiagnosticCode[DiagnosticCode[\"A_rest_parameter_cannot_have_an_initializer\"] = 1048] = \"A_rest_parameter_cannot_have_an_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_must_have_exactly_one_parameter\"] = 1049] = \"A_set_accessor_must_have_exactly_one_parameter\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_parameter_cannot_have_an_initializer\"] = 1052] = \"A_set_accessor_parameter_cannot_have_an_initializer\";\r\n DiagnosticCode[DiagnosticCode[\"A_get_accessor_cannot_have_parameters\"] = 1054] = \"A_get_accessor_cannot_have_parameters\";\r\n DiagnosticCode[DiagnosticCode[\"Type_parameters_cannot_appear_on_a_constructor_declaration\"] = 1092] = \"Type_parameters_cannot_appear_on_a_constructor_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"Type_annotation_cannot_appear_on_a_constructor_declaration\"] = 1093] = \"Type_annotation_cannot_appear_on_a_constructor_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"An_accessor_cannot_have_type_parameters\"] = 1094] = \"An_accessor_cannot_have_type_parameters\";\r\n DiagnosticCode[DiagnosticCode[\"A_set_accessor_cannot_have_a_return_type_annotation\"] = 1095] = \"A_set_accessor_cannot_have_a_return_type_annotation\";\r\n DiagnosticCode[DiagnosticCode[\"Type_parameter_list_cannot_be_empty\"] = 1098] = \"Type_parameter_list_cannot_be_empty\";\r\n DiagnosticCode[DiagnosticCode[\"A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement\"] = 1104] = \"A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement\";\r\n DiagnosticCode[DiagnosticCode[\"A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement\"] = 1105] = \"A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement\";\r\n DiagnosticCode[DiagnosticCode[\"A_return_statement_can_only_be_used_within_a_function_body\"] = 1108] = \"A_return_statement_can_only_be_used_within_a_function_body\";\r\n DiagnosticCode[DiagnosticCode[\"Expression_expected\"] = 1109] = \"Expression_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Type_expected\"] = 1110] = \"Type_expected\";\r\n DiagnosticCode[DiagnosticCode[\"A_default_clause_cannot_appear_more_than_once_in_a_switch_statement\"] = 1113] = \"A_default_clause_cannot_appear_more_than_once_in_a_switch_statement\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_label_0\"] = 1114] = \"Duplicate_label_0\";\r\n DiagnosticCode[DiagnosticCode[\"Octal_literals_are_not_allowed_in_strict_mode\"] = 1121] = \"Octal_literals_are_not_allowed_in_strict_mode\";\r\n DiagnosticCode[DiagnosticCode[\"Digit_expected\"] = 1124] = \"Digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Hexadecimal_digit_expected\"] = 1125] = \"Hexadecimal_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Unexpected_end_of_text\"] = 1126] = \"Unexpected_end_of_text\";\r\n DiagnosticCode[DiagnosticCode[\"Invalid_character\"] = 1127] = \"Invalid_character\";\r\n DiagnosticCode[DiagnosticCode[\"_case_or_default_expected\"] = 1130] = \"_case_or_default_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Type_argument_expected\"] = 1140] = \"Type_argument_expected\";\r\n DiagnosticCode[DiagnosticCode[\"String_literal_expected\"] = 1141] = \"String_literal_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Line_break_not_permitted_here\"] = 1142] = \"Line_break_not_permitted_here\";\r\n DiagnosticCode[DiagnosticCode[\"Declaration_expected\"] = 1146] = \"Declaration_expected\";\r\n DiagnosticCode[DiagnosticCode[\"_const_declarations_must_be_initialized\"] = 1155] = \"_const_declarations_must_be_initialized\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_regular_expression_literal\"] = 1161] = \"Unterminated_regular_expression_literal\";\r\n DiagnosticCode[DiagnosticCode[\"Binary_digit_expected\"] = 1177] = \"Binary_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"Octal_digit_expected\"] = 1178] = \"Octal_digit_expected\";\r\n DiagnosticCode[DiagnosticCode[\"An_implementation_cannot_be_declared_in_ambient_contexts\"] = 1183] = \"An_implementation_cannot_be_declared_in_ambient_contexts\";\r\n DiagnosticCode[DiagnosticCode[\"An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive\"] = 1198] = \"An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive\";\r\n DiagnosticCode[DiagnosticCode[\"Unterminated_Unicode_escape_sequence\"] = 1199] = \"Unterminated_Unicode_escape_sequence\";\r\n DiagnosticCode[DiagnosticCode[\"Decorators_are_not_valid_here\"] = 1206] = \"Decorators_are_not_valid_here\";\r\n DiagnosticCode[DiagnosticCode[\"_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration\"] = 1242] = \"_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"A_class_may_only_extend_another_class\"] = 1311] = \"A_class_may_only_extend_another_class\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_identifier_0\"] = 2300] = \"Duplicate_identifier_0\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_find_name_0\"] = 2304] = \"Cannot_find_name_0\";\r\n DiagnosticCode[DiagnosticCode[\"Module_0_has_no_exported_member_1\"] = 2305] = \"Module_0_has_no_exported_member_1\";\r\n DiagnosticCode[DiagnosticCode[\"Generic_type_0_requires_1_type_argument_s\"] = 2314] = \"Generic_type_0_requires_1_type_argument_s\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_is_not_generic\"] = 2315] = \"Type_0_is_not_generic\";\r\n DiagnosticCode[DiagnosticCode[\"Type_0_is_not_assignable_to_type_1\"] = 2322] = \"Type_0_is_not_assignable_to_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Index_signature_is_missing_in_type_0\"] = 2329] = \"Index_signature_is_missing_in_type_0\";\r\n DiagnosticCode[DiagnosticCode[\"_this_cannot_be_referenced_in_current_location\"] = 2332] = \"_this_cannot_be_referenced_in_current_location\";\r\n DiagnosticCode[DiagnosticCode[\"_super_can_only_be_referenced_in_a_derived_class\"] = 2335] = \"_super_can_only_be_referenced_in_a_derived_class\";\r\n DiagnosticCode[DiagnosticCode[\"Property_0_does_not_exist_on_type_1\"] = 2339] = \"Property_0_does_not_exist_on_type_1\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures\"] = 2349] = \"Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature\"] = 2351] = \"Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature\";\r\n DiagnosticCode[DiagnosticCode[\"A_function_whose_declared_type_is_not_void_must_return_a_value\"] = 2355] = \"A_function_whose_declared_type_is_not_void_must_return_a_value\";\r\n DiagnosticCode[DiagnosticCode[\"The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access\"] = 2357] = \"The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access\"] = 2364] = \"The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"_get_and_set_accessor_must_have_the_same_type\"] = 2380] = \"_get_and_set_accessor_must_have_the_same_type\";\r\n DiagnosticCode[DiagnosticCode[\"Constructor_implementation_is_missing\"] = 2390] = \"Constructor_implementation_is_missing\";\r\n DiagnosticCode[DiagnosticCode[\"Function_implementation_is_missing_or_not_immediately_following_the_declaration\"] = 2391] = \"Function_implementation_is_missing_or_not_immediately_following_the_declaration\";\r\n DiagnosticCode[DiagnosticCode[\"Multiple_constructor_implementations_are_not_allowed\"] = 2392] = \"Multiple_constructor_implementations_are_not_allowed\";\r\n DiagnosticCode[DiagnosticCode[\"Duplicate_function_implementation\"] = 2393] = \"Duplicate_function_implementation\";\r\n DiagnosticCode[DiagnosticCode[\"Export_declaration_conflicts_with_exported_declaration_of_0\"] = 2484] = \"Export_declaration_conflicts_with_exported_declaration_of_0\";\r\n DiagnosticCode[DiagnosticCode[\"Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property\"] = 2540] = \"Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property\";\r\n DiagnosticCode[DiagnosticCode[\"The_target_of_an_assignment_must_be_a_variable_or_a_property_access\"] = 2541] = \"The_target_of_an_assignment_must_be_a_variable_or_a_property_access\";\r\n DiagnosticCode[DiagnosticCode[\"Index_signature_in_type_0_only_permits_reading\"] = 2542] = \"Index_signature_in_type_0_only_permits_reading\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_0_arguments_but_got_1\"] = 2554] = \"Expected_0_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_at_least_0_arguments_but_got_1\"] = 2555] = \"Expected_at_least_0_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"Expected_0_type_arguments_but_got_1\"] = 2558] = \"Expected_0_type_arguments_but_got_1\";\r\n DiagnosticCode[DiagnosticCode[\"A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums\"] = 2651] = \"A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums\";\r\n DiagnosticCode[DiagnosticCode[\"Namespace_0_has_no_exported_member_1\"] = 2694] = \"Namespace_0_has_no_exported_member_1\";\r\n DiagnosticCode[DiagnosticCode[\"File_0_not_found\"] = 6054] = \"File_0_not_found\";\r\n})(DiagnosticCode = exports.DiagnosticCode || (exports.DiagnosticCode = {}));\r\nfunction diagnosticCodeToString(code) {\r\n switch (code) {\r\n case 100: return \"Operation not supported.\";\r\n case 101: return \"Operation is unsafe.\";\r\n case 200: return \"Conversion from type '{0}' to '{1}' possibly loses information and thus requires an explicit cast.\";\r\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\r\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\r\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\r\n case 204: return \"Basic type '{0}' cannot be nullable.\";\r\n case 205: return \"Cannot export a mutable global.\";\r\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\r\n case 207: return \"Structs cannot extend classes and vice-versa.\";\r\n case 208: return \"Structs cannot implement interfaces.\";\r\n case 209: return \"Invalid regular expression flags.\";\r\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\r\n case 1002: return \"Unterminated string literal.\";\r\n case 1003: return \"Identifier expected.\";\r\n case 1005: return \"'{0}' expected.\";\r\n case 1006: return \"A file cannot have a reference to itself.\";\r\n case 1009: return \"Trailing comma not allowed.\";\r\n case 1012: return \"Unexpected token.\";\r\n case 1014: return \"A rest parameter must be last in a parameter list.\";\r\n case 1015: return \"Parameter cannot have question mark and initializer.\";\r\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\r\n case 1061: return \"Enum member must have initializer.\";\r\n case 1036: return \"Statements are not allowed in ambient contexts.\";\r\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\r\n case 1042: return \"'{0}' modifier cannot be used here.\";\r\n case 1047: return \"A rest parameter cannot be optional.\";\r\n case 1048: return \"A rest parameter cannot have an initializer.\";\r\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\r\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\r\n case 1054: return \"A 'get' accessor cannot have parameters.\";\r\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\r\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\r\n case 1094: return \"An accessor cannot have type parameters.\";\r\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\r\n case 1098: return \"Type parameter list cannot be empty.\";\r\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\r\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\r\n case 1108: return \"A 'return' statement can only be used within a function body.\";\r\n case 1109: return \"Expression expected.\";\r\n case 1110: return \"Type expected.\";\r\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\r\n case 1114: return \"Duplicate label '{0}'.\";\r\n case 1121: return \"Octal literals are not allowed in strict mode.\";\r\n case 1124: return \"Digit expected.\";\r\n case 1125: return \"Hexadecimal digit expected.\";\r\n case 1126: return \"Unexpected end of text.\";\r\n case 1127: return \"Invalid character.\";\r\n case 1130: return \"'case' or 'default' expected.\";\r\n case 1140: return \"Type argument expected.\";\r\n case 1141: return \"String literal expected.\";\r\n case 1142: return \"Line break not permitted here.\";\r\n case 1146: return \"Declaration expected.\";\r\n case 1155: return \"'const' declarations must be initialized.\";\r\n case 1161: return \"Unterminated regular expression literal.\";\r\n case 1177: return \"Binary digit expected.\";\r\n case 1178: return \"Octal digit expected.\";\r\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\r\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\r\n case 1199: return \"Unterminated Unicode escape sequence.\";\r\n case 1206: return \"Decorators are not valid here.\";\r\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\r\n case 1311: return \"A class may only extend another class.\";\r\n case 2300: return \"Duplicate identifier '{0}'.\";\r\n case 2304: return \"Cannot find name '{0}'.\";\r\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\r\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\r\n case 2315: return \"Type '{0}' is not generic.\";\r\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\r\n case 2329: return \"Index signature is missing in type '{0}'.\";\r\n case 2332: return \"'this' cannot be referenced in current location.\";\r\n case 2335: return \"'super' can only be referenced in a derived class.\";\r\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\r\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\r\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\r\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\r\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\r\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\r\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\r\n case 2390: return \"Constructor implementation is missing.\";\r\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\r\n case 2392: return \"Multiple constructor implementations are not allowed.\";\r\n case 2393: return \"Duplicate function implementation.\";\r\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\r\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\r\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\r\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\r\n case 2554: return \"Expected {0} arguments, but got {1}.\";\r\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\r\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\r\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\r\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\r\n case 6054: return \"File '{0}' not found.\";\r\n default: return \"\";\r\n }\r\n}\r\nexports.diagnosticCodeToString = diagnosticCodeToString;\r\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/** An enum of named character codes. */\r\nvar CharCode;\r\n(function (CharCode) {\r\n CharCode[CharCode[\"NULL\"] = 0] = \"NULL\";\r\n CharCode[CharCode[\"LINEFEED\"] = 10] = \"LINEFEED\";\r\n CharCode[CharCode[\"CARRIAGERETURN\"] = 13] = \"CARRIAGERETURN\";\r\n CharCode[CharCode[\"LINESEPARATOR\"] = 8232] = \"LINESEPARATOR\";\r\n CharCode[CharCode[\"PARAGRAPHSEPARATOR\"] = 8233] = \"PARAGRAPHSEPARATOR\";\r\n CharCode[CharCode[\"NEXTLINE\"] = 133] = \"NEXTLINE\";\r\n CharCode[CharCode[\"SPACE\"] = 32] = \"SPACE\";\r\n CharCode[CharCode[\"NONBREAKINGSPACE\"] = 160] = \"NONBREAKINGSPACE\";\r\n CharCode[CharCode[\"ENQUAD\"] = 8192] = \"ENQUAD\";\r\n CharCode[CharCode[\"EMQUAD\"] = 8193] = \"EMQUAD\";\r\n CharCode[CharCode[\"ENSPACE\"] = 8194] = \"ENSPACE\";\r\n CharCode[CharCode[\"EMSPACE\"] = 8195] = \"EMSPACE\";\r\n CharCode[CharCode[\"THREEPEREMSPACE\"] = 8196] = \"THREEPEREMSPACE\";\r\n CharCode[CharCode[\"FOURPEREMSPACE\"] = 8197] = \"FOURPEREMSPACE\";\r\n CharCode[CharCode[\"SIXPEREMSPACE\"] = 8198] = \"SIXPEREMSPACE\";\r\n CharCode[CharCode[\"FIGURESPACE\"] = 8199] = \"FIGURESPACE\";\r\n CharCode[CharCode[\"PUNCTUATIONSPACE\"] = 8200] = \"PUNCTUATIONSPACE\";\r\n CharCode[CharCode[\"THINSPACE\"] = 8201] = \"THINSPACE\";\r\n CharCode[CharCode[\"HAIRSPACE\"] = 8202] = \"HAIRSPACE\";\r\n CharCode[CharCode[\"ZEROWIDTHSPACE\"] = 8203] = \"ZEROWIDTHSPACE\";\r\n CharCode[CharCode[\"NARROWNOBREAKSPACE\"] = 8239] = \"NARROWNOBREAKSPACE\";\r\n CharCode[CharCode[\"IDEOGRAPHICSPACE\"] = 12288] = \"IDEOGRAPHICSPACE\";\r\n CharCode[CharCode[\"MATHEMATICALSPACE\"] = 8287] = \"MATHEMATICALSPACE\";\r\n CharCode[CharCode[\"OGHAM\"] = 5760] = \"OGHAM\";\r\n CharCode[CharCode[\"_\"] = 95] = \"_\";\r\n CharCode[CharCode[\"_0\"] = 48] = \"_0\";\r\n CharCode[CharCode[\"_1\"] = 49] = \"_1\";\r\n CharCode[CharCode[\"_2\"] = 50] = \"_2\";\r\n CharCode[CharCode[\"_3\"] = 51] = \"_3\";\r\n CharCode[CharCode[\"_4\"] = 52] = \"_4\";\r\n CharCode[CharCode[\"_5\"] = 53] = \"_5\";\r\n CharCode[CharCode[\"_6\"] = 54] = \"_6\";\r\n CharCode[CharCode[\"_7\"] = 55] = \"_7\";\r\n CharCode[CharCode[\"_8\"] = 56] = \"_8\";\r\n CharCode[CharCode[\"_9\"] = 57] = \"_9\";\r\n CharCode[CharCode[\"a\"] = 97] = \"a\";\r\n CharCode[CharCode[\"b\"] = 98] = \"b\";\r\n CharCode[CharCode[\"c\"] = 99] = \"c\";\r\n CharCode[CharCode[\"d\"] = 100] = \"d\";\r\n CharCode[CharCode[\"e\"] = 101] = \"e\";\r\n CharCode[CharCode[\"f\"] = 102] = \"f\";\r\n CharCode[CharCode[\"g\"] = 103] = \"g\";\r\n CharCode[CharCode[\"h\"] = 104] = \"h\";\r\n CharCode[CharCode[\"i\"] = 105] = \"i\";\r\n CharCode[CharCode[\"j\"] = 106] = \"j\";\r\n CharCode[CharCode[\"k\"] = 107] = \"k\";\r\n CharCode[CharCode[\"l\"] = 108] = \"l\";\r\n CharCode[CharCode[\"m\"] = 109] = \"m\";\r\n CharCode[CharCode[\"n\"] = 110] = \"n\";\r\n CharCode[CharCode[\"o\"] = 111] = \"o\";\r\n CharCode[CharCode[\"p\"] = 112] = \"p\";\r\n CharCode[CharCode[\"q\"] = 113] = \"q\";\r\n CharCode[CharCode[\"r\"] = 114] = \"r\";\r\n CharCode[CharCode[\"s\"] = 115] = \"s\";\r\n CharCode[CharCode[\"t\"] = 116] = \"t\";\r\n CharCode[CharCode[\"u\"] = 117] = \"u\";\r\n CharCode[CharCode[\"v\"] = 118] = \"v\";\r\n CharCode[CharCode[\"w\"] = 119] = \"w\";\r\n CharCode[CharCode[\"x\"] = 120] = \"x\";\r\n CharCode[CharCode[\"y\"] = 121] = \"y\";\r\n CharCode[CharCode[\"z\"] = 122] = \"z\";\r\n CharCode[CharCode[\"A\"] = 65] = \"A\";\r\n CharCode[CharCode[\"B\"] = 66] = \"B\";\r\n CharCode[CharCode[\"C\"] = 67] = \"C\";\r\n CharCode[CharCode[\"D\"] = 68] = \"D\";\r\n CharCode[CharCode[\"E\"] = 69] = \"E\";\r\n CharCode[CharCode[\"F\"] = 70] = \"F\";\r\n CharCode[CharCode[\"G\"] = 71] = \"G\";\r\n CharCode[CharCode[\"H\"] = 72] = \"H\";\r\n CharCode[CharCode[\"I\"] = 73] = \"I\";\r\n CharCode[CharCode[\"J\"] = 74] = \"J\";\r\n CharCode[CharCode[\"K\"] = 75] = \"K\";\r\n CharCode[CharCode[\"L\"] = 76] = \"L\";\r\n CharCode[CharCode[\"M\"] = 77] = \"M\";\r\n CharCode[CharCode[\"N\"] = 78] = \"N\";\r\n CharCode[CharCode[\"O\"] = 79] = \"O\";\r\n CharCode[CharCode[\"P\"] = 80] = \"P\";\r\n CharCode[CharCode[\"Q\"] = 81] = \"Q\";\r\n CharCode[CharCode[\"R\"] = 82] = \"R\";\r\n CharCode[CharCode[\"S\"] = 83] = \"S\";\r\n CharCode[CharCode[\"T\"] = 84] = \"T\";\r\n CharCode[CharCode[\"U\"] = 85] = \"U\";\r\n CharCode[CharCode[\"V\"] = 86] = \"V\";\r\n CharCode[CharCode[\"W\"] = 87] = \"W\";\r\n CharCode[CharCode[\"X\"] = 88] = \"X\";\r\n CharCode[CharCode[\"Y\"] = 89] = \"Y\";\r\n CharCode[CharCode[\"Z\"] = 90] = \"Z\";\r\n CharCode[CharCode[\"AMPERSAND\"] = 38] = \"AMPERSAND\";\r\n CharCode[CharCode[\"ASTERISK\"] = 42] = \"ASTERISK\";\r\n CharCode[CharCode[\"AT\"] = 64] = \"AT\";\r\n CharCode[CharCode[\"BACKSLASH\"] = 92] = \"BACKSLASH\";\r\n CharCode[CharCode[\"BACKTICK\"] = 96] = \"BACKTICK\";\r\n CharCode[CharCode[\"BAR\"] = 124] = \"BAR\";\r\n CharCode[CharCode[\"CARET\"] = 94] = \"CARET\";\r\n CharCode[CharCode[\"CLOSEBRACE\"] = 125] = \"CLOSEBRACE\";\r\n CharCode[CharCode[\"CLOSEBRACKET\"] = 93] = \"CLOSEBRACKET\";\r\n CharCode[CharCode[\"CLOSEPAREN\"] = 41] = \"CLOSEPAREN\";\r\n CharCode[CharCode[\"COLON\"] = 58] = \"COLON\";\r\n CharCode[CharCode[\"COMMA\"] = 44] = \"COMMA\";\r\n CharCode[CharCode[\"DOLLAR\"] = 36] = \"DOLLAR\";\r\n CharCode[CharCode[\"DOT\"] = 46] = \"DOT\";\r\n CharCode[CharCode[\"DOUBLEQUOTE\"] = 34] = \"DOUBLEQUOTE\";\r\n CharCode[CharCode[\"EQUALS\"] = 61] = \"EQUALS\";\r\n CharCode[CharCode[\"EXCLAMATION\"] = 33] = \"EXCLAMATION\";\r\n CharCode[CharCode[\"GREATERTHAN\"] = 62] = \"GREATERTHAN\";\r\n CharCode[CharCode[\"HASH\"] = 35] = \"HASH\";\r\n CharCode[CharCode[\"LESSTHAN\"] = 60] = \"LESSTHAN\";\r\n CharCode[CharCode[\"MINUS\"] = 45] = \"MINUS\";\r\n CharCode[CharCode[\"OPENBRACE\"] = 123] = \"OPENBRACE\";\r\n CharCode[CharCode[\"OPENBRACKET\"] = 91] = \"OPENBRACKET\";\r\n CharCode[CharCode[\"OPENPAREN\"] = 40] = \"OPENPAREN\";\r\n CharCode[CharCode[\"PERCENT\"] = 37] = \"PERCENT\";\r\n CharCode[CharCode[\"PLUS\"] = 43] = \"PLUS\";\r\n CharCode[CharCode[\"QUESTION\"] = 63] = \"QUESTION\";\r\n CharCode[CharCode[\"SEMICOLON\"] = 59] = \"SEMICOLON\";\r\n CharCode[CharCode[\"SINGLEQUOTE\"] = 39] = \"SINGLEQUOTE\";\r\n CharCode[CharCode[\"SLASH\"] = 47] = \"SLASH\";\r\n CharCode[CharCode[\"TILDE\"] = 126] = \"TILDE\";\r\n CharCode[CharCode[\"BACKSPACE\"] = 8] = \"BACKSPACE\";\r\n CharCode[CharCode[\"FORMFEED\"] = 12] = \"FORMFEED\";\r\n CharCode[CharCode[\"BYTEORDERMARK\"] = 65279] = \"BYTEORDERMARK\";\r\n CharCode[CharCode[\"TAB\"] = 9] = \"TAB\";\r\n CharCode[CharCode[\"VERTICALTAB\"] = 11] = \"VERTICALTAB\";\r\n})(CharCode = exports.CharCode || (exports.CharCode = {}));\r\n/** Tests if the specified character code is some sort of line break. */\r\nfunction isLineBreak(c) {\r\n switch (c) {\r\n case 10 /* LINEFEED */:\r\n case 13 /* CARRIAGERETURN */:\r\n case 8232 /* LINESEPARATOR */:\r\n case 8233 /* PARAGRAPHSEPARATOR */:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\nexports.isLineBreak = isLineBreak;\r\n/** Tests if the specified character code is some sort of white space. */\r\nfunction isWhiteSpace(c) {\r\n switch (c) {\r\n case 32 /* SPACE */:\r\n case 9 /* TAB */:\r\n case 11 /* VERTICALTAB */:\r\n case 12 /* FORMFEED */:\r\n case 160 /* NONBREAKINGSPACE */:\r\n case 133 /* NEXTLINE */:\r\n case 5760 /* OGHAM */:\r\n case 8239 /* NARROWNOBREAKSPACE */:\r\n case 8287 /* MATHEMATICALSPACE */:\r\n case 12288 /* IDEOGRAPHICSPACE */:\r\n case 65279 /* BYTEORDERMARK */:\r\n return true;\r\n default:\r\n return c >= 8192 /* ENQUAD */ && c <= 8203 /* ZEROWIDTHSPACE */;\r\n }\r\n}\r\nexports.isWhiteSpace = isWhiteSpace;\r\n/** Tests if the specified character code is a decimal digit. */\r\nfunction isDecimalDigit(c) {\r\n return c >= 48 /* _0 */ && c <= 57 /* _9 */;\r\n}\r\nexports.isDecimalDigit = isDecimalDigit;\r\n/** Tests if the specified character code is an octal digit. */\r\nfunction isOctalDigit(c) {\r\n return c >= 48 /* _0 */ && c <= 55 /* _7 */;\r\n}\r\nexports.isOctalDigit = isOctalDigit;\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nfunction isIdentifierStart(c) {\r\n return c >= 65 /* A */ && c <= 90 /* Z */\r\n || c >= 97 /* a */ && c <= 122 /* z */\r\n || c == 36 /* DOLLAR */\r\n || c == 95 /* _ */\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\nexports.isIdentifierStart = isIdentifierStart;\r\n/** Tests if the specified character code is a valid keyword character. */\r\nfunction isKeywordCharacter(c) {\r\n return c >= 97 /* a */ && c <= 122 /* z */;\r\n}\r\nexports.isKeywordCharacter = isKeywordCharacter;\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nfunction isIdentifierPart(c) {\r\n return c >= 65 /* A */ && c <= 90 /* Z */\r\n || c >= 97 /* a */ && c <= 122 /* z */\r\n || c >= 48 /* _0 */ && c <= 57 /* _9 */\r\n || c == 36 /* DOLLAR */\r\n || c == 95 /* _ */\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\nexports.isIdentifierPart = isIdentifierPart;\r\n// storing as u16 to save memory\r\nvar unicodeIdentifierStart = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nvar unicodeIdentifierPart = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nfunction lookupInUnicodeMap(code, map) {\r\n if (code < map[0])\r\n return false;\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid;\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n }\r\n else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\nfunction isUnicodeIdentifierStart(code) {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code, unicodeIdentifierStart);\r\n}\r\nfunction isUnicodeIdentifierPart(code) {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code, unicodeIdentifierPart);\r\n}\r\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar separator = 47 /* SLASH */;\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nfunction normalize(path) {\r\n var pos = 0;\r\n var len = path.length;\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == 46 /* DOT */ &&\r\n path.charCodeAt(pos + 1) == separator) {\r\n pos += 2;\r\n }\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n var atEnd;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n // we are only interested in '/.' sequences ...\r\n if (path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == 46 /* DOT */) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == 46 /* DOT */ ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == 46 /* DOT */ &&\r\n path.charCodeAt(pos + 3) == separator) {\r\n // find preceeding '/'\r\n var ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != 46 /* DOT */ ||\r\n path.charCodeAt(ipos + 2) != 46 /* DOT */) {\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != 46 /* DOT */ ||\r\n path.charCodeAt(1) != 46 /* DOT */) {\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\nexports.normalize = normalize;\r\n/** Resolves the specified path relative to the specified origin. */\r\nfunction resolve(normalizedPath, origin) {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalize(dirname(origin) + String.fromCharCode(separator) + normalizedPath);\r\n}\r\nexports.resolve = resolve;\r\n/** Obtains the directory portion of a normalized path. */\r\nfunction dirname(normalizedPath) {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\nexports.dirname = dirname;\r\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(12);\nmodule.exports = __webpack_require__(19);\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n__webpack_require__(13);\r\n__webpack_require__(14);\r\n__webpack_require__(17);\r\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || __webpack_require__(15);\r\n\r\nfor (var key in binaryen)\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n if (!size) return 0; // should be safe in our case\r\n return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = __webpack_require__(0).Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrint(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrintAsmjs(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_15__;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar types_1 = __webpack_require__(5);\r\nvar module_1 = __webpack_require__(0);\r\nvar program_1 = __webpack_require__(2);\r\n/** Compiles a get of a built-in global. */\r\nfunction compileGetConstant(compiler, global, reportNode) {\r\n switch (global.internalName) {\r\n case \"NaN\":// context-sensitive\r\n if (compiler.currentType == types_1.Type.f32) {\r\n return compiler.module.createF32(NaN);\r\n }\r\n else {\r\n compiler.currentType = types_1.Type.f64;\r\n return compiler.module.createF64(NaN);\r\n }\r\n case \"Infinity\":// context-sensitive\r\n if (compiler.currentType == types_1.Type.f32) {\r\n return compiler.module.createF32(Infinity);\r\n }\r\n else {\r\n compiler.currentType = types_1.Type.f64;\r\n return compiler.module.createF64(Infinity);\r\n }\r\n case \"HEAP_BASE\":// never inlined for linking purposes\r\n compiler.currentType = compiler.options.usizeType;\r\n return compiler.module.createGetGlobal(\"HEAP_BASE\", compiler.currentType.toNativeType());\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return compiler.module.createUnreachable();\r\n}\r\nexports.compileGetConstant = compileGetConstant;\r\n/** Compiles a call to a built-in function. */\r\nfunction compileCall(compiler, prototype, typeArguments, operands, contextualType, reportNode) {\r\n var module = compiler.module;\r\n var arg0, arg1, arg2, ret;\r\n var tempLocal0, tempLocal1;\r\n var type, offset;\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n // search: createSelect\r\n switch (prototype.internalName) {\r\n // math\r\n case \"isNaN\":// isNaN(value: T) -> bool\r\n compiler.currentType = types_1.Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createBinary(module_1.BinaryOp.NeF32, module.createTeeLocal(tempLocal0.index, arg0), module.createGetLocal(tempLocal0.index, module_1.NativeType.F32));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createBinary(module_1.BinaryOp.NeF64, module.createTeeLocal(tempLocal0.index, arg0), module.createGetLocal(tempLocal0.index, module_1.NativeType.F64));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n default:// every other type is never NaN\r\n ret = module.createI32(0);\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.bool;\r\n return ret;\r\n case \"isFinite\":// isFinite(value: T) -> bool\r\n compiler.currentType = types_1.Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createSelect(module.createBinary(module_1.BinaryOp.NeF32, module.createUnary(module_1.UnaryOp.AbsF32, module.createTeeLocal(tempLocal0.index, arg0)), module.createF32(Infinity)), module.createI32(0), module.createBinary(module_1.BinaryOp.EqF32, module.createGetLocal(tempLocal0.index, module_1.NativeType.F32), module.createGetLocal(tempLocal0.index, module_1.NativeType.F32)));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createSelect(module.createBinary(module_1.BinaryOp.NeF64, module.createUnary(module_1.UnaryOp.AbsF64, module.createTeeLocal(tempLocal0.index, arg0)), module.createF64(Infinity)), module.createI32(0), module.createBinary(module_1.BinaryOp.EqF64, module.createGetLocal(tempLocal0.index, module_1.NativeType.F64), module.createGetLocal(tempLocal0.index, module_1.NativeType.F64)));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n default:// every other type is always finite\r\n ret = module.createI32(1);\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.bool;\r\n return ret;\r\n case \"clz\":// clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.ClzI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.ClzI64\r\n : module_1.UnaryOp.ClzI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.ClzI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"ctz\":// ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.CtzI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.CtzI64\r\n : module_1.UnaryOp.CtzI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.CtzI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"popcnt\":// popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createUnary(module_1.UnaryOp.PopcntI32, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.PopcntI64\r\n : module_1.UnaryOp.PopcntI32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createUnary(module_1.UnaryOp.PopcntI64, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n case 12 /* F64 */:\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"rotl\":// rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n ret = compiler_1.makeSmallIntegerWrap(module.createBinary(module_1.BinaryOp.RotlI32, arg0, arg1), compiler.currentType, module);\r\n // fall-through\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.RotlI64\r\n : module_1.BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"rotr\":// rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 10 /* BOOL */:\r\n ret = compiler_1.makeSmallIntegerWrap(module.createBinary(module_1.BinaryOp.RotrI32, arg0, arg1), compiler.currentType, module);\r\n break;\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n ret = module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.RotrI64\r\n : module_1.BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createBinary(module_1.BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"abs\":// abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n // doesn't need sign-extension here because ifFalse below is either positive\r\n // or MIN_VALUE (-MIN_VALUE == MIN_VALUE) if selected\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(module_1.BinaryOp.SubI32, // ifFalse\r\n module.createI32(0), module.createGetLocal(tempLocal0.index, module_1.NativeType.I32)), module.createBinary(module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createI32(0)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.SubI64\r\n : module_1.BinaryOp.SubI32, compiler.options.usizeType.toNativeZero(module), module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), compiler.options.usizeType.toNativeZero(module)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createBinary(module_1.BinaryOp.SubI64, module.createI64(0, 0), module.createGetLocal(tempLocal0.index, module_1.NativeType.I64)), module.createBinary(module_1.BinaryOp.GtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createI64(0, 0)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 8 /* U64 */:\r\n case 10 /* BOOL */:\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.AbsF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.AbsF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n ret = module.createUnreachable();\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"max\":// max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtU32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.GtU64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtI64\r\n : module_1.BinaryOp.GtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.GtU64\r\n : module_1.BinaryOp.GtU32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"min\":// min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n case 0 /* I8 */:\r\n case 1 /* I16 */:\r\n case 2 /* I32 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtI32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 5 /* U8 */:\r\n case 6 /* U16 */:\r\n case 7 /* U32 */:\r\n case 10 /* BOOL */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtU32, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32), module.createGetLocal(tempLocal1.index, module_1.NativeType.I32)));\r\n break;\r\n case 3 /* I64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtI64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(types_1.Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(module_1.BinaryOp.LtU64, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64), module.createGetLocal(tempLocal1.index, module_1.NativeType.I64)));\r\n break;\r\n case 4 /* ISIZE */:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.LtI64\r\n : module_1.BinaryOp.LtI32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(module.createTeeLocal(tempLocal0.index, arg0), module.createTeeLocal(tempLocal1.index, arg1), module.createBinary(compiler.options.isWasm64\r\n ? module_1.BinaryOp.LtU64\r\n : module_1.BinaryOp.LtU32, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType), module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)));\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n default:// void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"ceil\":// ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.CeilF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.CeilF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"floor\":// floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.FloorF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.FloorF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"copysign\":// copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n switch (compiler.currentType.kind) {\r\n // TODO: does an integer version make sense?\r\n case 11 /* F32 */:\r\n ret = module.createBinary(module_1.BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createBinary(module_1.BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n default:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"nearest\":// nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.NearestF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.NearestF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"reinterpret\":// reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n switch (typeArguments[0].kind) {\r\n case 2 /* I32 */:\r\n case 7 /* U32 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f32);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n case 9 /* USIZE */:\r\n if (typeArguments[0].isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n case 4 /* ISIZE */:\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.isWasm64\r\n ? types_1.Type.f64\r\n : types_1.Type.f32);\r\n ret = module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.ReinterpretF64\r\n : module_1.UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n case 11 /* F32 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.u32);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.u64);\r\n ret = module.createUnary(module_1.UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n default:// small integers and void\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n case \"sqrt\":// sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n // TODO: integer versions (that return f64 or convert)?\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.SqrtF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.SqrtF64, arg0);\r\n break;\r\n default:\r\n // case TypeKind.VOID:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"trunc\":// trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.f64, 0 /* NONE */);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case 9 /* USIZE */:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default:// any integer\r\n ret = arg0;\r\n break;\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n case 11 /* F32 */:\r\n ret = module.createUnary(module_1.UnaryOp.TruncF32, arg0);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createUnary(module_1.UnaryOp.TruncF64, arg0);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n // memory access\r\n case \"load\":// load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) {\r\n return module.createUnreachable();\r\n }\r\n return module.createLoad(typeArguments[0].byteSize, typeArguments[0].is(1 /* SIGNED */ | 4 /* INTEGER */), arg0, typeArguments[0].is(4 /* INTEGER */) &&\r\n contextualType.is(4 /* INTEGER */) &&\r\n contextualType.size >= typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(), offset);\r\n case \"store\":// store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = types_1.Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], typeArguments[0], typeArguments[0].is(4 /* INTEGER */)\r\n ? 0 /* NONE */\r\n : 1 /* IMPLICIT */);\r\n if (compiler.currentType.is(4 /* INTEGER */) &&\r\n typeArguments[0].is(4 /* INTEGER */) &&\r\n typeArguments[0].size > compiler.currentType.size) {\r\n arg1 = compiler.convertExpression(arg1, compiler.currentType, typeArguments[0], 1 /* IMPLICIT */, operands[1]);\r\n type = typeArguments[0];\r\n }\r\n else {\r\n type = compiler.currentType;\r\n }\r\n offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) {\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = types_1.Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n case \"sizeof\":// sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n ret = compiler.options.isWasm64\r\n ? module.createI64(typeArguments[0].byteSize, 0)\r\n : module.createI32(typeArguments[0].byteSize);\r\n }\r\n else {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", \"0\");\r\n return module.createUnreachable();\r\n }\r\n return ret;\r\n // control flow\r\n case \"select\":// select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], type = compiler.currentType);\r\n arg2 = compiler.compileExpression(operands[2], types_1.Type.bool);\r\n compiler.currentType = type;\r\n switch (compiler.currentType.kind) {\r\n default:// any value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n case \"unreachable\":// unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createUnreachable();\r\n // host operations\r\n case \"current_memory\":// current_memory() -> i32\r\n compiler.currentType = types_1.Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createHost(module_1.HostOp.CurrentMemory);\r\n case \"grow_memory\":// grow_memory(pages: i32) -> i32\r\n compiler.currentType = types_1.Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"0\", operands.length.toString(10));\r\n arg0 = module.createUnreachable();\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32);\r\n }\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n return module.createHost(module_1.HostOp.GrowMemory, null, [arg0]);\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"move_memory\":// move_memory(dest: usize, src: usize: n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], compiler.options.usizeType);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = types_1.Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n case \"set_memory\":// set_memory(dest: usize, value: u32, n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"3\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], types_1.Type.u32);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = types_1.Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n // other\r\n case \"changetype\":// changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length)\r\n compiler.currentType = typeArguments[0];\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\");\r\n return module.createUnreachable();\r\n }\r\n else if (typeArguments[0].kind != 9 /* USIZE */) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType, 0 /* NONE */);\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.kind != 9 /* USIZE */) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n case \"assert\":// assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_at_least_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n }\r\n else if (operands.length > 2) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"2\", operands.length.toString(10));\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length)\r\n compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_type_arguments_but_got_1, reportNode.range, \"1\", typeArguments.length.toString(10));\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n }\r\n else {\r\n arg0 = compiler.compileExpression(operands[0], types_1.Type.i32, 0 /* NONE */);\r\n }\r\n type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == types_1.Type.void) {\r\n compiler.currentType = types_1.Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n var abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n compiler.currentType = type.nonNullableType;\r\n if (contextualType == types_1.Type.void) {\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI32, arg0), abort);\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI64, arg0), abort);\r\n break;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n ret = module.createIf(module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.EqzI64\r\n : module_1.UnaryOp.EqzI32, arg0), abort);\r\n break;\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n case 11 /* F32 */:\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF32, arg0, module.createF32(0)), abort);\r\n break;\r\n case 12 /* F64 */:\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF64, arg0, module.createF64(0)), abort);\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = abort;\r\n break;\r\n }\r\n compiler.currentType = types_1.Type.void;\r\n }\r\n else {\r\n switch (compiler.currentType.kind) {\r\n default:// any integer up to 32-bits incl. bool\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i32);\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI32, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.I32));\r\n break;\r\n case 3 /* I64 */:\r\n case 8 /* U64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.i64);\r\n ret = module.createIf(module.createUnary(module_1.UnaryOp.EqzI64, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.I64));\r\n break;\r\n case 4 /* ISIZE */:\r\n case 9 /* USIZE */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createIf(module.createUnary(compiler.options.isWasm64\r\n ? module_1.UnaryOp.EqzI64\r\n : module_1.UnaryOp.EqzI32, module.createTeeLocal(tempLocal0.index, arg0)), abort, module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType));\r\n break;\r\n case 11 /* F32 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f32);\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF32, module.createTeeLocal(tempLocal0.index, arg0), module.createF32(0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.F32));\r\n break;\r\n case 12 /* F64 */:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(types_1.Type.f64);\r\n ret = module.createIf(module.createBinary(module_1.BinaryOp.EqF64, module.createTeeLocal(tempLocal0.index, arg0), module.createF64(0)), abort, module.createGetLocal(tempLocal0.index, module_1.NativeType.F64));\r\n break;\r\n case 13 /* VOID */:\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n return ret;\r\n // conversions\r\n case \"i8\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i8, 2 /* EXPLICIT */);\r\n case \"i16\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i16, 2 /* EXPLICIT */);\r\n case \"i32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i32, 2 /* EXPLICIT */);\r\n case \"i64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.i64, 2 /* EXPLICIT */);\r\n case \"isize\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = compiler.options.isWasm64\r\n ? types_1.Type.isize64\r\n : types_1.Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], compiler.options.isWasm64\r\n ? types_1.Type.isize64\r\n : types_1.Type.isize32, 2 /* EXPLICIT */);\r\n case \"u8\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u8, 2 /* EXPLICIT */);\r\n case \"u16\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u16, 2 /* EXPLICIT */);\r\n case \"u32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u32, 2 /* EXPLICIT */);\r\n case \"u64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.u64, 2 /* EXPLICIT */);\r\n case \"usize\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], compiler.options.usizeType, 2 /* EXPLICIT */);\r\n case \"bool\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.bool, 2 /* EXPLICIT */);\r\n case \"f32\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.f32, 2 /* EXPLICIT */);\r\n case \"f64\":\r\n if (typeArguments) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Type_0_is_not_generic, reportNode.range, prototype.internalName);\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Expected_0_arguments_but_got_1, reportNode.range, \"1\", operands.length.toString(10));\r\n compiler.currentType = types_1.Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], types_1.Type.f64, 2 /* EXPLICIT */);\r\n }\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, reportNode.range);\r\n return module.createUnreachable();\r\n}\r\nexports.compileCall = compileCall;\r\nfunction evaluateConstantOffset(compiler, expression) {\r\n var expr;\r\n var value;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, types_1.Type.i64);\r\n if (_BinaryenExpressionGetId(expr) != module_1.ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != module_1.NativeType.I64 ||\r\n _BinaryenConstGetValueI64High(expr) != 0 ||\r\n (value = _BinaryenConstGetValueI64Low(expr)) < 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n value = -1;\r\n }\r\n }\r\n else {\r\n expr = compiler.precomputeExpression(expression, types_1.Type.i32);\r\n if (_BinaryenExpressionGetId(expr) != module_1.ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != module_1.NativeType.I32 ||\r\n (value = _BinaryenConstGetValueI32(expr)) < 0) {\r\n compiler.error(diagnostics_1.DiagnosticCode.Operation_not_supported, expression.range);\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nfunction compileAllocate(compiler, cls, reportNode) {\r\n var program = cls.program;\r\n var prototype = program.elements.get(compiler.options.allocateImpl);\r\n if (prototype) {\r\n if (prototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = prototype.resolve(); // reports\r\n if (instance) {\r\n if (!instance.is(program_1.ElementFlags.GENERIC) &&\r\n instance.returnType == compiler.options.usizeType &&\r\n instance.parameters &&\r\n instance.parameters.length == 1 &&\r\n instance.parameters[0].type == compiler.options.usizeType) {\r\n if (compiler.compileFunction(instance)) {\r\n return compiler.makeCall(instance, [\r\n compiler.options.isWasm64\r\n ? compiler.module.createI64(cls.currentMemoryOffset)\r\n : compiler.module.createI32(cls.currentMemoryOffset)\r\n ]);\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Implementation_0_must_match_the_signature_1, reportNode.range, compiler.options.allocateImpl, \"(size: usize): usize\");\r\n }\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures, reportNode.range, prototype.internalName);\r\n }\r\n }\r\n else {\r\n program.error(diagnostics_1.DiagnosticCode.Cannot_find_name_0, reportNode.range, compiler.options.allocateImpl);\r\n }\r\n return compiler.module.createUnreachable();\r\n}\r\nexports.compileAllocate = compileAllocate;\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nfunction compileAbort(compiler, message, reportNode) {\r\n var module = compiler.module;\r\n var abort = module.createUnreachable();\r\n var abortPrototype = compiler.program.elements.get(\"abort\");\r\n var stringType = compiler.program.types.get(\"string\");\r\n if (abortPrototype &&\r\n abortPrototype.kind == program_1.ElementKind.FUNCTION_PROTOTYPE &&\r\n stringType) {\r\n var abortInstance = abortPrototype.resolve(); // reports\r\n if (abortInstance &&\r\n compiler.compileFunction(abortInstance) // reports\r\n ) {\r\n assert(abortInstance.parameters && abortInstance.parameters.length == 4); // to be sure\r\n abort = module.createBlock(null, [\r\n compiler.makeCall(abortInstance, [\r\n message != null\r\n ? compiler.compileExpression(message, stringType)\r\n : compiler.options.usizeType.toNativeZero(module),\r\n compiler.compileStaticString(reportNode.range.source.normalizedPath),\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ]),\r\n abort\r\n ]);\r\n }\r\n }\r\n return abort;\r\n}\r\nexports.compileAbort = compileAbort;\r\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {const Long = global.Long || __webpack_require__(18);\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n//////////////////////// Low-level C-Like Compiler API /////////////////////////\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar compiler_1 = __webpack_require__(4);\r\nvar decompiler_1 = __webpack_require__(20);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nexports.formatDiagnostic = diagnostics_1.formatDiagnosticMessage;\r\nvar parser_1 = __webpack_require__(21);\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nfunction parseFile(text, path, isEntry, parser) {\r\n if (isEntry === void 0) { isEntry = false; }\r\n if (parser === void 0) { parser = null; }\r\n if (!parser) {\r\n parser = new parser_1.Parser();\r\n isEntry = true;\r\n }\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\nexports.parseFile = parseFile;\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nfunction nextFile(parser) {\r\n return parser.nextFile();\r\n}\r\nexports.nextFile = nextFile;\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nfunction nextDiagnostic(parser) {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\nexports.nextDiagnostic = nextDiagnostic;\r\n/** Tests whether a diagnostic is informatory. */\r\nfunction isInfo(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.INFO;\r\n}\r\nexports.isInfo = isInfo;\r\n/** Tests whether a diagnostic is a warning. */\r\nfunction isWarning(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.WARNING;\r\n}\r\nexports.isWarning = isWarning;\r\n/** Tests whether a diagnostic is an error. */\r\nfunction isError(message) {\r\n return message.category == diagnostics_1.DiagnosticCategory.ERROR;\r\n}\r\nexports.isError = isError;\r\n/** Creates a new set of compiler options. */\r\nfunction createOptions() {\r\n return new compiler_1.Options();\r\n}\r\nexports.createOptions = createOptions;\r\n/** Sets the `target` option. */\r\nfunction setTarget(options, target) {\r\n options.target = target;\r\n}\r\nexports.setTarget = setTarget;\r\n/** Sets the `noTreeShaking` option. */\r\nfunction setNoTreeShaking(options, noTreeShaking) {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\nexports.setNoTreeShaking = setNoTreeShaking;\r\n/** Sets the `noAssert` option. */\r\nfunction setNoAssert(options, noAssert) {\r\n options.noAssert = noAssert;\r\n}\r\nexports.setNoAssert = setNoAssert;\r\n/** Sets the `noMemory` option. */\r\nfunction setNoMemory(options, noMemory) {\r\n options.noMemory = noMemory;\r\n}\r\nexports.setNoMemory = setNoMemory;\r\n/** Sets the `sourceMap` option. */\r\nfunction setSourceMap(options, sourceMap) {\r\n options.sourceMap = sourceMap;\r\n}\r\nexports.setSourceMap = setSourceMap;\r\n/** Sets the `memoryBase` option. */\r\nfunction setMemoryBase(options, memoryBase) {\r\n options.memoryBase = memoryBase;\r\n}\r\nexports.setMemoryBase = setMemoryBase;\r\n/** Compiles the sources computed by the parser to a module. */\r\nfunction compile(parser, options) {\r\n if (options === void 0) { options = null; }\r\n var program = parser.finish();\r\n var compiler = new compiler_1.Compiler(program, options);\r\n return compiler.compile();\r\n}\r\nexports.compile = compile;\r\n/** Decompiles a module to its (low level) source. */\r\nfunction decompile(module) {\r\n var decompiler = new decompiler_1.Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\nexports.decompile = decompile;\r\n/** Prefix indicating a library file. */\r\nvar program_1 = __webpack_require__(2);\r\nexports.LIBRARY_PREFIX = program_1.LIBRARY_PREFIX;\r\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar module_1 = __webpack_require__(0);\r\n// TODO :-)\r\nvar Decompiler = /** @class */ (function () {\r\n function Decompiler() {\r\n this.text = [];\r\n this.functionId = 0;\r\n }\r\n Decompiler.decompile = function (module) {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n };\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n Decompiler.prototype.decompile = function (module) {\r\n throw new Error(\"not implemented\");\r\n };\r\n Decompiler.prototype.decompileFunction = function (func) {\r\n var name = module_1.readString(_BinaryenFunctionGetName(func)) || \"$\" + this.functionId.toString(10);\r\n var body = _BinaryenFunctionGetBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (var i = 0, k = _BinaryenFunctionGetNumParams(func); i < k; ++i) {\r\n if (i > 0)\r\n this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetParam(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetResult(func)));\r\n this.push(\" \");\r\n if (_BinaryenExpressionGetId(body) != module_1.ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (_BinaryenExpressionGetId(body) != module_1.ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n };\r\n Decompiler.prototype.decompileExpression = function (expr) {\r\n var id = _BinaryenExpressionGetId(expr);\r\n var type = _BinaryenExpressionGetType(expr);\r\n var nested;\r\n var string;\r\n var i, k;\r\n switch (id) {\r\n case module_1.ExpressionId.Block:// TODO: magic\r\n if ((string = module_1.readString(_BinaryenBlockGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = _BinaryenBlockGetNumChildren(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(_BinaryenBlockGetChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n case module_1.ExpressionId.If:\r\n if (type == module_1.NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n if (nested = _BinaryenIfGetIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n }\r\n else {\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(_BinaryenIfGetIfFalse(expr));\r\n }\r\n return;\r\n case module_1.ExpressionId.Loop:\r\n if ((string = module_1.readString(_BinaryenLoopGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(_BinaryenLoopGetBody(expr));\r\n this.push(\"while (0);\\n\");\r\n case module_1.ExpressionId.Break:\r\n if (nested = _BinaryenBreakGetCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = module_1.readString(_BinaryenBreakGetName(expr))) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n }\r\n else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n case module_1.ExpressionId.Switch:\r\n case module_1.ExpressionId.Call:\r\n case module_1.ExpressionId.CallImport:\r\n case module_1.ExpressionId.CallIndirect:\r\n case module_1.ExpressionId.GetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenGetLocalGetIndex(expr).toString(10));\r\n return;\r\n case module_1.ExpressionId.SetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenSetLocalGetIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(_BinaryenSetLocalGetValue(expr));\r\n return;\r\n case module_1.ExpressionId.GetGlobal:\r\n case module_1.ExpressionId.SetGlobal:\r\n case module_1.ExpressionId.Load:\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenLoadGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenLoadGetPtr(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Store:\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenStoreGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenStoreGetPtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenStoreGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Const:\r\n switch (type) {\r\n case module_1.NativeType.I32:\r\n this.push(_BinaryenConstGetValueI32(expr).toString(10));\r\n return;\r\n case module_1.NativeType.I64:\r\n this.push(i64_to_string(i64_new(_BinaryenConstGetValueI64Low(expr), _BinaryenConstGetValueI64High(expr))));\r\n return;\r\n case module_1.NativeType.F32:\r\n this.push(_BinaryenConstGetValueF32(expr).toString(10));\r\n return;\r\n case module_1.NativeType.F64:\r\n this.push(_BinaryenConstGetValueF64(expr).toString(10));\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Unary:\r\n switch (_BinaryenUnaryGetOp(expr)) {\r\n case module_1.UnaryOp.ClzI32:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CtzI32:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.PopcntI32:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NegF32:\r\n case module_1.UnaryOp.NegF64:\r\n this.push(\"-\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.AbsF32:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CeilF32:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.FloorF32:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.TruncF32:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NearestF32:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.SqrtF32:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.EqzI32:\r\n case module_1.UnaryOp.EqzI64:\r\n this.push(\"!\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ClzI64:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CtzI64:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.PopcntI64:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.AbsF64:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.CeilF64:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.FloorF64:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.TruncF64:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.NearestF64:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.SqrtF64:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ExtendI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ExtendU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.WrapI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF32ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.TruncF64ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ReinterpretF32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ReinterpretF64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ConvertI32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertI64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ConvertU64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.PromoteF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.DemoteF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n case module_1.UnaryOp.ReinterpretI32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.UnaryOp.ReinterpretI64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Binary:// TODO: precedence\r\n switch (_BinaryenBinaryGetOp(expr)) {\r\n case module_1.BinaryOp.AddI32:\r\n case module_1.BinaryOp.AddI64:\r\n case module_1.BinaryOp.AddF32:\r\n case module_1.BinaryOp.AddF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.SubI32:\r\n case module_1.BinaryOp.SubI64:\r\n case module_1.BinaryOp.SubF32:\r\n case module_1.BinaryOp.SubF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.MulI32:\r\n case module_1.BinaryOp.MulI64:\r\n case module_1.BinaryOp.MulF32:\r\n case module_1.BinaryOp.MulF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivI32:\r\n case module_1.BinaryOp.DivI64:\r\n case module_1.BinaryOp.DivF32:\r\n case module_1.BinaryOp.DivF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RemI32:\r\n case module_1.BinaryOp.RemI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RemU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.AndI32:\r\n case module_1.BinaryOp.AndI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.OrI32:\r\n case module_1.BinaryOp.OrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.XorI32:\r\n case module_1.BinaryOp.XorI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShlI32:\r\n case module_1.BinaryOp.ShlI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShrU32:\r\n case module_1.BinaryOp.ShrU64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.ShrI32:\r\n case module_1.BinaryOp.ShrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RotlI32:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RotrI32:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.EqI32:\r\n case module_1.BinaryOp.EqI64:\r\n case module_1.BinaryOp.EqF32:\r\n case module_1.BinaryOp.EqF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.NeI32:\r\n case module_1.BinaryOp.NeI64:\r\n case module_1.BinaryOp.NeF32:\r\n case module_1.BinaryOp.NeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LtI32:\r\n case module_1.BinaryOp.LtI64:\r\n case module_1.BinaryOp.LtF32:\r\n case module_1.BinaryOp.LtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeI32:\r\n case module_1.BinaryOp.LeI64:\r\n case module_1.BinaryOp.LeF32:\r\n case module_1.BinaryOp.LeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtI32:\r\n case module_1.BinaryOp.GtI64:\r\n case module_1.BinaryOp.GtF32:\r\n case module_1.BinaryOp.GtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeI32:\r\n case module_1.BinaryOp.GeI64:\r\n case module_1.BinaryOp.GeF32:\r\n case module_1.BinaryOp.GeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.DivU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RemU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.RotlI64:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.RotrI64:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.LtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.LeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.GeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n case module_1.BinaryOp.CopysignF32:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MinF32:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MaxF32:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.CopysignF64:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MinF64:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.BinaryOp.MaxF64:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n return;\r\n case module_1.ExpressionId.Select:\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(_BinaryenSelectGetIfTrue(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetIfFalse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetCondition(expr));\r\n this.push(\")\");\r\n return;\r\n case module_1.ExpressionId.Drop:\r\n this.decompileExpression(_BinaryenDropGetValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n case module_1.ExpressionId.Return:\r\n if (nested = _BinaryenReturnGetValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n }\r\n else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n case module_1.ExpressionId.Host:\r\n switch (_BinaryenHostGetOp(expr)) {\r\n case module_1.HostOp.CurrentMemory:\r\n this.push(\"current_memory()\");\r\n return;\r\n case module_1.HostOp.GrowMemory:\r\n this.push(\"grow_memory(\");\r\n this.decompileExpression(_BinaryenHostGetOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n case module_1.ExpressionId.Nop:\r\n this.push(\";\\n\");\r\n return;\r\n case module_1.ExpressionId.Unreachable:\r\n this.push(\"unreachable()\");\r\n return;\r\n case module_1.ExpressionId.AtomicCmpxchg:\r\n case module_1.ExpressionId.AtomicRMW:\r\n case module_1.ExpressionId.AtomicWait:\r\n case module_1.ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n };\r\n Decompiler.prototype.push = function (text) {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n };\r\n Decompiler.prototype.finish = function () {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n };\r\n return Decompiler;\r\n}());\r\nexports.Decompiler = Decompiler;\r\nfunction nativeTypeToType(type) {\r\n switch (type) {\r\n case module_1.NativeType.None: return \"void\";\r\n case module_1.NativeType.I32: return \"i32\";\r\n case module_1.NativeType.I64: return \"i64\";\r\n case module_1.NativeType.F32: return \"f32\";\r\n case module_1.NativeType.F64: return \"f64\";\r\n case module_1.NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case module_1.NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\n/*\r\n\r\n This is a custom parser specifically written for the AssemblyScript subset. It accepts some of the\r\n most common TypeScript-only patterns that it knows an appropriate error message for but, though it\r\n uses TypeScript's codes for diagnostics, doesn't ultimately aim at full compatibility.\r\n\r\n*/\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar program_1 = __webpack_require__(2);\r\nvar tokenizer_1 = __webpack_require__(7);\r\nvar diagnostics_1 = __webpack_require__(1);\r\nvar path_1 = __webpack_require__(10);\r\nvar ast_1 = __webpack_require__(6);\r\n/** Parser interface. */\r\nvar Parser = /** @class */ (function (_super) {\r\n __extends(Parser, _super);\r\n /** Constructs a new parser. */\r\n function Parser() {\r\n var _this = _super.call(this) || this;\r\n /** Log of source file names to be requested. */\r\n _this.backlog = new Array();\r\n /** Log of source file names already processed. */\r\n _this.seenlog = new Set();\r\n _this.program = new program_1.Program(_this.diagnostics);\r\n return _this;\r\n }\r\n /** Parses a file and adds its definitions to the program. */\r\n Parser.prototype.parseFile = function (text, path, isEntry) {\r\n // check if already parsed\r\n var normalizedPath = path_1.normalize(path);\r\n for (var i = 0, k = this.program.sources.length; i < k; ++i) {\r\n if (this.program.sources[i].normalizedPath == normalizedPath)\r\n return;\r\n }\r\n this.seenlog.add(normalizedPath);\r\n // create the source element\r\n var source = new ast_1.Source(normalizedPath, text, isEntry\r\n ? ast_1.SourceKind.ENTRY\r\n : path.startsWith(program_1.LIBRARY_PREFIX) && path.indexOf(program_1.PATH_DELIMITER, program_1.LIBRARY_PREFIX.length) < 0\r\n ? ast_1.SourceKind.LIBRARY\r\n : ast_1.SourceKind.DEFAULT);\r\n this.program.sources.push(source);\r\n // tokenize and parse\r\n var tn = new tokenizer_1.Tokenizer(source, this.program.diagnostics);\r\n source.tokenizer = tn;\r\n while (!tn.skip(tokenizer_1.Token.ENDOFFILE)) {\r\n var statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n source.statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n };\r\n /** Parses a top-level statement. */\r\n Parser.prototype.parseTopLevelStatement = function (tn, isNamespaceMember) {\r\n if (isNamespaceMember === void 0) { isNamespaceMember = false; }\r\n // check decorators\r\n var decorators = null;\r\n while (tn.skip(tokenizer_1.Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator)\r\n break;\r\n if (!decorators)\r\n decorators = [];\r\n decorators.push(decorator);\r\n }\r\n // check modifiers\r\n var modifiers = null;\r\n if (tn.skip(tokenizer_1.Token.EXPORT)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.EXPORT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.DECLARE)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.DECLARE, tn.range()), modifiers);\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) {\r\n this.error(diagnostics_1.DiagnosticCode.Line_break_not_permitted_here, tn.range(tn.pos)); // recoverable, compatibility\r\n }\r\n }\r\n // remember where we took off\r\n tn.mark();\r\n // parse the statement\r\n var statement = null;\r\n var modifier;\r\n // handle declarations\r\n switch (tn.next()) {\r\n case tokenizer_1.Token.CONST:\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.CONST, tn.range()), modifiers);\r\n if (tn.skip(tokenizer_1.Token.ENUM)) {\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n break;\r\n }\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.LET:\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.LET, tn.range()), modifiers);\r\n // fall-through\r\n case tokenizer_1.Token.VAR:\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.ENUM:\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.FUNCTION:\r\n statement = this.parseFunction(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.ABSTRACT:\r\n if (!tn.skip(tokenizer_1.Token.CLASS)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"class\");\r\n break;\r\n }\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n // fall through\r\n case tokenizer_1.Token.CLASS:\r\n statement = this.parseClass(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.NAMESPACE:\r\n statement = this.parseNamespace(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n case tokenizer_1.Token.IMPORT:\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.EXPORT, modifiers)) {\r\n statement = this.parseExportImport(tn, modifier.range);\r\n }\r\n else {\r\n statement = this.parseImport(tn);\r\n }\r\n if (modifiers)\r\n ast_1.setReusableModifiers(modifiers);\r\n break;\r\n case tokenizer_1.Token.TYPE:\r\n statement = this.parseTypeDeclaration(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n default:\r\n // handle plain exports\r\n if (ast_1.hasModifier(ast_1.ModifierKind.EXPORT, modifiers)) {\r\n tn.reset();\r\n statement = this.parseExport(tn, modifiers); // TODO: why exactly does this have modifiers again? 'declare'?\r\n // handle non-declaration statements\r\n }\r\n else {\r\n if (modifiers) {\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.DECLARE, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"declare\"); // recoverable\r\n }\r\n ast_1.setReusableModifiers(modifiers);\r\n }\r\n tn.reset();\r\n if (!isNamespaceMember) {\r\n statement = this.parseStatement(tn, true);\r\n }\r\n }\r\n break;\r\n }\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(diagnostics_1.DiagnosticCode.Decorators_are_not_valid_here, decorators[i].range);\r\n }\r\n }\r\n return statement;\r\n };\r\n /** Obtains the next file to parse. */\r\n Parser.prototype.nextFile = function () {\r\n return this.backlog.length ? this.backlog.shift() : null;\r\n };\r\n /** Finishes parsing and returns the program. */\r\n Parser.prototype.finish = function () {\r\n if (this.backlog.length)\r\n throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n return this.program;\r\n };\r\n /** Parses a type. */\r\n Parser.prototype.parseType = function (tn, acceptParenthesized, suppressErrors) {\r\n if (acceptParenthesized === void 0) { acceptParenthesized = true; }\r\n if (suppressErrors === void 0) { suppressErrors = false; }\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n // void\r\n if (token == tokenizer_1.Token.VOID) {\r\n return ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n }\r\n var type;\r\n // ( ... )\r\n if (acceptParenthesized && token == tokenizer_1.Token.OPENPAREN) {\r\n var innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"}\");\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n // this\r\n }\r\n else if (token == tokenizer_1.Token.THIS) {\r\n type = ast_1.Node.createType(ast_1.Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // true\r\n }\r\n else if (token == tokenizer_1.Token.TRUE || token == tokenizer_1.Token.FALSE) {\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // string literal\r\n }\r\n else if (token == tokenizer_1.Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos));\r\n // Name\r\n }\r\n else if (token == tokenizer_1.Token.IDENTIFIER) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var parameters = new Array();\r\n var nullable = false;\r\n // Name\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n do {\r\n var parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter)\r\n return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \">\");\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n if (tn.skip(tokenizer_1.Token.BAR)) {\r\n if (tn.skip(tokenizer_1.Token.NULL)) {\r\n nullable = true;\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"null\");\r\n }\r\n return null;\r\n }\r\n }\r\n type = ast_1.Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(tokenizer_1.Token.OPENBRACKET)) {\r\n var bracketStart = tn.tokenPos;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n }\r\n return null;\r\n }\r\n var bracketRange = tn.range(bracketStart, tn.pos);\r\n // ...[] | null\r\n nullable = false;\r\n if (tn.skip(tokenizer_1.Token.BAR)) {\r\n if (tn.skip(tokenizer_1.Token.NULL)) {\r\n nullable = true;\r\n }\r\n else {\r\n if (!suppressErrors) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"null\");\r\n }\r\n return null;\r\n }\r\n }\r\n type = ast_1.Node.createType(ast_1.Node.createIdentifierExpression(\"Array\", bracketRange), [type], nullable, tn.range(startPos, tn.pos));\r\n if (nullable)\r\n break;\r\n }\r\n return type;\r\n };\r\n // statements\r\n Parser.prototype.parseDecorator = function (tn) {\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var name = tn.readIdentifier();\r\n var expression = ast_1.Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(tokenizer_1.Token.DOT)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n name = tn.readIdentifier();\r\n expression = ast_1.Node.createPropertyAccessExpression(expression, ast_1.Node.createIdentifierExpression(name, tn.range()), tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n var args;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return ast_1.Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n }\r\n else {\r\n return ast_1.Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseVariable = function (tn, modifiers, decorators) {\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n var members = new Array();\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseVariableDeclaration(tn, isDeclare, modifiers, decorators);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n var ret = ast_1.Node.createVariableStatement(members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseVariableDeclaration = function (tn, isDeclare, parentModifiers, parentDecorators) {\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n if (isDeclare === void 0) { isDeclare = false; }\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!initializer)\r\n return null;\r\n }\r\n else {\r\n if (ast_1.hasModifier(ast_1.ModifierKind.CONST, parentModifiers)) {\r\n if (!ast_1.hasModifier(ast_1.ModifierKind.DECLARE, parentModifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._const_declarations_must_be_initialized, identifier.range);\r\n }\r\n }\r\n else if (!type) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range(tn.pos)); // recoverable\r\n }\r\n }\r\n return ast_1.Node.createVariableDeclaration(identifier, type, initializer, parentModifiers, parentDecorators, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n };\r\n Parser.prototype.parseEnum = function (tn, modifiers, decorators) {\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.next() != tokenizer_1.Token.IDENTIFIER) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != tokenizer_1.Token.OPENBRACE) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseEnumValue(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n var ret = ast_1.Node.createEnumDeclaration(identifier, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseEnumValue = function (tn) {\r\n // before: Identifier ('=' Expression)?\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n value = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!value)\r\n return null;\r\n }\r\n return ast_1.Node.createEnumValueDeclaration(identifier, value, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n };\r\n Parser.prototype.parseReturn = function (tn) {\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n var expr = null;\r\n if (tn.peek(true) != tokenizer_1.Token.SEMICOLON &&\r\n tn.nextToken != tokenizer_1.Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine) {\r\n if (!(expr = this.parseExpression(tn)))\r\n return null;\r\n }\r\n var ret = ast_1.Node.createReturnStatement(expr, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseTypeParameters = function (tn) {\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n var typeParameters = new Array();\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n do {\r\n var typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter)\r\n return null;\r\n typeParameters.push(typeParameter);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \">\");\r\n return null;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_parameter_list_cannot_be_empty, tn.range()); // recoverable\r\n }\r\n return typeParameters;\r\n };\r\n Parser.prototype.parseTypeParameter = function (tn) {\r\n // before: Identifier ('extends' Type)?\r\n if (tn.next() == tokenizer_1.Token.IDENTIFIER) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var extendsType = null;\r\n if (tn.skip(tokenizer_1.Token.EXTENDS)) {\r\n if (!(extendsType = this.parseType(tn)))\r\n return null;\r\n }\r\n return ast_1.Node.createTypeParameter(identifier, extendsType, tokenizer_1.Range.join(identifier.range, tn.range()));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseParameters = function (tn) {\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n var parameters = new Array();\r\n var seenRest = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n if (tn.peek() != tokenizer_1.Token.CLOSEPAREN) {\r\n do {\r\n var param = this.parseParameter(tn);\r\n if (!param)\r\n return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list, seenRest.name.range);\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n default:\r\n if (seenOptional) {\r\n this.error(diagnostics_1.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter, param.name.range);\r\n }\r\n break;\r\n case ast_1.ParameterKind.OPTIONAL:\r\n seenOptional = true;\r\n break;\r\n case ast_1.ParameterKind.REST:\r\n seenRest = param;\r\n break;\r\n }\r\n parameters.push(param);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n }\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n return parameters;\r\n };\r\n Parser.prototype.parseParameter = function (tn) {\r\n // before: '...'? Identifier '?'? (':' Type)? ('=' Expression)?\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange = null;\r\n if (tn.skip(tokenizer_1.Token.DOT_DOT_DOT)) {\r\n isRest = true;\r\n startRange = tn.range();\r\n }\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n if (!isRest)\r\n startRange = tn.range();\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type = null;\r\n if (isOptional = tn.skip(tokenizer_1.Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_cannot_be_optional, identifier.range);\r\n }\r\n }\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(diagnostics_1.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer, identifier.range);\r\n }\r\n if (isOptional) {\r\n this.error(diagnostics_1.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer, identifier.range);\r\n }\r\n else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!initializer)\r\n return null;\r\n }\r\n return ast_1.Node.createParameter(identifier, type, initializer, isRest\r\n ? ast_1.ParameterKind.REST\r\n : isOptional\r\n ? ast_1.ParameterKind.OPTIONAL\r\n : ast_1.ParameterKind.DEFAULT, tokenizer_1.Range.join(startRange, tn.range()));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseFunction = function (tn, modifiers, decorators) {\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range(tn.pos));\r\n return null;\r\n }\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters = null;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n if (!tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(tn.pos), \"(\");\r\n return null;\r\n }\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters)\r\n return null;\r\n var isSetter = ast_1.hasModifier(ast_1.ModifierKind.SET, modifiers);\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter, identifier.range); // recoverable\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer, identifier.range); // recoverable\r\n }\r\n }\r\n var isGetter = ast_1.hasModifier(ast_1.ModifierKind.GET, modifiers);\r\n if (isGetter && parameters.length) {\r\n this.error(diagnostics_1.DiagnosticCode.A_get_accessor_cannot_have_parameters, identifier.range); // recoverable\r\n }\r\n var returnType = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n returnType = this.parseType(tn, isSetter);\r\n if (!returnType)\r\n return null;\r\n }\r\n else if (!isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range(tn.pos)); // recoverable\r\n }\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n var statements = null;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n statements = new Array();\r\n if (isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n }\r\n else if (!isDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, tn.range(tn.pos));\r\n }\r\n var ret = ast_1.Node.createFunctionDeclaration(identifier, typeParameters, parameters, returnType, statements, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseClass = function (tn, modifiers, decorators) {\r\n // at 'class':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n var startPos = decorators && decorators.length\r\n ? decorators[0].range.start\r\n : modifiers && modifiers.length\r\n ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n var extendsType = null;\r\n if (tn.skip(tokenizer_1.Token.EXTENDS)) {\r\n extendsType = this.parseType(tn);\r\n if (!extendsType)\r\n return null;\r\n }\r\n var implementsTypes = new Array();\r\n if (tn.skip(tokenizer_1.Token.IMPLEMENTS)) {\r\n do {\r\n var type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n implementsTypes.push(type);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n }\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var isDeclare = ast_1.hasModifier(ast_1.ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseClassMember(tn, isDeclare);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (!tn.skip(tokenizer_1.Token.CLOSEBRACE));\r\n }\r\n return ast_1.Node.createClassDeclaration(identifier, typeParameters, extendsType, implementsTypes, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseClassMember = function (tn, parentIsDeclare) {\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n var startPos = tn.pos;\r\n var decorators = new Array();\r\n while (tn.skip(tokenizer_1.Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator)\r\n break;\r\n decorators.push(decorator);\r\n }\r\n var modifiers = null;\r\n if (tn.skip(tokenizer_1.Token.PUBLIC)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PUBLIC, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.PRIVATE)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PRIVATE, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.PROTECTED)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.PROTECTED, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.STATIC)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.STATIC, tn.range()), modifiers);\r\n }\r\n else if (tn.skip(tokenizer_1.Token.ABSTRACT)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(tokenizer_1.Token.READONLY)) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.READONLY, tn.range()), modifiers);\r\n }\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n tn.mark();\r\n var isGetter = false;\r\n var isSetter = false;\r\n if (isGetter = tn.skip(tokenizer_1.Token.GET)) {\r\n if (tn.peek(true, true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.GET, tn.range()), modifiers);\r\n }\r\n else {\r\n tn.reset();\r\n isGetter = false;\r\n }\r\n }\r\n else if (isSetter = tn.skip(tokenizer_1.Token.SET)) {\r\n if (tn.peek(true, true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = ast_1.addModifier(ast_1.Node.createModifier(ast_1.ModifierKind.SET, tn.range()), modifiers);\r\n }\r\n else {\r\n tn.reset();\r\n isSetter = false;\r\n }\r\n }\r\n var isConstructor = tn.skip(tokenizer_1.Token.CONSTRUCTOR);\r\n if (isConstructor || tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = isConstructor\r\n ? ast_1.Node.createConstructorExpression(tn.range())\r\n : ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var typeParameters;\r\n if (tn.skip(tokenizer_1.Token.LESSTHAN)) {\r\n if (isConstructor) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration, tn.range()); // recoverable\r\n }\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters)\r\n return null;\r\n }\r\n else {\r\n typeParameters = [];\r\n }\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters)\r\n return null;\r\n if (isGetter && parameters.length) {\r\n this.error(diagnostics_1.DiagnosticCode.A_get_accessor_cannot_have_parameters, identifier.range);\r\n }\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter, identifier.range);\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer, identifier.range);\r\n }\r\n }\r\n var returnType = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n if (identifier.kind == ast_1.NodeKind.CONSTRUCTOR) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration, tn.range());\r\n }\r\n else if (isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation, tn.range());\r\n }\r\n returnType = this.parseType(tn, identifier.kind == ast_1.NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType)\r\n return null;\r\n }\r\n else if (!isSetter && identifier.kind != ast_1.NodeKind.CONSTRUCTOR) {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range()); // recoverable\r\n }\r\n var statements = null;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n if (parentIsDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts, tn.range()); // recoverable\r\n }\r\n statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n }\r\n else if (!parentIsDeclare) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, tn.range()); // recoverable\r\n }\r\n var retMethod = ast_1.Node.createMethodDeclaration(identifier, typeParameters, parameters, returnType, statements, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return retMethod;\r\n }\r\n else if (isConstructor) {\r\n this.error(diagnostics_1.DiagnosticCode.Constructor_implementation_is_missing, identifier.range);\r\n }\r\n else if (isGetter || isSetter) {\r\n this.error(diagnostics_1.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration, identifier.range);\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n }\r\n else {\r\n var modifier;\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.ABSTRACT, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"abstract\"); // recoverable\r\n }\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.GET, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"get\"); // recoverable\r\n }\r\n if (modifier = ast_1.getModifier(ast_1.ModifierKind.SET, modifiers)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_modifier_cannot_be_used_here, modifier.range, \"set\"); // recoverable\r\n }\r\n var type = null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Type_expected, tn.range()); // recoverable\r\n }\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer)\r\n return null;\r\n }\r\n var retField = ast_1.Node.createFieldDeclaration(identifier, type, initializer, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return retField;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseNamespace = function (tn, modifiers, decorators) {\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var member = this.parseTopLevelStatement(tn, true);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n }\r\n var ret = ast_1.Node.createNamespaceDeclaration(identifier, members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExport = function (tn, modifiers) {\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseExportMember(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n var path = null;\r\n if (tn.skip(tokenizer_1.Token.FROM)) {\r\n if (tn.skip(tokenizer_1.Token.STRINGLITERAL)) {\r\n path = ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n var ret = ast_1.Node.createExportStatement(members, path, modifiers, tn.range(startPos, tn.pos));\r\n if (ret.normalizedPath && !this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExportMember = function (tn) {\r\n // before: Identifier ('as' Identifier)?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier = null;\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createExportMember(identifier, asIdentifier, asIdentifier\r\n ? tokenizer_1.Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseImport = function (tn) {\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n var startPos = tn.tokenPos;\r\n var members = null;\r\n var namespaceName = null;\r\n var skipFrom = false;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n members = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseImportDeclaration(tn);\r\n if (!member)\r\n return null;\r\n members.push(member);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"}\");\r\n return null;\r\n }\r\n }\r\n }\r\n else if (tn.skip(tokenizer_1.Token.ASTERISK)) {\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n namespaceName = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"as\");\r\n return null;\r\n }\r\n }\r\n else {\r\n skipFrom = true;\r\n }\r\n if (skipFrom || tn.skip(tokenizer_1.Token.FROM)) {\r\n if (tn.skip(tokenizer_1.Token.STRINGLITERAL)) {\r\n var path = ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n var ret;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = ast_1.Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n ret = ast_1.Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n if (!this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.String_literal_expected, tn.range());\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"from\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseImportDeclaration = function (tn) {\r\n // before: Identifier ('as' Identifier)?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier = null;\r\n if (tn.skip(tokenizer_1.Token.AS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createImportDeclaration(identifier, asIdentifier, asIdentifier\r\n ? tokenizer_1.Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range);\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExportImport = function (tn, startRange) {\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var asIdentifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var ret = ast_1.Node.createExportImportStatement(identifier, asIdentifier, tokenizer_1.Range.join(startRange, tn.range()));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"=\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseStatement = function (tn, topLevel) {\r\n // at previous token\r\n if (topLevel === void 0) { topLevel = false; }\r\n tn.mark();\r\n var token = tn.next();\r\n switch (token) {\r\n case tokenizer_1.Token.BREAK:\r\n return this.parseBreak(tn);\r\n case tokenizer_1.Token.CONST:\r\n return this.parseVariable(tn, [\r\n ast_1.Node.createModifier(ast_1.ModifierKind.CONST, tn.range())\r\n ], null);\r\n case tokenizer_1.Token.CONTINUE:\r\n return this.parseContinue(tn);\r\n case tokenizer_1.Token.DO:\r\n return this.parseDoStatement(tn);\r\n case tokenizer_1.Token.FOR:\r\n return this.parseForStatement(tn);\r\n case tokenizer_1.Token.IF:\r\n return this.parseIfStatement(tn);\r\n case tokenizer_1.Token.LET:\r\n return this.parseVariable(tn, [\r\n ast_1.Node.createModifier(ast_1.ModifierKind.LET, tn.range())\r\n ], null);\r\n case tokenizer_1.Token.VAR:\r\n return this.parseVariable(tn, null, null);\r\n case tokenizer_1.Token.OPENBRACE:\r\n return this.parseBlockStatement(tn, topLevel);\r\n case tokenizer_1.Token.RETURN:\r\n if (topLevel) {\r\n this.error(diagnostics_1.DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body, tn.range()); // recoverable\r\n }\r\n return this.parseReturn(tn);\r\n case tokenizer_1.Token.SEMICOLON:\r\n return ast_1.Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n case tokenizer_1.Token.SWITCH:\r\n return this.parseSwitchStatement(tn);\r\n case tokenizer_1.Token.THROW:\r\n return this.parseThrowStatement(tn);\r\n case tokenizer_1.Token.TRY:\r\n return this.parseTryStatement(tn);\r\n case tokenizer_1.Token.TYPE:\r\n return this.parseTypeDeclaration(tn, null);\r\n case tokenizer_1.Token.WHILE:\r\n return this.parseWhileStatement(tn);\r\n default:\r\n tn.reset();\r\n return this.parseExpressionStatement(tn);\r\n }\r\n };\r\n Parser.prototype.parseBlockStatement = function (tn, topLevel) {\r\n // at '{': Statement* '}' ';'?\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn, topLevel);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n var ret = ast_1.Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseBreak = function (tn) {\r\n // at 'break': Identifier? ';'?\r\n var identifier = null;\r\n if (tn.peek(true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = ast_1.Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseContinue = function (tn) {\r\n // at 'continue': Identifier? ';'?\r\n var identifier = null;\r\n if (tn.peek(true) == tokenizer_1.Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = ast_1.Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseDoStatement = function (tn) {\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.WHILE)) {\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var ret = ast_1.Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"while\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseExpressionStatement = function (tn) {\r\n // at previous token\r\n var expr = this.parseExpression(tn);\r\n if (!expr)\r\n return null;\r\n var ret = ast_1.Node.createExpressionStatement(expr);\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseForStatement = function (tn) {\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var initializer = null;\r\n if (tn.skip(tokenizer_1.Token.LET) || tn.skip(tokenizer_1.Token.CONST) || tn.skip(tokenizer_1.Token.VAR)) {\r\n initializer = this.parseVariable(tn, null, null);\r\n }\r\n else if (!tn.skip(tokenizer_1.Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer)\r\n return null;\r\n }\r\n if (tn.token == tokenizer_1.Token.SEMICOLON) {\r\n var condition = null;\r\n if (!tn.skip(tokenizer_1.Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition)\r\n return null;\r\n }\r\n if (tn.token == tokenizer_1.Token.SEMICOLON) {\r\n var incrementor = null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n }\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n return ast_1.Node.createForStatement(initializer, condition\r\n ? condition.expression\r\n : null, incrementor, statement, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \";\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \";\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseIfStatement = function (tn) {\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n var elseStatement = null;\r\n if (tn.skip(tokenizer_1.Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement)\r\n return null;\r\n }\r\n return ast_1.Node.createIfStatement(condition, statement, elseStatement, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseSwitchStatement = function (tn) {\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var cases = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n var case_ = this.parseSwitchCase(tn);\r\n if (!case_)\r\n return null;\r\n cases.push(case_);\r\n }\r\n var ret = ast_1.Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseSwitchCase = function (tn) {\r\n var startPos = tn.tokenPos;\r\n var statements, statement;\r\n // 'case' Expression ':' Statement*\r\n if (tn.skip(tokenizer_1.Token.CASE)) {\r\n var label = this.parseExpression(tn);\r\n if (!label)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != tokenizer_1.Token.CASE && tn.nextToken != tokenizer_1.Token.DEFAULT && tn.nextToken != tokenizer_1.Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n return ast_1.Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n }\r\n // 'default' ':' Statement*\r\n }\r\n else if (tn.skip(tokenizer_1.Token.DEFAULT)) {\r\n if (tn.skip(tokenizer_1.Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != tokenizer_1.Token.CASE && tn.nextToken != tokenizer_1.Token.DEFAULT && tn.nextToken != tokenizer_1.Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n statements.push(statement);\r\n }\r\n return ast_1.Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._case_or_default_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseThrowStatement = function (tn) {\r\n // at 'throw': Expression ';'?\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression)\r\n return null;\r\n var ret = ast_1.Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n };\r\n Parser.prototype.parseTryStatement = function (tn) {\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n var startPos = tn.tokenPos;\r\n var stmt;\r\n if (tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n var statements = new Array();\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n statements.push(stmt);\r\n }\r\n var catchVariable = null;\r\n var catchStatements = null;\r\n var finallyStatements = null;\r\n if (tn.skip(tokenizer_1.Token.CATCH)) {\r\n if (!tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n return null;\r\n }\r\n if (!tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n return null;\r\n }\r\n catchVariable = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n if (!tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(tokenizer_1.Token.FINALLY)) {\r\n if (!tn.skip(tokenizer_1.Token.OPENBRACE)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(tokenizer_1.Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt)\r\n return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"catch\");\r\n return null;\r\n }\r\n var ret = ast_1.Node.createTryStatement(statements, catchVariable, catchStatements, finallyStatements, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"{\");\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseTypeDeclaration = function (tn, modifiers, decorators) {\r\n // at 'type': Identifier '=' Type ';'?\r\n if (modifiers === void 0) { modifiers = null; }\r\n if (decorators === void 0) { decorators = null; }\r\n var startPos = decorators && decorators.length ? decorators[0].range.start\r\n : modifiers && modifiers.length ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.IDENTIFIER)) {\r\n var name = ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(tokenizer_1.Token.EQUALS)) {\r\n var type = this.parseType(tn);\r\n if (!type)\r\n return null;\r\n var ret = ast_1.Node.createTypeDeclaration(name, type, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"=\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, tn.range());\r\n }\r\n return null;\r\n };\r\n Parser.prototype.parseWhileStatement = function (tn) {\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var expression = this.parseExpression(tn);\r\n if (!expression)\r\n return null;\r\n if (tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement)\r\n return null;\r\n var ret = ast_1.Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(tokenizer_1.Token.SEMICOLON);\r\n return ret;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n }\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"(\");\r\n }\r\n return null;\r\n };\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n Parser.prototype.parseExpressionStart = function (tn) {\r\n var token = tn.next(true);\r\n var startPos = tn.tokenPos;\r\n var expr = null;\r\n if (token == tokenizer_1.Token.NULL) {\r\n return ast_1.Node.createNullExpression(tn.range());\r\n }\r\n if (token == tokenizer_1.Token.TRUE) {\r\n return ast_1.Node.createTrueExpression(tn.range());\r\n }\r\n if (token == tokenizer_1.Token.FALSE) {\r\n return ast_1.Node.createFalseExpression(tn.range());\r\n }\r\n var p = determinePrecedenceStart(token);\r\n if (p != -1 /* INVALID */) {\r\n var operand;\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n // NewExpression\r\n if (token == tokenizer_1.Token.NEW) {\r\n operand = this.parseExpression(tn, 18 /* CALL */);\r\n if (!operand)\r\n return null;\r\n if (operand.kind == ast_1.NodeKind.CALL) {\r\n return ast_1.Node.createNewExpression(operand.expression, operand.typeArguments, operand.arguments, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Operation_not_supported, tn.range());\r\n }\r\n return null;\r\n }\r\n else {\r\n operand = this.parseExpression(tn, p);\r\n if (!operand)\r\n return null;\r\n }\r\n // UnaryPrefixExpression\r\n if (token == tokenizer_1.Token.PLUS_PLUS || token == tokenizer_1.Token.MINUS_MINUS) {\r\n if (operand.kind != ast_1.NodeKind.IDENTIFIER &&\r\n operand.kind != ast_1.NodeKind.ELEMENTACCESS &&\r\n operand.kind != ast_1.NodeKind.PROPERTYACCESS) {\r\n this.error(diagnostics_1.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, operand.range);\r\n }\r\n }\r\n return ast_1.Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n switch (token) {\r\n // ParenthesizedExpression\r\n case tokenizer_1.Token.OPENPAREN:\r\n expr = this.parseExpression(tn);\r\n if (!expr)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n return ast_1.Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n // ArrayLiteralExpression\r\n case tokenizer_1.Token.OPENBRACKET:\r\n var elementExpressions = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n do {\r\n if (tn.peek() == tokenizer_1.Token.COMMA) {\r\n expr = null; // omitted\r\n }\r\n else {\r\n expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (tn.peek() == tokenizer_1.Token.CLOSEBRACKET)\r\n break;\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n return null;\r\n }\r\n }\r\n return ast_1.Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n // AssertionExpression (unary prefix)\r\n case tokenizer_1.Token.LESSTHAN:\r\n var toType = this.parseType(tn);\r\n if (!toType)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.GREATERTHAN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \">\");\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, 18 /* CALL */);\r\n if (!expr)\r\n return null;\r\n return ast_1.Node.createAssertionExpression(0 /* PREFIX */, expr, toType, tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.IDENTIFIER:\r\n return ast_1.Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.THIS:\r\n return ast_1.Node.createThisExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.CONSTRUCTOR:\r\n return ast_1.Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.SUPER:\r\n return ast_1.Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.STRINGLITERAL:\r\n return ast_1.Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.INTEGERLITERAL:\r\n return ast_1.Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n case tokenizer_1.Token.FLOATLITERAL:\r\n return ast_1.Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case tokenizer_1.Token.SLASH:\r\n var regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(tokenizer_1.Token.SLASH)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"/\");\r\n return null;\r\n }\r\n return ast_1.Node.createRegexpLiteralExpression(regexpPattern, tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos));\r\n default:\r\n this.error(diagnostics_1.DiagnosticCode.Expression_expected, tn.range());\r\n return null;\r\n }\r\n };\r\n Parser.prototype.tryParseTypeArgumentsBeforeArguments = function (tn) {\r\n // at '<': Type (',' Type)* '>' '('\r\n tn.mark();\r\n if (!tn.skip(tokenizer_1.Token.LESSTHAN))\r\n return null;\r\n var typeArguments = new Array();\r\n do {\r\n var type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset();\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (tn.skip(tokenizer_1.Token.GREATERTHAN) && tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset();\r\n return null;\r\n };\r\n Parser.prototype.parseArguments = function (tn) {\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n var args = new Array();\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n do {\r\n var expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n args.push(expr);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n if (!tn.skip(tokenizer_1.Token.CLOSEPAREN)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \")\");\r\n return null;\r\n }\r\n }\r\n return args;\r\n };\r\n Parser.prototype.parseExpression = function (tn, precedence) {\r\n if (precedence === void 0) { precedence = 0; }\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr)\r\n return null;\r\n var startPos = expr.range.start;\r\n // CallExpression\r\n var typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn); // skips '(' on success\r\n // there might be better ways to distinguish a LESSTHAN from a CALL with type arguments\r\n if (typeArguments || tn.skip(tokenizer_1.Token.OPENPAREN)) {\r\n var args = this.parseArguments(tn);\r\n if (!args)\r\n return null;\r\n expr = ast_1.Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos));\r\n }\r\n var token;\r\n var next = null;\r\n var nextPrecedence;\r\n while ((nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence) {\r\n tn.next();\r\n switch (token) {\r\n // AssertionExpression\r\n case tokenizer_1.Token.AS:\r\n var toType = this.parseType(tn);\r\n if (!toType)\r\n return null;\r\n expr = ast_1.Node.createAssertionExpression(1 /* AS */, expr, toType, tn.range(startPos, tn.pos));\r\n break;\r\n // ElementAccessExpression\r\n case tokenizer_1.Token.OPENBRACKET:\r\n next = this.parseExpression(tn);\r\n if (!next)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.CLOSEBRACKET)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \"]\");\r\n return null;\r\n }\r\n expr = ast_1.Node.createElementAccessExpression(expr, next, tn.range(startPos, tn.pos));\r\n break;\r\n // UnaryPostfixExpression\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n if (expr.kind != ast_1.NodeKind.IDENTIFIER &&\r\n expr.kind != ast_1.NodeKind.ELEMENTACCESS &&\r\n expr.kind != ast_1.NodeKind.PROPERTYACCESS) {\r\n this.error(diagnostics_1.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, expr.range);\r\n }\r\n expr = ast_1.Node.createUnaryPostfixExpression(token, expr, tn.range(startPos, tn.pos));\r\n break;\r\n // TernaryExpression\r\n case tokenizer_1.Token.QUESTION:\r\n var ifThen = this.parseExpression(tn);\r\n if (!ifThen)\r\n return null;\r\n if (!tn.skip(tokenizer_1.Token.COLON)) {\r\n this.error(diagnostics_1.DiagnosticCode._0_expected, tn.range(), \":\");\r\n return null;\r\n }\r\n var ifElse = this.parseExpression(tn);\r\n if (!ifElse)\r\n return null;\r\n expr = ast_1.Node.createTernaryExpression(expr, ifThen, ifElse, tn.range(startPos, tn.pos));\r\n break;\r\n // CommaExpression\r\n case tokenizer_1.Token.COMMA:\r\n var commaExprs = [expr];\r\n do {\r\n expr = this.parseExpression(tn, 0 /* COMMA */ + 1);\r\n if (!expr)\r\n return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(tokenizer_1.Token.COMMA));\r\n expr = ast_1.Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n default:\r\n next = this.parseExpression(tn, isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1);\r\n if (!next)\r\n return null;\r\n // PropertyAccessExpression\r\n if (token == tokenizer_1.Token.DOT) {\r\n if (next.kind == ast_1.NodeKind.IDENTIFIER) {\r\n expr = ast_1.Node.createPropertyAccessExpression(expr, next, tn.range(startPos, tn.pos));\r\n }\r\n else if (next.kind == ast_1.NodeKind.CALL) {\r\n var propertyCall = next;\r\n if (propertyCall.expression.kind == ast_1.NodeKind.IDENTIFIER) {\r\n propertyCall.expression = ast_1.Node.createPropertyAccessExpression(expr, propertyCall.expression, tn.range(startPos, tn.pos));\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, propertyCall.expression.range);\r\n return null;\r\n }\r\n expr = propertyCall;\r\n }\r\n else {\r\n this.error(diagnostics_1.DiagnosticCode.Identifier_expected, next.range);\r\n return null;\r\n }\r\n // BinaryExpression\r\n }\r\n else {\r\n expr = ast_1.Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n };\r\n return Parser;\r\n}(diagnostics_1.DiagnosticEmitter));\r\nexports.Parser = Parser;\r\n/** Operator precedence from least to largest. */\r\nvar Precedence;\r\n(function (Precedence) {\r\n Precedence[Precedence[\"COMMA\"] = 0] = \"COMMA\";\r\n Precedence[Precedence[\"SPREAD\"] = 1] = \"SPREAD\";\r\n Precedence[Precedence[\"YIELD\"] = 2] = \"YIELD\";\r\n Precedence[Precedence[\"ASSIGNMENT\"] = 3] = \"ASSIGNMENT\";\r\n Precedence[Precedence[\"CONDITIONAL\"] = 4] = \"CONDITIONAL\";\r\n Precedence[Precedence[\"LOGICAL_OR\"] = 5] = \"LOGICAL_OR\";\r\n Precedence[Precedence[\"LOGICAL_AND\"] = 6] = \"LOGICAL_AND\";\r\n Precedence[Precedence[\"BITWISE_OR\"] = 7] = \"BITWISE_OR\";\r\n Precedence[Precedence[\"BITWISE_XOR\"] = 8] = \"BITWISE_XOR\";\r\n Precedence[Precedence[\"BITWISE_AND\"] = 9] = \"BITWISE_AND\";\r\n Precedence[Precedence[\"EQUALITY\"] = 10] = \"EQUALITY\";\r\n Precedence[Precedence[\"RELATIONAL\"] = 11] = \"RELATIONAL\";\r\n Precedence[Precedence[\"SHIFT\"] = 12] = \"SHIFT\";\r\n Precedence[Precedence[\"ADDITIVE\"] = 13] = \"ADDITIVE\";\r\n Precedence[Precedence[\"MULTIPLICATIVE\"] = 14] = \"MULTIPLICATIVE\";\r\n Precedence[Precedence[\"EXPONENTIATED\"] = 15] = \"EXPONENTIATED\";\r\n Precedence[Precedence[\"UNARY_PREFIX\"] = 16] = \"UNARY_PREFIX\";\r\n Precedence[Precedence[\"UNARY_POSTFIX\"] = 17] = \"UNARY_POSTFIX\";\r\n Precedence[Precedence[\"CALL\"] = 18] = \"CALL\";\r\n Precedence[Precedence[\"MEMBERACCESS\"] = 19] = \"MEMBERACCESS\";\r\n Precedence[Precedence[\"GROUPING\"] = 20] = \"GROUPING\";\r\n Precedence[Precedence[\"INVALID\"] = -1] = \"INVALID\";\r\n})(Precedence = exports.Precedence || (exports.Precedence = {}));\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.DOT_DOT_DOT:\r\n return 1 /* SPREAD */;\r\n case tokenizer_1.Token.YIELD:\r\n return 2 /* YIELD */;\r\n case tokenizer_1.Token.EXCLAMATION:\r\n case tokenizer_1.Token.TILDE:\r\n case tokenizer_1.Token.PLUS:\r\n case tokenizer_1.Token.MINUS:\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n case tokenizer_1.Token.TYPEOF:\r\n case tokenizer_1.Token.VOID:\r\n case tokenizer_1.Token.DELETE:\r\n return 16 /* UNARY_PREFIX */;\r\n case tokenizer_1.Token.NEW:\r\n return 19 /* MEMBERACCESS */;\r\n default:\r\n return -1 /* INVALID */;\r\n }\r\n}\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.COMMA:\r\n return 0 /* COMMA */;\r\n case tokenizer_1.Token.EQUALS:\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n return 3 /* ASSIGNMENT */;\r\n case tokenizer_1.Token.QUESTION:\r\n return 4 /* CONDITIONAL */;\r\n case tokenizer_1.Token.BAR_BAR:\r\n return 5 /* LOGICAL_OR */;\r\n case tokenizer_1.Token.AMPERSAND_AMPERSAND:\r\n return 6 /* LOGICAL_AND */;\r\n case tokenizer_1.Token.BAR:\r\n return 7 /* BITWISE_OR */;\r\n case tokenizer_1.Token.CARET:\r\n return 8 /* BITWISE_XOR */;\r\n case tokenizer_1.Token.AMPERSAND:\r\n return 9 /* BITWISE_AND */;\r\n case tokenizer_1.Token.EQUALS_EQUALS:\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS:\r\n case tokenizer_1.Token.EQUALS_EQUALS_EQUALS:\r\n case tokenizer_1.Token.EXCLAMATION_EQUALS_EQUALS:\r\n return 10 /* EQUALITY */;\r\n case tokenizer_1.Token.AS:\r\n case tokenizer_1.Token.IN:\r\n case tokenizer_1.Token.INSTANCEOF:\r\n case tokenizer_1.Token.LESSTHAN:\r\n case tokenizer_1.Token.GREATERTHAN:\r\n case tokenizer_1.Token.LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_EQUALS:\r\n return 11 /* RELATIONAL */;\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n return 12 /* SHIFT */;\r\n case tokenizer_1.Token.PLUS:\r\n case tokenizer_1.Token.MINUS:\r\n return 13 /* ADDITIVE */;\r\n case tokenizer_1.Token.ASTERISK:\r\n case tokenizer_1.Token.SLASH:\r\n case tokenizer_1.Token.PERCENT:\r\n return 14 /* MULTIPLICATIVE */;\r\n case tokenizer_1.Token.ASTERISK_ASTERISK:\r\n return 15 /* EXPONENTIATED */;\r\n case tokenizer_1.Token.PLUS_PLUS:\r\n case tokenizer_1.Token.MINUS_MINUS:\r\n return 17 /* UNARY_POSTFIX */;\r\n case tokenizer_1.Token.DOT:\r\n case tokenizer_1.Token.NEW:\r\n case tokenizer_1.Token.OPENBRACKET:\r\n return 19 /* MEMBERACCESS */;\r\n default:\r\n return -1 /* INVALID */;\r\n }\r\n}\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind) {\r\n switch (kind) {\r\n case tokenizer_1.Token.EQUALS:\r\n case tokenizer_1.Token.PLUS_EQUALS:\r\n case tokenizer_1.Token.MINUS_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK_EQUALS:\r\n case tokenizer_1.Token.ASTERISK_EQUALS:\r\n case tokenizer_1.Token.SLASH_EQUALS:\r\n case tokenizer_1.Token.PERCENT_EQUALS:\r\n case tokenizer_1.Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case tokenizer_1.Token.AMPERSAND_EQUALS:\r\n case tokenizer_1.Token.CARET_EQUALS:\r\n case tokenizer_1.Token.BAR_EQUALS:\r\n case tokenizer_1.Token.QUESTION:\r\n case tokenizer_1.Token.ASTERISK_ASTERISK:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// assemblyscript.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1708a3acc440ab1ab363","import {\r\n Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n None = _BinaryenTypeNone(),\r\n I32 = _BinaryenTypeInt32(),\r\n I64 = _BinaryenTypeInt64(),\r\n F32 = _BinaryenTypeFloat32(),\r\n F64 = _BinaryenTypeFloat64(),\r\n Unreachable = _BinaryenTypeUnreachable(),\r\n Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n Invalid = _BinaryenInvalidId(),\r\n Block = _BinaryenBlockId(),\r\n If = _BinaryenIfId(),\r\n Loop = _BinaryenLoopId(),\r\n Break = _BinaryenBreakId(),\r\n Switch = _BinaryenSwitchId(),\r\n Call = _BinaryenCallId(),\r\n CallImport = _BinaryenCallImportId(),\r\n CallIndirect = _BinaryenCallIndirectId(),\r\n GetLocal = _BinaryenGetLocalId(),\r\n SetLocal = _BinaryenSetLocalId(),\r\n GetGlobal = _BinaryenGetGlobalId(),\r\n SetGlobal = _BinaryenSetGlobalId(),\r\n Load = _BinaryenLoadId(),\r\n Store = _BinaryenStoreId(),\r\n Const = _BinaryenConstId(),\r\n Unary = _BinaryenUnaryId(),\r\n Binary = _BinaryenBinaryId(),\r\n Select = _BinaryenSelectId(),\r\n Drop = _BinaryenDropId(),\r\n Return = _BinaryenReturnId(),\r\n Host = _BinaryenHostId(),\r\n Nop = _BinaryenNopId(),\r\n Unreachable = _BinaryenUnreachableId(),\r\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n AtomicRMW = _BinaryenAtomicRMWId(),\r\n AtomicWait = _BinaryenAtomicWaitId(),\r\n AtomicWake = _BinaryenAtomicWakeId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n ClzI32 = _BinaryenClzInt32(),\r\n CtzI32 = _BinaryenCtzInt32(),\r\n PopcntI32 = _BinaryenPopcntInt32(),\r\n NegF32 = _BinaryenNegFloat32(),\r\n AbsF32 = _BinaryenAbsFloat32(),\r\n CeilF32 = _BinaryenCeilFloat32(),\r\n FloorF32 = _BinaryenFloorFloat32(),\r\n TruncF32 = _BinaryenTruncFloat32(),\r\n NearestF32 = _BinaryenNearestFloat32(),\r\n SqrtF32 = _BinaryenSqrtFloat32(),\r\n EqzI32 = _BinaryenEqZInt32(),\r\n ClzI64 = _BinaryenClzInt64(),\r\n CtzI64 = _BinaryenCtzInt64(),\r\n PopcntI64 = _BinaryenPopcntInt64(),\r\n NegF64 = _BinaryenNegFloat64(),\r\n AbsF64 = _BinaryenAbsFloat64(),\r\n CeilF64 = _BinaryenCeilFloat64(),\r\n FloorF64 = _BinaryenFloorFloat64(),\r\n TruncF64 = _BinaryenTruncFloat64(),\r\n NearestF64 = _BinaryenNearestFloat64(),\r\n SqrtF64 = _BinaryenSqrtFloat64(),\r\n EqzI64 = _BinaryenEqZInt64(),\r\n ExtendI32 = _BinaryenExtendSInt32(),\r\n ExtendU32 = _BinaryenExtendUInt32(),\r\n WrapI64 = _BinaryenWrapInt64(),\r\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n PromoteF32 = _BinaryenPromoteFloat32(),\r\n DemoteF64 = _BinaryenDemoteFloat64(),\r\n ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n ReinterpretI64 = _BinaryenReinterpretInt64()\r\n\r\n // see: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#new-sign-extending-operators\r\n // ExtendI8ToI32 =_BinaryenExtendS8Int32()\r\n // ExtendI16ToI32 = _BinaryenExtendS16Int32()\r\n // ExtendI8ToI64 = _BinaryenExtendS8Int64() // operand is I64\r\n // ExtendI16ToI64 = _BinaryenExtendS16Int64()\r\n // ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n AddI32 = _BinaryenAddInt32(),\r\n SubI32 = _BinaryenSubInt32(),\r\n MulI32 = _BinaryenMulInt32(),\r\n DivI32 = _BinaryenDivSInt32(),\r\n DivU32 = _BinaryenDivUInt32(),\r\n RemI32 = _BinaryenRemSInt32(),\r\n RemU32 = _BinaryenRemUInt32(),\r\n AndI32 = _BinaryenAndInt32(),\r\n OrI32 = _BinaryenOrInt32(),\r\n XorI32 = _BinaryenXorInt32(),\r\n ShlI32 = _BinaryenShlInt32(),\r\n ShrU32 = _BinaryenShrUInt32(),\r\n ShrI32 = _BinaryenShrSInt32(),\r\n RotlI32 = _BinaryenRotLInt32(),\r\n RotrI32 = _BinaryenRotRInt32(),\r\n EqI32 = _BinaryenEqInt32(),\r\n NeI32 = _BinaryenNeInt32(),\r\n LtI32 = _BinaryenLtSInt32(),\r\n LtU32 = _BinaryenLtUInt32(),\r\n LeI32 = _BinaryenLeSInt32(),\r\n LeU32 = _BinaryenLeUInt32(),\r\n GtI32 = _BinaryenGtSInt32(),\r\n GtU32 = _BinaryenGtUInt32(),\r\n GeI32 = _BinaryenGeSInt32(),\r\n GeU32 = _BinaryenGeUInt32(),\r\n AddI64 = _BinaryenAddInt64(),\r\n SubI64 = _BinaryenSubInt64(),\r\n MulI64 = _BinaryenMulInt64(),\r\n DivI64 = _BinaryenDivSInt64(),\r\n DivU64 = _BinaryenDivUInt64(),\r\n RemI64 = _BinaryenRemSInt64(),\r\n RemU64 = _BinaryenRemUInt64(),\r\n AndI64 = _BinaryenAndInt64(),\r\n OrI64 = _BinaryenOrInt64(),\r\n XorI64 = _BinaryenXorInt64(),\r\n ShlI64 = _BinaryenShlInt64(),\r\n ShrU64 = _BinaryenShrUInt64(),\r\n ShrI64 = _BinaryenShrSInt64(),\r\n RotlI64 = _BinaryenRotLInt64(),\r\n RotrI64 = _BinaryenRotRInt64(),\r\n EqI64 = _BinaryenEqInt64(),\r\n NeI64 = _BinaryenNeInt64(),\r\n LtI64 = _BinaryenLtSInt64(),\r\n LtU64 = _BinaryenLtUInt64(),\r\n LeI64 = _BinaryenLeSInt64(),\r\n LeU64 = _BinaryenLeUInt64(),\r\n GtI64 = _BinaryenGtSInt64(),\r\n GtU64 = _BinaryenGtUInt64(),\r\n GeI64 = _BinaryenGeSInt64(),\r\n GeU64 = _BinaryenGeUInt64(),\r\n AddF32 = _BinaryenAddFloat32(),\r\n SubF32 = _BinaryenSubFloat32(),\r\n MulF32 = _BinaryenMulFloat32(),\r\n DivF32 = _BinaryenDivFloat32(),\r\n CopysignF32 = _BinaryenCopySignFloat32(),\r\n MinF32 = _BinaryenMinFloat32(),\r\n MaxF32 = _BinaryenMaxFloat32(),\r\n EqF32 = _BinaryenEqFloat32(),\r\n NeF32 = _BinaryenNeFloat32(),\r\n LtF32 = _BinaryenLtFloat32(),\r\n LeF32 = _BinaryenLeFloat32(),\r\n GtF32 = _BinaryenGtFloat32(),\r\n GeF32 = _BinaryenGeFloat32(),\r\n AddF64 = _BinaryenAddFloat64(),\r\n SubF64 = _BinaryenSubFloat64(),\r\n MulF64 = _BinaryenMulFloat64(),\r\n DivF64 = _BinaryenDivFloat64(),\r\n CopysignF64 = _BinaryenCopySignFloat64(),\r\n MinF64 = _BinaryenMinFloat64(),\r\n MaxF64 = _BinaryenMaxFloat64(),\r\n EqF64 = _BinaryenEqFloat64(),\r\n NeF64 = _BinaryenNeFloat64(),\r\n LtF64 = _BinaryenLtFloat64(),\r\n LeF64 = _BinaryenLeFloat64(),\r\n GtF64 = _BinaryenGtFloat64(),\r\n GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n PageSize = _BinaryenPageSize(),\r\n CurrentMemory = _BinaryenCurrentMemory(),\r\n GrowMemory = _BinaryenGrowMemory(),\r\n HasFeature = _BinaryenHasFeature(),\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n Add = _BinaryenAtomicRMWAdd(),\r\n Sub = _BinaryenAtomicRMWSub(),\r\n And = _BinaryenAtomicRMWAnd(),\r\n Or = _BinaryenAtomicRMWOr(),\r\n Xor = _BinaryenAtomicRMWXor(),\r\n Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n buffer: Uint8Array;\r\n offset: I64;\r\n\r\n static create(buffer: Uint8Array, offset: I64) {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n }\r\n}\r\n\r\nexport class Module {\r\n\r\n ref: ModuleRef;\r\n out: usize;\r\n\r\n static readonly MAX_MEMORY_WASM32: Index = 0xffff;\r\n // TODO: static readonly MAX_MEMORY_WASM64\r\n\r\n static create(): Module {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.out = allocate_memory(16);\r\n return module;\r\n }\r\n\r\n static createFrom(buffer: Uint8Array): Module {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.out = allocate_memory(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n return module;\r\n } finally {\r\n free_memory(changetype(cArr));\r\n }\r\n }\r\n\r\n private constructor() { }\r\n\r\n // types\r\n\r\n addFunctionType(\r\n name: string,\r\n result: NativeType,\r\n paramTypes: NativeType[]\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes.length);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n getFunctionTypeBySignature(\r\n result: NativeType,\r\n paramTypes: NativeType[]\r\n ): FunctionTypeRef {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes.length);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n // constants\r\n\r\n createI32(value: i32): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF32(value: f32): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF64(value: f64): ExpressionRef {\r\n var out = this.out;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n // expressions\r\n\r\n createUnary(\r\n op: UnaryOp,\r\n expr: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n }\r\n\r\n createBinary(\r\n op: BinaryOp,\r\n left: ExpressionRef,\r\n right: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n }\r\n\r\n createHost(\r\n op: HostOp,\r\n name: string | null = null,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createGetLocal(\r\n index: i32,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n }\r\n\r\n createTeeLocal(\r\n index: i32,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n }\r\n\r\n createGetGlobal(\r\n name: string,\r\n type: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createLoad(\r\n bytes: Index,\r\n signed: bool,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n }\r\n\r\n createStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n }\r\n\r\n createAtomicLoad(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n }\r\n\r\n createAtomicStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicRMW(\r\n op: AtomicRMWOp,\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicCmpxchg(\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n replacement: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n }\r\n\r\n createAtomicWait(\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n timeout: ExpressionRef,\r\n expectedType: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n }\r\n\r\n createAtomicWake(\r\n ptr: ExpressionRef,\r\n wakeCount: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n }\r\n\r\n // statements\r\n\r\n createSetLocal(\r\n index: Index,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n }\r\n\r\n createSetGlobal(\r\n name: string,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createBlock(\r\n label: string | null,\r\n children: ExpressionRef[],\r\n type: NativeType = NativeType.None\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n var cArr = allocI32Array(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createBreak(\r\n label: string | null,\r\n condition: ExpressionRef = 0,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createDrop(\r\n expression: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenDrop(this.ref, expression);\r\n }\r\n\r\n createLoop(\r\n label: string | null,\r\n body: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createIf(\r\n condition: ExpressionRef,\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createNop(): ExpressionRef {\r\n return _BinaryenNop(this.ref);\r\n }\r\n\r\n createReturn(\r\n expression: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenReturn(this.ref, expression);\r\n }\r\n\r\n createSelect(\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef,\r\n condition: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createSwitch(\r\n names: string[],\r\n defaultName: string | null,\r\n condition: ExpressionRef,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var strs = new Array(names.length);\r\n for (var i = 0, k: i32 = names.length; i < k; ++i) {\r\n strs[i] = allocString(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = allocString(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, k, cStr, condition, value);\r\n } finally {\r\n free_memory(cStr);\r\n free_memory(cArr);\r\n for (i = k - 1; i >= 0; --i) free_memory(strs[i]);\r\n }\r\n }\r\n\r\n createCall(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createCallImport(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(target);\r\n var cArr = allocI32Array(operands);\r\n try {\r\n return _BinaryenCallImport(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n createUnreachable(): ExpressionRef {\r\n return _BinaryenUnreachable(this.ref);\r\n }\r\n\r\n // meta\r\n\r\n addGlobal(\r\n name: string,\r\n type: NativeType,\r\n mutable: bool,\r\n initializer: ExpressionRef\r\n ): GlobalRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunction(\r\n name: string,\r\n type: FunctionTypeRef,\r\n varTypes: NativeType[],\r\n body: ExpressionRef\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes.length, body);\r\n } finally {\r\n free_memory(cArr);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n removeFunction(name: string): void {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunctionExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addTableExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addMemoryExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addGlobalExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n removeExport(externalName: string): void {\r\n var cStr = allocString(externalName);\r\n try {\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n addFunctionImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n functionType: FunctionTypeRef\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addTableImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addMemoryImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n addGlobalImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n globalType: NativeType\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n } finally {\r\n free_memory(cStr3);\r\n free_memory(cStr2);\r\n free_memory(cStr1);\r\n }\r\n }\r\n\r\n removeImport(internalName: string): void {\r\n var cStr = allocString(internalName);\r\n try {\r\n _BinaryenRemoveImport(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n setMemory(\r\n initial: Index,\r\n maximum: Index,\r\n segments: MemorySegment[],\r\n target: Target,\r\n exportName: string | null = null\r\n ): void {\r\n var cStr = allocString(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var buffer = segments[i].buffer;\r\n var offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n } finally {\r\n free_memory(cArr3);\r\n free_memory(cArr2);\r\n free_memory(cArr1);\r\n for (i = k - 1; i >= 0; --i) free_memory(segs[i]);\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n setFunctionTable(funcs: FunctionRef[]): void {\r\n var cArr = allocI32Array(funcs);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, cArr, funcs.length);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n setStart(func: FunctionRef): void {\r\n _BinaryenSetStart(this.ref, func);\r\n }\r\n\r\n setOptimizeLevel(level: i32 = 2): void {\r\n _BinaryenSetOptimizeLevel(level);\r\n }\r\n\r\n setShrinkLevel(level: i32 = 1): void {\r\n _BinaryenSetShrinkLevel(level);\r\n }\r\n\r\n setDebugInfo(on: bool = false): void {\r\n _BinaryenSetDebugInfo(on);\r\n }\r\n\r\n optimize(func: FunctionRef = 0): void {\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n } else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n }\r\n\r\n runPasses(passes: string[], func: FunctionRef = 0): void {\r\n var k = passes.length;\r\n var names = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, k);\r\n } else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, k);\r\n }\r\n } finally {\r\n free_memory(cArr);\r\n for (; i >= 0; --i) free_memory(names[i]);\r\n }\r\n }\r\n\r\n validate(): bool {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n }\r\n\r\n interpret(): void {\r\n _BinaryenModuleInterpret(this.ref);\r\n }\r\n\r\n toBinary(sourceMapUrl: string | null): Binary {\r\n var out = this.out;\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr: usize = 0;\r\n var sourceMapPtr: usize = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n var binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n var ret = new Binary();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n } finally {\r\n if (cStr) free_memory(cStr);\r\n if (binaryPtr) free_memory(binaryPtr);\r\n if (sourceMapPtr) free_memory(sourceMapPtr);\r\n }\r\n }\r\n\r\n toText(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n toAsmjs(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n dispose(): void {\r\n if (!this.ref) return; // sic\r\n _BinaryenModuleDispose(this.ref);\r\n free_memory(this.out);\r\n }\r\n\r\n createRelooper(): Relooper {\r\n return Relooper.create(this);\r\n }\r\n\r\n cloneExpression(expr: ExpressionRef,\r\n noSideEffects: bool = false,\r\n maxDepth: i32 = i32.MAX_VALUE\r\n ): ExpressionRef { // currently supports side effect free expressions only\r\n if (maxDepth < 0) return 0;\r\n maxDepth -= 1;\r\n\r\n var nested1: ExpressionRef,\r\n nested2: ExpressionRef;\r\n\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n\r\n case ExpressionId.Const:\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n case NativeType.I64:\r\n return this.createI64(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n case NativeType.F32:\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n case NativeType.F64:\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n\r\n case ExpressionId.GetLocal:\r\n return _BinaryenGetLocal(this.ref,\r\n _BinaryenGetLocalGetIndex(expr),\r\n _BinaryenExpressionGetType(expr)\r\n );\r\n\r\n case ExpressionId.GetGlobal:\r\n var globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName) break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n\r\n case ExpressionId.Load:\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n : _BinaryenLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenLoadGetAlign(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n );\r\n\r\n case ExpressionId.Unary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n\r\n case ExpressionId.Binary:\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n return 0;\r\n }\r\n\r\n // source map generation\r\n\r\n addDebugInfoFile(name: string): Index {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n } finally {\r\n free_memory(cStr);\r\n }\r\n }\r\n\r\n getDebugInfoFile(index: Index): string | null {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n }\r\n\r\n setDebugLocation(\r\n func: FunctionRef,\r\n expr: ExpressionRef,\r\n fileIndex: Index,\r\n lineNumber: Index,\r\n columnNumber: Index\r\n ): void {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n }\r\n}\r\n\r\nexport class Relooper {\r\n\r\n module: Module;\r\n ref: RelooperRef;\r\n\r\n static create(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate();\r\n return relooper;\r\n }\r\n\r\n static createStub(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = 0;\r\n return relooper;\r\n }\r\n\r\n private constructor() {}\r\n\r\n addBlock(code: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlock(this.ref, code);\r\n }\r\n\r\n addBranch(from: RelooperBlockRef, to: RelooperBlockRef, condition: ExpressionRef = 0, code: ExpressionRef = 0): void {\r\n _RelooperAddBranch(from, to, condition, code);\r\n }\r\n\r\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n }\r\n\r\n addBranchForSwitch(from: RelooperBlockRef, to: RelooperBlockRef, indexes: i32[], code: ExpressionRef = 0): void {\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n } finally {\r\n free_memory(cArr);\r\n }\r\n }\r\n\r\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper, this.module.ref);\r\n }\r\n}\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n if (!u8s) return 0;\r\n var ptr = allocate_memory(u8s.length);\r\n var idx = ptr;\r\n for (var i = 0, k = u8s.length; i < k; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n if (!i32s) return 0;\r\n var ptr = allocate_memory(i32s.length << 2);\r\n var idx = ptr;\r\n for (var i = 0, k = i32s.length; i < k; ++i) {\r\n var val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx , ( val & 0xff) as u8);\r\n store(idx + 1, ((val >> 8) & 0xff) as u8);\r\n store(idx + 2, ((val >> 16) & 0xff) as u8);\r\n store(idx + 3, ( val >>> 24 ) as u8);\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n var len = 0;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n } else if (u <= 0x7FF) {\r\n len += 2;\r\n } else if (u <= 0xFFFF) {\r\n len += 3;\r\n } else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n } else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n } else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n if (str == null) return 0;\r\n var ptr = allocate_memory(stringLengthUTF8(str) + 1);\r\n var idx = ptr;\r\n for (var i = 0, k = str.length; i < k; ++i) {\r\n var u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u as u8);\r\n } else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else {\r\n store(idx++, (0xFC | (u >>> 30) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\n\r\nexport function readInt(ptr: usize): i32 {\r\n return (\r\n load(ptr ) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24)\r\n );\r\n}\r\n\r\nexport function readBuffer(ptr: usize, length: usize): Uint8Array {\r\n var ret = new Uint8Array(length);\r\n for (var i: usize = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n if (!ptr) return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp: u32;\r\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n } else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n } else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nclass Binary {\r\n /** WebAssembly binary. */\r\n output: Uint8Array;\r\n /** Source map, if generated. */\r\n sourceMap: string | null;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/module.ts","import {\r\n Range\r\n} from \"./ast\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nimport {\r\n isLineBreak\r\n} from \"./util/charcode\";\r\n\r\nexport {\r\n DiagnosticCode,\r\n diagnosticCodeToString\r\n} from \"./diagnosticMessages.generated\";\r\n\r\nexport enum DiagnosticCategory {\r\n INFO,\r\n WARNING,\r\n ERROR\r\n}\r\n\r\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return \"INFO\";\r\n case DiagnosticCategory.WARNING: return \"WARNING\";\r\n case DiagnosticCategory.ERROR: return \"ERROR\";\r\n default: return \"\";\r\n }\r\n}\r\n\r\nconst colorBlue: string = \"\\u001b[93m\";\r\nconst colorYellow: string = \"\\u001b[93m\";\r\nconst colorRed: string = \"\\u001b[91m\";\r\nconst colorReset: string = \"\\u001b[0m\";\r\n\r\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\r\n switch (category) {\r\n case DiagnosticCategory.INFO: return colorBlue;\r\n case DiagnosticCategory.WARNING: return colorYellow;\r\n case DiagnosticCategory.ERROR: return colorRed;\r\n default: return \"\";\r\n }\r\n}\r\n\r\nexport class DiagnosticMessage {\r\n\r\n code: i32;\r\n category: DiagnosticCategory;\r\n message: string;\r\n range: Range | null = null;\r\n\r\n constructor(code: i32, category: DiagnosticCategory, message: string) {\r\n this.code = code;\r\n this.category = category;\r\n this.message = message;\r\n }\r\n\r\n static create(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n var message = diagnosticCodeToString(code);\r\n if (arg0 != null) message = message.replace(\"{0}\", arg0);\r\n if (arg1 != null) message = message.replace(\"{1}\", arg1);\r\n return new DiagnosticMessage(code, category, message);\r\n }\r\n\r\n static createInfo(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\r\n }\r\n\r\n static createWarning(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\r\n }\r\n\r\n static createError(\r\n code: DiagnosticCode,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ): DiagnosticMessage {\r\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\r\n }\r\n\r\n withRange(range: Range): this {\r\n this.range = range;\r\n return this;\r\n }\r\n\r\n toString(): string {\r\n if (this.range) {\r\n return (\r\n diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \\\"\" +\r\n this.message +\r\n \"\\\" in \" +\r\n this.range.source.normalizedPath +\r\n \" @ \" +\r\n this.range.start.toString(10) +\r\n \",\" +\r\n this.range.end.toString(10)\r\n );\r\n }\r\n return (\r\n diagnosticCategoryToString(this.category) +\r\n \" \" +\r\n this.code.toString(10) +\r\n \": \" +\r\n this.message\r\n );\r\n }\r\n}\r\n\r\nexport function formatDiagnosticMessage(\r\n message: DiagnosticMessage,\r\n useColors: bool = false,\r\n showContext: bool = false\r\n): string {\r\n // format context first (uses same string builder)\r\n var context = \"\";\r\n if (message.range && showContext) {\r\n context = formatDiagnosticContext(message.range, useColors);\r\n }\r\n\r\n // general information\r\n var sb: string[] = [];\r\n if (useColors) sb.push(diagnosticCategoryToColor(message.category));\r\n sb.push(diagnosticCategoryToString(message.category));\r\n if (useColors) sb.push(colorReset);\r\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\r\n sb.push(message.code.toString(10));\r\n sb.push(\": \");\r\n sb.push(message.message);\r\n\r\n // range information if available\r\n if (message.range) {\r\n var range = message.range;\r\n if (showContext) {\r\n sb.push(\"\\n\");\r\n sb.push(context);\r\n }\r\n sb.push(\"\\n\");\r\n sb.push(\" in \");\r\n sb.push(range.source.normalizedPath);\r\n sb.push(\"(\");\r\n sb.push(range.line.toString(10));\r\n sb.push(\",\");\r\n sb.push(range.column.toString(10));\r\n sb.push(\")\");\r\n }\r\n return sb.join(\"\");\r\n}\r\n\r\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\r\n var text = range.source.text;\r\n var len = text.length;\r\n var start = range.start;\r\n var end = range.end;\r\n while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) {\r\n start--;\r\n }\r\n while (end < len && !isLineBreak(text.charCodeAt(end))) {\r\n end++;\r\n }\r\n var sb: string[] = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors) sb.push(colorRed);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n } else {\r\n while (start++ < range.end) {\r\n sb.push(\"~\");\r\n }\r\n }\r\n if (useColors) sb.push(colorReset);\r\n return sb.join(\"\");\r\n}\r\n\r\nexport abstract class DiagnosticEmitter {\r\n\r\n diagnostics: DiagnosticMessage[];\r\n // silentDiagnostics: bool = false;\r\n\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n\r\n emitDiagnostic(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null\r\n ) {\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n }\r\n\r\n error(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1);\r\n }\r\n\r\n info(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1);\r\n }\r\n\r\n warning(code: DiagnosticCode, range: Range, arg0: string | null = null, arg1: string | null = null): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/diagnostics.ts","import {\r\n Options\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Type,\r\n typesToString\r\n} from \"./types\";\r\n\r\nimport {\r\n ModifierKind,\r\n Node,\r\n NodeKind,\r\n Source,\r\n Range,\r\n TypeNode,\r\n TypeParameter,\r\n Decorator,\r\n DecoratorKind,\r\n\r\n Expression,\r\n AssertionExpression,\r\n ElementAccessExpression,\r\n IdentifierExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n StringLiteralExpression,\r\n CallExpression,\r\n\r\n ClassDeclaration,\r\n DeclarationStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportMember,\r\n ExportStatement,\r\n FieldDeclaration,\r\n FunctionDeclaration,\r\n ImportDeclaration,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n MethodDeclaration,\r\n NamespaceDeclaration,\r\n TypeDeclaration,\r\n VariableLikeDeclarationStatement,\r\n VariableStatement,\r\n\r\n hasDecorator,\r\n hasModifier\r\n} from \"./ast\";\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n FunctionRef,\r\n} from \"./module\";\r\n\r\n/** Path delimiter inserted between file system levels. */\r\nexport const PATH_DELIMITER = \"/\";\r\n/** Substitution used to indicate the parent directory. */\r\nexport const PARENT_SUBST = \"..\";\r\n/** Function name prefix used for getters. */\r\nexport const GETTER_PREFIX = \"get:\";\r\n/** Function name prefix used for setters. */\r\nexport const SETTER_PREFIX = \"set:\";\r\n/** Delimiter used between class names and instance members. */\r\nexport const INSTANCE_DELIMITER = \"#\";\r\n/** Delimiter used between class and namespace names and static members. */\r\nexport const STATIC_DELIMITER = \".\";\r\n/** Substitution used to indicate a library directory. */\r\nexport const LIBRARY_SUBST = \"(lib)\";\r\n/** Library directory prefix. */\r\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\r\n\r\nclass QueuedExport {\r\n isReExport: bool;\r\n referencedName: string;\r\n member: ExportMember;\r\n}\r\n\r\nclass QueuedImport {\r\n internalName: string;\r\n referencedName: string;\r\n referencedNameAlt: string;\r\n declaration: ImportDeclaration;\r\n}\r\n\r\nconst noTypesYet = new Map();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n /** Array of source files. */\r\n sources: Source[];\r\n /** Diagnostic offset used where repeatedly obtaining the next diagnostic. */\r\n diagnosticsOffset: i32 = 0;\r\n /** Compiler options. */\r\n options: Options;\r\n /** Elements by internal name. */\r\n elements: Map = new Map();\r\n /** Types by internal name. */\r\n types: Map = noTypesYet;\r\n /** Declared type aliases. */\r\n typeAliases: Map = new Map();\r\n /** Exports of individual files by exported name. Not global exports. */\r\n exports: Map = new Map();\r\n\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.sources = [];\r\n }\r\n\r\n /** Initializes the program and its elements prior to compilation. */\r\n initialize(options: Options): void {\r\n this.options = options;\r\n\r\n this.types = new Map([\r\n [\"i8\", Type.i8],\r\n [\"i16\", Type.i16],\r\n [\"i32\", Type.i32],\r\n [\"i64\", Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", Type.u8],\r\n [\"u16\", Type.u16],\r\n [\"u32\", Type.u32],\r\n [\"u64\", Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", Type.bool],\r\n [\"f32\", Type.f32],\r\n [\"f64\", Type.f64],\r\n [\"void\", Type.void],\r\n [\"number\", Type.f64],\r\n [\"boolean\", Type.bool]\r\n ]);\r\n\r\n var queuedExports = new Map();\r\n var queuedImports = new Array();\r\n var queuedDerivedClasses = new Array();\r\n\r\n // build initial lookup maps of internal names to declarations\r\n for (var i = 0, k = this.sources.length; i < k; ++i) {\r\n var source = this.sources[i];\r\n var statements = source.statements;\r\n for (var j = 0, l = statements.length; j < l; ++j) {\r\n var statement = statements[j];\r\n switch (statement.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n this.initializeClass(\r\n statement,\r\n queuedDerivedClasses\r\n );\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(statement);\r\n break;\r\n\r\n case NodeKind.EXPORT:\r\n this.initializeExports(\r\n statement,\r\n queuedExports\r\n );\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(statement);\r\n break;\r\n\r\n case NodeKind.IMPORT:\r\n this.initializeImports(\r\n statement,\r\n queuedExports,\r\n queuedImports\r\n );\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(statement);\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(\r\n statement,\r\n queuedDerivedClasses\r\n );\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n this.initializeTypeAlias(statement);\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n var element: Element | null;\r\n\r\n // queued imports should be resolvable now through traversing exports and\r\n // queued exports\r\n for (i = 0; i < queuedImports.length;) {\r\n var queuedImport = queuedImports[i];\r\n element = this.tryResolveImport(\r\n queuedImport.referencedName,\r\n queuedExports\r\n );\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n element = this.tryResolveImport(\r\n queuedImport.referencedNameAlt,\r\n queuedExports\r\n );\r\n if (element) {\r\n this.elements.set(queuedImport.internalName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedImport.declaration.range,\r\n (queuedImport.declaration.parent).path.value,\r\n queuedImport.declaration.externalName.text\r\n );\r\n ++i;\r\n }\r\n }\r\n }\r\n\r\n // queued exports should be resolvable now that imports are finalized\r\n for (var [exportName, queuedExport] of queuedExports) {\r\n var currentExport: QueuedExport | null = queuedExport; // nullable below\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.exports.get(currentExport.referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n currentExport.member.externalName\r\n );\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.referencedName);\r\n if (!currentExport) {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.member.externalName.range,\r\n ((\r\n queuedExport.member.parent\r\n ).path).value,\r\n queuedExport.member.externalName.text\r\n );\r\n }\r\n } else {\r\n if (\r\n // normal export\r\n (element = this.elements.get(currentExport.referencedName)) ||\r\n // library re-export\r\n (element = this.elements.get(currentExport.member.name.text))\r\n ) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n currentExport.member.externalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n queuedExport.member.range, queuedExport.member.name.text\r\n );\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n\r\n // resolve base prototypes of derived classes\r\n for (i = 0, k = queuedDerivedClasses.length; i < k; ++i) {\r\n var derivedDeclaration = queuedDerivedClasses[i].declaration;\r\n var derivedType = assert(derivedDeclaration.extendsType);\r\n var resolved = this.resolveIdentifier(derivedType.name, null);\r\n if (resolved) {\r\n if (resolved.element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n derivedType.range\r\n );\r\n continue;\r\n }\r\n queuedDerivedClasses[i].basePrototype = (\r\n resolved.element\r\n );\r\n }\r\n }\r\n }\r\n\r\n /** Tries to resolve an import by traversing exports and queued exports. */\r\n private tryResolveImport(\r\n referencedName: string,\r\n queuedExports: Map\r\n ): Element | null {\r\n var element: Element | null;\r\n do {\r\n if (element = this.exports.get(referencedName)) {\r\n return element;\r\n }\r\n var queuedExport = queuedExports.get(referencedName);\r\n if (!queuedExport) return null;\r\n if (queuedExport.isReExport) {\r\n referencedName = queuedExport.referencedName;\r\n continue;\r\n }\r\n return this.elements.get(queuedExport.referencedName);\r\n } while (true);\r\n }\r\n\r\n private checkInternalDecorators(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n ): void {\r\n var isBuiltin: bool = hasDecorator(\"builtin\", declaration.decorators);\r\n if (isBuiltin) {\r\n element.set(ElementFlags.BUILTIN);\r\n }\r\n if (\r\n hasDecorator(\"global\", declaration.decorators) ||\r\n (\r\n declaration.range.source.isLibrary &&\r\n element.is(ElementFlags.EXPORTED) &&\r\n (\r\n assert(declaration.parent).kind == NodeKind.SOURCE ||\r\n (\r\n declaration.parent).kind == NodeKind.VARIABLE &&\r\n assert((declaration.parent).parent).kind == NodeKind.SOURCE\r\n )\r\n )\r\n ) {\r\n element.set(ElementFlags.GLOBAL);\r\n if (this.elements.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, element.internalName\r\n );\r\n } else {\r\n this.elements.set(declaration.name.text, element);\r\n this.exports.set(declaration.name.text, element);\r\n if (isBuiltin) {\r\n element.internalName = declaration.name.text;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeClass(\r\n declaration: ClassDeclaration,\r\n queuedDerivedClasses: ClassPrototype[],\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new ClassPrototype(\r\n this,\r\n declaration.name.text,\r\n internalName,\r\n declaration\r\n );\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (hasDecorator(\"unmanaged\", declaration.decorators)) {\r\n prototype.isUnmanaged = true;\r\n if (declaration.implementsTypes && declaration.implementsTypes.length) {\r\n this.error(\r\n DiagnosticCode.Structs_cannot_implement_interfaces,\r\n Range.join(\r\n declaration.name.range,\r\n declaration.implementsTypes[declaration.implementsTypes.length - 1]\r\n .range\r\n )\r\n );\r\n }\r\n } else if (declaration.implementsTypes.length) {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n // remember classes that extend another one\r\n if (declaration.extendsType) {\r\n queuedDerivedClasses.push(prototype);\r\n }\r\n\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n\r\n // otherwise add to file-level exports if exported\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n\r\n case NodeKind.METHODDECLARATION:\r\n var isGetter = hasModifier(\r\n ModifierKind.GET,\r\n memberDeclaration.modifiers\r\n );\r\n if (\r\n isGetter ||\r\n hasModifier(ModifierKind.SET, memberDeclaration.modifiers)\r\n ) {\r\n this.initializeAccessor(\r\n memberDeclaration,\r\n prototype,\r\n isGetter\r\n );\r\n } else {\r\n this.initializeMethod(\r\n memberDeclaration,\r\n prototype\r\n );\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"class member expected\");\r\n }\r\n }\r\n\r\n // check and possibly register string type\r\n if (\r\n prototype.is(ElementFlags.GLOBAL) &&\r\n declaration.name.text === \"String\" &&\r\n !this.types.has(\"string\")\r\n ) {\r\n var instance = prototype.resolve(null);\r\n if (instance) {\r\n this.types.set(\"string\", instance.type);\r\n }\r\n }\r\n }\r\n\r\n private initializeField(\r\n declaration: FieldDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n\r\n // static fields become global variables\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n var staticField = new Global(\r\n this, name, internalName, declaration, Type.void\r\n );\r\n classPrototype.members.set(name, staticField);\r\n this.elements.set(internalName, staticField);\r\n\r\n // instance fields are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instanceField = new FieldPrototype(\r\n classPrototype,\r\n name, internalName,\r\n declaration\r\n );\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n }\r\n\r\n private initializeMethod(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype: FunctionPrototype | null = null;\r\n\r\n // static methods become global functions\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n name, internalName,\r\n declaration,\r\n null\r\n );\r\n classPrototype.members.set(name, prototype);\r\n this.elements.set(internalName, prototype);\r\n\r\n // instance methods are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n name, internalName,\r\n declaration,\r\n classPrototype\r\n );\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(\r\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n declaration.name.range\r\n );\r\n } else {\r\n prototype.set(ElementFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n } else {\r\n classPrototype.instanceMembers.set(name, prototype);\r\n }\r\n }\r\n\r\n this.checkOperators(declaration.decorators, prototype, classPrototype);\r\n }\r\n\r\n private checkOperators(\r\n decorators: Decorator[] | null,\r\n prototype: FunctionPrototype,\r\n classPrototype: ClassPrototype\r\n ) {\r\n // handle operator annotations. operators are either instance methods taking\r\n // a second argument of the instance's type or static methods taking two\r\n // arguments of the instance's type. return values vary depending on the\r\n // operation.\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n if (decorator.decoratorKind == DecoratorKind.OPERATOR) {\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n continue;\r\n }\r\n var numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n var firstArg = (decorator.arguments)[0];\r\n if (\r\n firstArg.kind == NodeKind.LITERAL &&\r\n (firstArg).literalKind == LiteralKind.STRING\r\n ) {\r\n switch ((firstArg).value) {\r\n\r\n case \"[]\":\r\n classPrototype.fnIndexedGet = prototype.simpleName;\r\n break;\r\n\r\n case \"[]=\":\r\n classPrototype.fnIndexedSet = prototype.simpleName;\r\n break;\r\n\r\n case \"+\":\r\n classPrototype.fnConcat = prototype.simpleName;\r\n break;\r\n\r\n case \"==\":\r\n classPrototype.fnEquals = prototype.simpleName;\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"1\", numArgs.toString(0)\r\n );\r\n }\r\n } else if (decorator.decoratorKind != DecoratorKind.CUSTOM) {\r\n // methods support built-in @operator only\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeAccessor(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype,\r\n isGetter: bool\r\n ): void {\r\n var propertyName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n\r\n var propertyElement = this.elements.get(internalPropertyName);\r\n if (propertyElement) {\r\n if (\r\n propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? (propertyElement).getterPrototype\r\n : (propertyElement).setterPrototype\r\n )\r\n ) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n propertyElement = new Property(\r\n this,\r\n propertyName, internalPropertyName,\r\n classPrototype\r\n );\r\n }\r\n\r\n var name = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + propertyName;\r\n\r\n // static accessors become global functions\r\n if (hasModifier(ModifierKind.STATIC, declaration.modifiers)) {\r\n var staticName = classPrototype.internalName + STATIC_DELIMITER + name;\r\n if (this.elements.has(staticName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n var staticPrototype = new FunctionPrototype(\r\n this,\r\n name, staticName,\r\n declaration,\r\n null\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = staticPrototype;\r\n } else {\r\n (propertyElement).setterPrototype = staticPrototype;\r\n }\r\n if (!classPrototype.members) {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(propertyName, propertyElement); // check above\r\n this.elements.set(internalPropertyName, propertyElement);\r\n\r\n // instance accessors are remembered until resolved\r\n } else {\r\n var instanceName = classPrototype.internalName + INSTANCE_DELIMITER + name;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n var instancePrototype = new FunctionPrototype(\r\n this,\r\n name, instanceName,\r\n declaration,\r\n classPrototype\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = instancePrototype;\r\n } else {\r\n (propertyElement).setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(name, propertyElement);\r\n this.elements.set(internalPropertyName, propertyElement);\r\n }\r\n }\r\n\r\n private initializeEnum(\r\n declaration: EnumDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var enm = new Enum(this, declaration.name.text, internalName, declaration);\r\n enm.namespace = namespace;\r\n this.elements.set(internalName, enm);\r\n\r\n this.checkInternalDecorators(enm, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, enm);\r\n } else if (enm.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, enm);\r\n }\r\n\r\n var values = declaration.values;\r\n for (var i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], enm);\r\n }\r\n }\r\n\r\n private initializeEnumValue(\r\n declaration: EnumValueDeclaration,\r\n enm: Enum\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n }\r\n\r\n private initializeExports(\r\n statement: ExportStatement,\r\n queuedExports: Map\r\n ): void {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n }\r\n\r\n private setExportAndCheckLibrary(\r\n name: string,\r\n element: Element,\r\n identifier: IdentifierExpression\r\n ): void {\r\n this.exports.set(name, element);\r\n if (identifier.range.source.isLibrary) { // add global alias\r\n if (this.elements.has(identifier.text)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n identifier.range, identifier.text\r\n );\r\n } else {\r\n element.internalName = identifier.text;\r\n this.elements.set(identifier.text, element);\r\n }\r\n }\r\n }\r\n\r\n private initializeExport(\r\n member: ExportMember,\r\n internalPath: string | null,\r\n queuedExports: Map\r\n ): void {\r\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n if (this.exports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n var referencedName: string;\r\n var referencedElement: Element | null;\r\n var queuedExport: QueuedExport | null;\r\n\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the element exists\r\n if (referencedElement = this.elements.get(referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.referencedName = referencedName; // -> internal name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n\r\n // export external element\r\n } else {\r\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the export exists\r\n referencedElement = this.elements.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // walk already known queued exports\r\n var seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.exports.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n referencedName = queuedExport.referencedName;\r\n if (seen.has(queuedExport)) break;\r\n seen.add(queuedExport);\r\n } else {\r\n referencedElement = this.elements.get(queuedExport.referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.referencedName = referencedName; // -> export name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n }\r\n\r\n private initializeFunction(\r\n declaration: FunctionDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new FunctionPrototype(\r\n this,\r\n declaration.name.text, internalName,\r\n declaration,\r\n null\r\n );\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, prototype);\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n }\r\n\r\n private initializeImports(\r\n statement: ImportStatement,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(\r\n declarations[i],\r\n statement.internalPath,\r\n queuedExports, queuedImports\r\n );\r\n }\r\n } else if (statement.namespaceName) {\r\n var internalName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n statement.namespaceName.text\r\n );\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n statement.namespaceName.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n this.error( // TODO\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n }\r\n }\r\n\r\n private initializeImport(\r\n declaration: ImportDeclaration,\r\n internalPath: string,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var referencedName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n // resolve right away if the exact export exists\r\n var element: Element | null;\r\n if (element = this.exports.get(referencedName)) {\r\n this.elements.set(internalName, element);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n var indexPart = PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.internalName = internalName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (\r\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text\r\n );\r\n } else {\r\n queuedImport.referencedName = referencedName; // try exact first\r\n queuedImport.referencedNameAlt = (\r\n internalPath +\r\n indexPart +\r\n PATH_DELIMITER +\r\n declaration.externalName.text\r\n );\r\n }\r\n queuedImport.declaration = declaration;\r\n queuedImports.push(queuedImport);\r\n }\r\n\r\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var prototype = new InterfacePrototype(this, declaration.name.text, internalName, declaration);\r\n prototype.namespace = namespace;\r\n this.elements.set(internalName, prototype);\r\n\r\n this.checkInternalDecorators(prototype, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n } else if (prototype.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, prototype);\r\n }\r\n\r\n var memberDeclarations = declaration.members;\r\n for (var i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n var memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION:\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n\r\n case NodeKind.METHODDECLARATION:\r\n var isGetter = hasModifier(ModifierKind.GET, memberDeclaration.modifiers);\r\n if (isGetter || hasModifier(ModifierKind.SET, memberDeclaration.modifiers)) {\r\n this.initializeAccessor(memberDeclaration, prototype, isGetter);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n }\r\n\r\n private initializeNamespace(\r\n declaration: NamespaceDeclaration,\r\n queuedExtendingClasses: ClassPrototype[],\r\n parentNamespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n\r\n var namespace = this.elements.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, declaration.name.text, internalName, declaration);\r\n namespace.namespace = parentNamespace;\r\n this.elements.set(internalName, namespace);\r\n this.checkInternalDecorators(namespace, declaration);\r\n }\r\n\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(declaration.name.text, namespace);\r\n } else if (namespace.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.exports.set(internalName, namespace);\r\n }\r\n\r\n var members = declaration.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n this.initializeClass(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n this.initializeNamespace(members[i], queuedExtendingClasses, namespace);\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n members[i].range\r\n );\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n\r\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.types.has(name) || this.typeAliases.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n this.typeAliases.set(name, declaration.alias);\r\n }\r\n\r\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n var declarations = statement.declarations;\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elements.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n\r\n var global = new Global(\r\n this,\r\n declaration.name.text,\r\n internalName,\r\n declaration,\r\n Type.void // resolved later on\r\n );\r\n global.namespace = namespace;\r\n this.elements.set(internalName, global);\r\n\r\n this.checkInternalDecorators(global, declaration);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(declaration.name.text)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(declaration.name.text, global);\r\n } else if (global.is(ElementFlags.EXPORTED)) {\r\n if (this.exports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n } else {\r\n this.exports.set(internalName, global);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Resolves a {@link TypeNode} to a concrete {@link Type}. */\r\n resolveType(\r\n node: TypeNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportNotFound: bool = true\r\n ): Type | null {\r\n var globalName = node.name.text;\r\n var localName = node.range.source.internalPath + PATH_DELIMITER + node.name.text;\r\n\r\n var element: Element | null;\r\n\r\n // check file-global / program-global element\r\n if ((element = this.elements.get(localName)) || (element = this.elements.get(globalName))) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n var instance = (element).resolveInclTypeArguments(\r\n node.typeArguments,\r\n contextualTypeArguments,\r\n null\r\n ); // reports\r\n return instance ? instance.type : null;\r\n }\r\n }\r\n\r\n // resolve parameters\r\n var k = node.typeArguments.length;\r\n var paramTypes = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var paramType = this.resolveType( // reports\r\n node.typeArguments[i],\r\n contextualTypeArguments,\r\n reportNotFound\r\n );\r\n if (!paramType) return null;\r\n paramTypes[i] = paramType;\r\n }\r\n\r\n if (k) { // can't be a placeholder if it has parameters\r\n var instanceKey = typesToString(paramTypes);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n } else if (contextualTypeArguments) {\r\n var placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType) return placeholderType;\r\n }\r\n\r\n var type: Type | null;\r\n\r\n // check file-global / program-global type\r\n if ((type = this.types.get(localName)) || (type = this.types.get(globalName))) {\r\n return type;\r\n }\r\n\r\n // check type alias\r\n var alias = this.typeAliases.get(globalName);\r\n if (alias && (type = this.resolveType(alias, null, reportNotFound))) {\r\n return type;\r\n }\r\n\r\n if (reportNotFound) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n node.name.range, globalName\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves an array of type parameters to concrete types. */\r\n resolveTypeArguments(\r\n typeParameters: TypeParameter[],\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): Type[] | null {\r\n var parameterCount = typeParameters.length;\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (parameterCount != argumentCount) {\r\n if (argumentCount) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n Range.join(\r\n (typeArgumentNodes)[0].range,\r\n (typeArgumentNodes)[argumentCount - 1].range\r\n ),\r\n parameterCount.toString(10), argumentCount.toString(10)\r\n );\r\n } else if (alternativeReportNode) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n alternativeReportNode.range.atEnd, parameterCount.toString(10), \"0\"\r\n );\r\n }\r\n return null;\r\n }\r\n var typeArguments = new Array(parameterCount);\r\n for (var i = 0; i < parameterCount; ++i) {\r\n var type = this.resolveType( // reports\r\n (typeArgumentNodes)[i],\r\n contextualTypeArguments,\r\n true\r\n );\r\n if (!type) return null;\r\n // TODO: check extendsType\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n }\r\n\r\n /** Resolves an identifier to the element it refers to. */\r\n resolveIdentifier(\r\n identifier: IdentifierExpression,\r\n contextualFunction: Function | null,\r\n contextualEnum: Enum | null = null\r\n ): ResolvedElement | null {\r\n var name = identifier.text;\r\n\r\n var element: Element | null;\r\n var namespace: Element | null;\r\n\r\n // check siblings\r\n if (contextualEnum) {\r\n\r\n if (\r\n contextualEnum.members &&\r\n (element = contextualEnum.members.get(name)) &&\r\n element.kind == ElementKind.ENUMVALUE\r\n ) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n } else if (contextualFunction) {\r\n\r\n // check locals\r\n if (element = contextualFunction.flow.getScopedLocal(name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n // search contextual parent namespaces if applicable\r\n if (namespace = contextualFunction.prototype.namespace) {\r\n do {\r\n if (element = this.elements.get(namespace.internalName + STATIC_DELIMITER + name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n } while (namespace = namespace.namespace);\r\n }\r\n }\r\n\r\n // search current file\r\n if (element = this.elements.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n // search global scope\r\n if (element = this.elements.get(name)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(element);\r\n }\r\n\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n identifier.range, name\r\n );\r\n return null;\r\n }\r\n\r\n /** Resolves a property access to the element it refers to. */\r\n resolvePropertyAccess(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualFunction: Function\r\n ): ResolvedElement | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction); // reports\r\n if (!resolvedElement) return null;\r\n var target = resolvedElement.element;\r\n\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n var targetType: Type;\r\n var member: Element | null;\r\n\r\n // Resolve variable-likes to their class type first\r\n switch (target.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n if (!(targetType = (target).type).classType) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, targetType.toString()\r\n );\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n\r\n case ElementKind.PROPERTY:\r\n var getter = assert((target).getterPrototype).resolve(); // reports\r\n if (!getter) return null;\r\n if (!(targetType = getter.returnType).classType) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, targetType.toString()\r\n );\r\n return null;\r\n }\r\n target = targetType.classType;\r\n break;\r\n }\r\n\r\n // Look up the member within\r\n switch (target.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS:\r\n do {\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n // check inherited static members on the base prototype while target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if ((target).basePrototype) {\r\n target = (target).basePrototype;\r\n } else {\r\n break;\r\n }\r\n // or inherited instance members on the cbase class while target is a class instance\r\n } else if (target.kind == ElementKind.CLASS) {\r\n if ((target).base) {\r\n target = (target).base;\r\n } else {\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n\r\n default: // enums or other namespace-like elements\r\n if (target.members && (member = target.members.get(propertyName))) {\r\n return resolvedElement.set(member).withTarget(target, targetExpression);\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveElementAccess(elementAccess: ElementAccessExpression, contextualFunction: Function): ResolvedElement | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = elementAccess.expression;\r\n resolvedElement = this.resolveExpression(targetExpression, contextualFunction);\r\n if (!resolvedElement) return null;\r\n var target = resolvedElement.element;\r\n switch (target.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n var type = (target).type;\r\n if (type.classType) {\r\n var indexedGetName = (target = type.classType).prototype.fnIndexedGet;\r\n var indexedGet: Element | null;\r\n if (\r\n indexedGetName != null &&\r\n target.members &&\r\n (indexedGet = target.members.get(indexedGetName)) &&\r\n indexedGet.kind == ElementKind.FUNCTION_PROTOTYPE\r\n ) {\r\n return resolvedElement.set(indexedGet).withTarget(type.classType, targetExpression);\r\n }\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n targetExpression.range, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveExpression(expression: Expression, contextualFunction: Function): ResolvedElement | null {\r\n var classType: Class | null;\r\n\r\n while (expression.kind == NodeKind.PARENTHESIZED) {\r\n expression = (expression).expression;\r\n }\r\n\r\n switch (expression.kind) {\r\n\r\n case NodeKind.ASSERTION:\r\n var type = this.resolveType((expression).toType); // reports\r\n if (type && (classType = type.classType)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n return null;\r\n\r\n case NodeKind.BINARY:\r\n // TODO: string concatenation, mostly\r\n throw new Error(\"not implemented\");\r\n\r\n case NodeKind.THIS: // -> Class\r\n if (classType = contextualFunction.instanceMethodOf) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n return null;\r\n\r\n case NodeKind.SUPER: // -> Class\r\n if ((classType = contextualFunction.instanceMethodOf) && (classType = classType.base)) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(classType);\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n return null;\r\n\r\n case NodeKind.IDENTIFIER:\r\n return this.resolveIdentifier(expression, contextualFunction);\r\n\r\n case NodeKind.PROPERTYACCESS:\r\n return this.resolvePropertyAccess(expression, contextualFunction);\r\n\r\n case NodeKind.ELEMENTACCESS:\r\n return this.resolveElementAccess(expression, contextualFunction);\r\n\r\n case NodeKind.CALL:\r\n var resolved = this.resolveExpression((expression).expression, contextualFunction);\r\n if (resolved) {\r\n var element = resolved.element;\r\n if (element && element.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = (element).resolveInclTypeArguments(\r\n (expression).typeArguments,\r\n null,\r\n expression\r\n );\r\n if (instance && instance.returnType.classType) {\r\n if (!resolvedElement) resolvedElement = new ResolvedElement();\r\n return resolvedElement.set(instance.returnType.classType);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return null;\r\n }\r\n}\r\n\r\n/** Common result structure returned when calling any of the resolve functions on a {@link Program}. */\r\nexport class ResolvedElement {\r\n\r\n /** The target element, if a property or element access */\r\n target: Element | null;\r\n /** The target element's expression, if a property or element access. */\r\n targetExpression: Expression | null;\r\n /** The element being accessed. */\r\n element: Element;\r\n\r\n /** Clears the target and sets the resolved element. */\r\n set(element: Element): this {\r\n this.target = null;\r\n this.targetExpression = null;\r\n this.element = element;\r\n return this;\r\n }\r\n\r\n /** Sets the resolved target in addition to the previously set element. */\r\n withTarget(target: Element, targetExpression: Expression): this {\r\n this.target = target;\r\n this.targetExpression = targetExpression;\r\n return this;\r\n }\r\n}\r\n\r\n// Cached result structure instance\r\nvar resolvedElement: ResolvedElement | null;\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n /** A {@link Global}. */\r\n GLOBAL,\r\n /** A {@link Local}. */\r\n LOCAL,\r\n /** An {@link Enum}. */\r\n ENUM,\r\n /** An {@link EnumValue}. */\r\n ENUMVALUE,\r\n /** A {@link FunctionPrototype}. */\r\n FUNCTION_PROTOTYPE,\r\n /** A {@link Function}. */\r\n FUNCTION,\r\n /** A {@link ClassPrototype}. */\r\n CLASS_PROTOTYPE,\r\n /** A {@link Class}. */\r\n CLASS,\r\n /** An {@link InterfacePrototype}. */\r\n INTERFACE_PROTOTYPE,\r\n /** An {@link Interface}. */\r\n INTERFACE,\r\n /** A {@link FieldPrototype}. */\r\n FIELD_PROTOTYPE,\r\n /** A {@link Field}. */\r\n FIELD,\r\n /** A {@link Property}. */\r\n PROPERTY,\r\n /** A {@link Namespace}. */\r\n NAMESPACE\r\n}\r\n\r\n/** Indicates traits of an {@link Element}. */\r\nexport enum ElementFlags {\r\n /** No flags set. */\r\n NONE = 0,\r\n /** Is compiled. */\r\n COMPILED = 1 << 0,\r\n /** Is an import. */\r\n IMPORTED = 1 << 1,\r\n /** Is an export. */\r\n EXPORTED = 1 << 2,\r\n /** Is built-in. */\r\n BUILTIN = 1 << 3,\r\n /** Is declared. */\r\n DECLARED = 1 << 4,\r\n /** Is generic. */\r\n GENERIC = 1 << 5,\r\n /** Is constant. */\r\n CONSTANT = 1 << 6,\r\n /** Has a constant value and is therefore inlined. */\r\n INLINED = 1 << 7,\r\n /** Is instance member. */\r\n INSTANCE = 1 << 8,\r\n /** Is getter. */\r\n GETTER = 1 << 9,\r\n /** Is setter. */\r\n SETTER = 1 << 10,\r\n /** Is global. */\r\n GLOBAL = 1 << 11,\r\n /** Is read-only. */\r\n READONLY = 1 << 12,\r\n /** Is a public member. */\r\n PUBLIC = 1 << 13,\r\n /** Is a protected member. */\r\n PROTECTED = 1 << 14,\r\n /** Is a private member. */\r\n PRIVATE = 1 << 15,\r\n /** Is an abstract member. */\r\n ABSTRACT = 1 << 16,\r\n /** Is a constructor. */\r\n CONSTRUCTOR = 1 << 17,\r\n /** Is an unmanaged class with limited capabilites. */\r\n UNMANAGED = 1 << 18,\r\n /** Is scoped. */\r\n SCOPED = 1 << 19,\r\n /** Is the start function. */\r\n START = 1 << 20\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n /** Specific element kind. */\r\n kind: ElementKind;\r\n /** Containing {@link Program}. */\r\n program: Program;\r\n /** Simple name. */\r\n simpleName: string;\r\n /** Internal name referring to this element. */\r\n internalName: string;\r\n /** Element flags. */\r\n flags: ElementFlags = ElementFlags.NONE;\r\n /** Namespaced member elements. */\r\n members: Map | null = null;\r\n /** Parent namespace, if applicable. */\r\n namespace: Element | null = null;\r\n\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n protected constructor(program: Program, simpleName: string, internalName: string) {\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n\r\n /** Tests if this element has a specific flag or flags. */\r\n is(flag: ElementFlags): bool { return (this.flags & flag) == flag; }\r\n\r\n /** Sets a specific flag or flags. */\r\n set(flag: ElementFlags): void { this.flags |= flag; }\r\n}\r\n\r\n/** A namespace. */\r\nexport class Namespace extends Element {\r\n\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n kind = ElementKind.NAMESPACE;\r\n\r\n /** Declaration reference. */\r\n declaration: NamespaceDeclaration; // more specific\r\n\r\n /** Constructs a new namespace. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: NamespaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n kind = ElementKind.ENUM;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumDeclaration;\r\n\r\n /** Constructs a new enum. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n case ModifierKind.CONST: this.set(ElementFlags.CONSTANT); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n kind = ElementKind.ENUMVALUE;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumValueDeclaration;\r\n /** Parent enum. */\r\n enum: Enum;\r\n /** Constant value, if applicable. */\r\n constantValue: i32 = 0;\r\n\r\n constructor(\r\n enm: Enum,\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumValueDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.enum = enm;\r\n this.declaration = declaration;\r\n }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n NONE,\r\n INTEGER,\r\n FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n // kind varies\r\n\r\n /** Declaration reference. */\r\n declaration: VariableLikeDeclarationStatement;\r\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n type: Type;\r\n /** Constant value kind. */\r\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n /** Constant integer value, if applicable. */\r\n constantIntegerValue: I64;\r\n /** Constant float value, if applicable. */\r\n constantFloatValue: f64;\r\n\r\n withConstantIntegerValue(lo: i32, hi: i32): this {\r\n this.constantValueKind = ConstantValueKind.INTEGER;\r\n this.constantIntegerValue = i64_new(lo, hi);\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n }\r\n\r\n withConstantFloatValue(value: f64): this {\r\n this.constantValueKind = ConstantValueKind.FLOAT;\r\n this.constantFloatValue = value;\r\n this.set(ElementFlags.CONSTANT | ElementFlags.INLINED);\r\n return this;\r\n }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n kind = ElementKind.GLOBAL;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: VariableLikeDeclarationStatement,\r\n type: Type\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.IMPORT:\r\n this.set(ElementFlags.IMPORTED);\r\n break;\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.CONST:\r\n this.set(ElementFlags.CONSTANT);\r\n break;\r\n\r\n case ModifierKind.LET:\r\n this.set(ElementFlags.SCOPED);\r\n break;\r\n\r\n case ModifierKind.DECLARE:\r\n this.set(ElementFlags.DECLARED);\r\n break;\r\n\r\n case ModifierKind.READONLY:\r\n this.set(this.declaration.initializer\r\n ? ElementFlags.CONSTANT | ElementFlags.READONLY\r\n : ElementFlags.READONLY\r\n );\r\n break;\r\n\r\n case ModifierKind.PUBLIC:\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.STATIC:\r\n break; // static fields become globals\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n this.type = type; // resolved later if `void`\r\n }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n // not an Element on its own\r\n\r\n /** Parameter name. */\r\n name: string;\r\n /** Parameter type. */\r\n type: Type;\r\n /** Parameter initializer. */\r\n initializer: Expression | null;\r\n\r\n /** Constructs a new function parameter. */\r\n constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n kind = ElementKind.LOCAL;\r\n\r\n /** Local index. */\r\n index: i32;\r\n\r\n constructor(program: Program, simpleName: string, index: i32, type: Type) {\r\n super(program, simpleName, simpleName);\r\n this.index = index;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FunctionDeclaration;\r\n /** If an instance method, the class prototype reference. */\r\n classPrototype: ClassPrototype | null;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. */\r\n classTypeArguments: Type[] | null = null;\r\n\r\n /** Constructs a new function prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FunctionDeclaration,\r\n classPrototype: ClassPrototype | null = null\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.IMPORT:\r\n this.set(ElementFlags.IMPORTED);\r\n break;\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.DECLARE:\r\n this.set(ElementFlags.DECLARED);\r\n break;\r\n\r\n case ModifierKind.GET:\r\n this.set(ElementFlags.GETTER);\r\n break;\r\n\r\n case ModifierKind.SET:\r\n this.set(ElementFlags.SETTER);\r\n break;\r\n\r\n case ModifierKind.STATIC:\r\n case ModifierKind.ABSTRACT:\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.PUBLIC:\r\n break; // already handled\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (this.declaration.typeParameters.length) {\r\n this.set(ElementFlags.GENERIC);\r\n }\r\n if (this.classPrototype = classPrototype) {\r\n this.set(ElementFlags.INSTANCE);\r\n }\r\n }\r\n\r\n resolve(\r\n functionTypeArguments: Type[] | null = null,\r\n contextualTypeArguments: Map | null = null\r\n ): Function | null {\r\n var instanceKey = functionTypeArguments ? typesToString(functionTypeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n var declaration = this.declaration;\r\n\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n for (var [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n\r\n var i: i32, k: i32;\r\n\r\n // inherit class type arguments if a partially resolved instance method (classTypeArguments is set)\r\n if (this.classTypeArguments) {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n var classDeclaration = (this.classPrototype).declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n if ((k = this.classTypeArguments.length) != classTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(classTypeParameters[i].name.text, this.classTypeArguments[i]);\r\n }\r\n }\r\n\r\n // override call specific contextual type arguments\r\n var functionTypeParameters = declaration.typeParameters;\r\n if (functionTypeArguments && (k = functionTypeArguments.length)) {\r\n if (k != functionTypeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(functionTypeParameters[i].name.text, functionTypeArguments[i]);\r\n }\r\n }\r\n\r\n // resolve parameters\r\n // TODO: 'this' type\r\n k = declaration.parameters.length;\r\n var parameters = new Array(k);\r\n var parameterTypes = new Array(k);\r\n var typeNode: TypeNode | null;\r\n for (i = 0; i < k; ++i) {\r\n var parameterDeclaration = declaration.parameters[i];\r\n typeNode = assert(parameterDeclaration.type);\r\n var parameterType = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (parameterType) {\r\n parameters[i] = new Parameter(parameterDeclaration.name.text, parameterType, parameterDeclaration.initializer);\r\n parameterTypes[i] = parameterType;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n var classInstance: Class | null = null;\r\n if (this.classPrototype) {\r\n classInstance = this.classPrototype.resolve(this.classTypeArguments, contextualTypeArguments); // reports\r\n if (!classInstance) return null;\r\n }\r\n\r\n // resolve return type\r\n // TODO: 'this' type\r\n var returnType: Type;\r\n if (this.is(ElementFlags.SETTER) || this.is(ElementFlags.CONSTRUCTOR)) {\r\n returnType = Type.void; // not annotated\r\n } else {\r\n typeNode = assert(declaration.returnType);\r\n var type = this.program.resolveType(typeNode, contextualTypeArguments, true); // reports\r\n if (type) {\r\n returnType = type;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n instance = new Function(this, internalName, functionTypeArguments, parameters, returnType, classInstance);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n return instance;\r\n }\r\n\r\n resolveInclTypeArguments(\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(\r\n this.declaration.typeParameters,\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n }\r\n\r\n resolvePartial(classTypeArguments: Type[] | null): FunctionPrototype | null {\r\n if (!this.classPrototype) {\r\n throw new Error(\"partially resolved instance method must reference its class prototype\");\r\n }\r\n if (classTypeArguments && classTypeArguments.length) {\r\n var partialPrototype = new FunctionPrototype(\r\n this.program,\r\n this.simpleName,\r\n this.internalName,\r\n this.declaration,\r\n this.classPrototype\r\n );\r\n partialPrototype.flags = this.flags;\r\n partialPrototype.classTypeArguments = classTypeArguments;\r\n return partialPrototype;\r\n }\r\n return this; // no need to clone\r\n }\r\n\r\n toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n kind = ElementKind.FUNCTION;\r\n\r\n /** Prototype reference. */\r\n prototype: FunctionPrototype;\r\n /** Concrete type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Concrete function parameters. Excluding `this` if an instance method. */\r\n parameters: Parameter[] | null;\r\n /** Concrete return type. */\r\n returnType: Type;\r\n /** If an instance method, the concrete class it is a member of. */\r\n instanceMethodOf: Class | null;\r\n /** Map of locals by name. */\r\n locals: Map = new Map();\r\n /** List of additional non-parameter locals. */\r\n additionalLocals: Type[] = [];\r\n /** Current break context label. */\r\n breakContext: string | null = null;\r\n /** Contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Current control flow. */\r\n flow: Flow;\r\n /** Remembered debug locations. */\r\n debugLocations: Range[] | null = null;\r\n\r\n private nextBreakId: i32 = 0;\r\n private breakStack: i32[] | null = null;\r\n\r\n /** Constructs a new concrete function. */\r\n constructor(\r\n prototype: FunctionPrototype,\r\n internalName: string,\r\n typeArguments: Type[] | null,\r\n parameters: Parameter[] | null,\r\n returnType: Type,\r\n instanceMethodOf: Class | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.typeArguments = typeArguments;\r\n this.parameters = parameters || [];\r\n this.returnType = returnType;\r\n this.instanceMethodOf = instanceMethodOf;\r\n this.flags = prototype.flags;\r\n if (!(prototype.is(ElementFlags.BUILTIN) || prototype.is(ElementFlags.DECLARED))) {\r\n var localIndex = 0;\r\n if (instanceMethodOf) {\r\n assert(this.is(ElementFlags.INSTANCE)); // internal error\r\n this.locals.set(\"this\", new Local(prototype.program, \"this\", localIndex++, instanceMethodOf.type));\r\n if (instanceMethodOf.contextualTypeArguments) {\r\n if (!this.contextualTypeArguments) {\r\n this.contextualTypeArguments = new Map();\r\n }\r\n for (var [inheritedName, inheritedType] of instanceMethodOf.contextualTypeArguments) {\r\n this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n } else {\r\n assert(!this.is(ElementFlags.INSTANCE)); // internal error\r\n }\r\n for (var i = 0, k = this.parameters.length; i < k; ++i) {\r\n var parameter = this.parameters[i];\r\n var parameterName = assert(parameter.name, \"parameter must be named\"); // not a builtin or declared\r\n this.locals.set(\r\n parameterName,\r\n new Local(\r\n prototype.program,\r\n parameterName,\r\n localIndex++,\r\n parameter.type\r\n )\r\n );\r\n }\r\n }\r\n this.flow = Flow.create(this);\r\n }\r\n\r\n /** Adds a local of the specified type, with an optional name. */\r\n addLocal(type: Type, name: string | null = null): Local {\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = (this.parameters ? this.parameters.length : 0) + this.additionalLocals.length;\r\n if (this.is(ElementFlags.INSTANCE)) localIndex++; // plus 'this'\r\n var local = new Local(\r\n this.prototype.program,\r\n name\r\n ? name\r\n : \"var$\" + localIndex.toString(10),\r\n localIndex,\r\n type\r\n );\r\n if (name) {\r\n if (this.locals.has(name)) throw new Error(\"duplicate local name\");\r\n this.locals.set(name, local);\r\n }\r\n this.additionalLocals.push(type);\r\n return local;\r\n }\r\n\r\n private tempI32s: Local[] | null = null;\r\n private tempI64s: Local[] | null = null;\r\n private tempF32s: Local[] | null = null;\r\n private tempF64s: Local[] | null = null;\r\n\r\n /** Gets a free temporary local of the specified type. */\r\n getTempLocal(type: Type): Local {\r\n var temps: Local[] | null;\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s; break;\r\n case NativeType.I64: temps = this.tempI64s; break;\r\n case NativeType.F32: temps = this.tempF32s; break;\r\n case NativeType.F64: temps = this.tempF64s; break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps && temps.length) {\r\n var ret = temps.pop();\r\n ret.type = type;\r\n return ret;\r\n }\r\n return this.addLocal(type);\r\n }\r\n\r\n /** Frees the temporary local for reuse. */\r\n freeTempLocal(local: Local): void {\r\n var temps: Local[];\r\n assert(local.type != null); // internal error\r\n switch ((local.type).toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s || (this.tempI32s = []); break;\r\n case NativeType.I64: temps = this.tempI64s || (this.tempI64s = []); break;\r\n case NativeType.F32: temps = this.tempF32s || (this.tempF32s = []); break;\r\n case NativeType.F64: temps = this.tempF64s || (this.tempF64s = []); break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n temps.push(local);\r\n }\r\n\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n getAndFreeTempLocal(type: Type): Local {\r\n var temps: Local[];\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: temps = this.tempI32s || (this.tempI32s = []); break;\r\n case NativeType.I64: temps = this.tempI64s || (this.tempI64s = []); break;\r\n case NativeType.F32: temps = this.tempF32s || (this.tempF32s = []); break;\r\n case NativeType.F64: temps = this.tempF64s || (this.tempF64s = []); break;\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n if (temps.length > 0) {\r\n return temps[temps.length - 1];\r\n }\r\n var local: Local = this.addLocal(type);\r\n temps.push(local);\r\n return local;\r\n }\r\n\r\n /** Enters a(nother) break context. */\r\n enterBreakContext(): string {\r\n var id = this.nextBreakId++;\r\n if (!this.breakStack) {\r\n this.breakStack = [ id ];\r\n } else {\r\n this.breakStack.push(id);\r\n }\r\n return this.breakContext = id.toString(10);\r\n }\r\n\r\n /** Leaves the current break context. */\r\n leaveBreakContext(): void {\r\n assert(this.breakStack != null);\r\n var length = (this.breakStack).length;\r\n assert(length > 0);\r\n (this.breakStack).pop();\r\n if (length > 1) {\r\n this.breakContext = (this.breakStack)[length - 2].toString(10);\r\n } else {\r\n this.breakContext = null;\r\n this.breakStack = null;\r\n }\r\n }\r\n\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n finalize(module: Module, ref: FunctionRef): void {\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakContext = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n var debugLocations = this.debugLocations;\r\n if (debugLocations) {\r\n for (var i = 0, k = debugLocations.length; i < k; ++i) {\r\n var debugLocation = debugLocations[i];\r\n module.setDebugLocation(\r\n ref,\r\n debugLocation.debugInfoRef,\r\n debugLocation.source.debugInfoIndex,\r\n debugLocation.line,\r\n debugLocation.column\r\n );\r\n }\r\n }\r\n }\r\n this.debugLocations = null;\r\n }\r\n\r\n /** Returns the TypeScript representation of this function. */\r\n toString(): string { return this.prototype.simpleName; }\r\n\r\n /** Returns the function type TypeScript representation of this function.*/\r\n toTypeString(): string { throw new Error(\"not implemented\"); }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FieldDeclaration;\r\n /** Parent class prototype. */\r\n classPrototype: ClassPrototype;\r\n\r\n /** Constructs a new field prototype. */\r\n constructor(\r\n classPrototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FieldDeclaration\r\n ) {\r\n super(classPrototype.program, simpleName, internalName);\r\n this.classPrototype = classPrototype;\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n\r\n case ModifierKind.EXPORT:\r\n this.set(ElementFlags.EXPORTED);\r\n break;\r\n\r\n case ModifierKind.READONLY:\r\n this.set(ElementFlags.READONLY);\r\n break;\r\n\r\n case ModifierKind.PRIVATE:\r\n case ModifierKind.PROTECTED:\r\n case ModifierKind.PUBLIC:\r\n case ModifierKind.STATIC:\r\n break; // already handled\r\n\r\n default:\r\n throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Whether the field is read-only or not. */\r\n get isReadonly(): bool {\r\n return (this.flags & ElementFlags.READONLY) != 0;\r\n }\r\n set isReadonly(is: bool) {\r\n if (is) {\r\n this.flags |= ElementFlags.READONLY;\r\n } else {\r\n this.flags &= ~ElementFlags.READONLY;\r\n }\r\n }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n kind = ElementKind.FIELD;\r\n\r\n /** Field prototype reference. */\r\n prototype: FieldPrototype;\r\n /** Field memory offset, if an instance field. */\r\n memoryOffset: i32 = -1;\r\n\r\n /** Constructs a new field. */\r\n constructor(prototype: FieldPrototype, internalName: string, type: Type) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.type = type;\r\n }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n kind = ElementKind.PROPERTY;\r\n\r\n /** Parent class prototype. */\r\n parent: ClassPrototype;\r\n /** Getter prototype. */\r\n getterPrototype: FunctionPrototype | null = null;\r\n /** Setter prototype. */\r\n setterPrototype: FunctionPrototype | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n parent: ClassPrototype\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: ClassDeclaration;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Instance member prototypes. */\r\n instanceMembers: Map | null = null;\r\n /** Base class prototype, if applicable. */\r\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n constructorPrototype: FunctionPrototype | null = null;\r\n\r\n /** Overloaded indexed get method, if any. */\r\n fnIndexedGet: string | null = null;\r\n /** Overloaded indexed set method, if any. */\r\n fnIndexedSet: string | null = null;\r\n /** Overloaded concatenation method, if any. */\r\n fnConcat: string | null = null;\r\n /** Overloaded equality comparison method, if any. */\r\n fnEquals: string | null = null;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: ClassDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n if (this.declaration.modifiers) {\r\n for (var i = 0, k = this.declaration.modifiers.length; i < k; ++i) {\r\n switch (this.declaration.modifiers[i].modifierKind) {\r\n case ModifierKind.IMPORT: this.set(ElementFlags.IMPORTED); break;\r\n case ModifierKind.EXPORT: this.set(ElementFlags.EXPORTED); break;\r\n case ModifierKind.DECLARE: this.set(ElementFlags.DECLARED); break;\r\n default: throw new Error(\"unexpected modifier\");\r\n }\r\n }\r\n }\r\n if (this.declaration.typeParameters.length) {\r\n this.set(ElementFlags.GENERIC);\r\n }\r\n }\r\n\r\n /** Whether an unamanaged class or not. */\r\n get isUnmanaged(): bool {\r\n return (this.flags & ElementFlags.UNMANAGED) != 0;\r\n }\r\n set isUnmanaged(is: bool) {\r\n if (is) {\r\n this.flags |= ElementFlags.UNMANAGED;\r\n } else {\r\n this.flags &= ~ElementFlags.UNMANAGED;\r\n }\r\n }\r\n\r\n resolve(typeArguments: Type[] | null, contextualTypeArguments: Map | null = null): Class | null {\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n var instance = this.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n // inherit contextual type arguments\r\n var inheritedTypeArguments = contextualTypeArguments;\r\n contextualTypeArguments = new Map();\r\n if (inheritedTypeArguments) {\r\n for (var [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n\r\n var declaration = this.declaration;\r\n var baseClass: Class | null = null;\r\n if (declaration.extendsType) {\r\n var baseClassType = this.program.resolveType(declaration.extendsType, null); // reports\r\n if (!baseClassType) return null;\r\n if (!(baseClass = baseClassType.classType)) {\r\n this.program.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n declaration.extendsType.range\r\n );\r\n return null;\r\n }\r\n if (baseClass.prototype.isUnmanaged != this.isUnmanaged) {\r\n this.program.error(\r\n DiagnosticCode.Structs_cannot_extend_classes_and_vice_versa,\r\n Range.join(declaration.name.range, declaration.extendsType.range)\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n // override call specific contextual type arguments if provided\r\n var i: i32, k: i32;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n for (i = 0; i < k; ++i) {\r\n contextualTypeArguments.set(declaration.typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n } else if (declaration.typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n\r\n var internalName = this.internalName;\r\n if (instanceKey.length) {\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(this, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n this.instances.set(instanceKey, instance);\r\n\r\n var memoryOffset: u32 = 0;\r\n if (baseClass) {\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n if (baseClass.members) {\r\n if (!instance.members) instance.members = new Map();\r\n for (var inheritedMember of baseClass.members.values()) {\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n }\r\n\r\n if (this.constructorPrototype) {\r\n var partialConstructor = this.constructorPrototype.resolvePartial(typeArguments); // reports\r\n if (partialConstructor) {\r\n instance.constructorInstance = partialConstructor.resolve(); // reports\r\n }\r\n // TODO: ^ doesn't know the return type, hence returns null\r\n }\r\n\r\n if (this.instanceMembers) {\r\n for (var member of this.instanceMembers.values()) {\r\n switch (member.kind) {\r\n\r\n case ElementKind.FIELD_PROTOTYPE: // fields are layed out in advance\r\n if (!instance.members) instance.members = new Map();\r\n var fieldDeclaration = (member).declaration;\r\n if (!fieldDeclaration.type) {\r\n throw new Error(\"type expected\"); // TODO: check if parent class defines a type\r\n }\r\n var fieldType = this.program.resolveType( // reports\r\n fieldDeclaration.type,\r\n instance.contextualTypeArguments\r\n );\r\n if (fieldType) {\r\n var fieldInstance = new Field(member, (member).internalName, fieldType);\r\n switch (fieldType.byteSize) { // align\r\n case 1: break;\r\n case 2: if (memoryOffset & 1) ++memoryOffset; break;\r\n case 4: if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break;\r\n case 8: if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break;\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n }\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE: // instance methods remain partially resolved prototypes until compiled\r\n if (!instance.members) instance.members = new Map();\r\n var methodPrototype = (member).resolvePartial(typeArguments); // reports\r\n if (methodPrototype) {\r\n instance.members.set(member.simpleName, methodPrototype);\r\n }\r\n break;\r\n\r\n case ElementKind.PROPERTY: // instance properties are cloned with partially resolved getters and setters\r\n if (!instance.members) instance.members = new Map();\r\n assert((member).getterPrototype);\r\n var instanceProperty = new Property(this.program, member.simpleName, member.internalName, this);\r\n instanceProperty.getterPrototype = (\r\n ((member).getterPrototype).resolvePartial(\r\n typeArguments\r\n )\r\n );\r\n if ((member).setterPrototype) {\r\n instanceProperty.setterPrototype = (\r\n ((member).setterPrototype).resolvePartial(\r\n typeArguments\r\n )\r\n );\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n\r\n default:\r\n throw new Error(\"instance member expected\");\r\n }\r\n }\r\n }\r\n instance.currentMemoryOffset = memoryOffset; // sizeof() is its byte size in memory\r\n return instance;\r\n }\r\n\r\n resolveInclTypeArguments(\r\n typeArgumentNodes: TypeNode[] | null,\r\n contextualTypeArguments: Map | null,\r\n alternativeReportNode: Node | null\r\n ): Class | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (this.is(ElementFlags.GENERIC)) {\r\n assert(typeArgumentNodes != null && typeArgumentNodes.length != 0);\r\n resolvedTypeArguments = this.program.resolveTypeArguments(\r\n this.declaration.typeParameters,\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n } else {\r\n assert(typeArgumentNodes == null || !typeArgumentNodes.length);\r\n }\r\n return this.resolve(resolvedTypeArguments, contextualTypeArguments);\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n kind = ElementKind.CLASS;\r\n\r\n /** Prototype reference. */\r\n prototype: ClassPrototype;\r\n /** Resolved type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Resolved class type. */\r\n type: Type;\r\n /** Base class, if applicable. */\r\n base: Class | null;\r\n /** Contextual type arguments for fields and methods. */\r\n contextualTypeArguments: Map | null = null;\r\n /** Current member memory offset. */\r\n currentMemoryOffset: u32 = 0;\r\n /** Constructor instance. */\r\n constructorInstance: Function | null = null;\r\n\r\n /** Constructs a new class. */\r\n constructor(\r\n prototype: ClassPrototype,\r\n internalName: string,\r\n typeArguments: Type[] | null = null,\r\n base: Class | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.typeArguments = typeArguments;\r\n this.type = prototype.program.options.usizeType.asClass(this);\r\n this.base = base;\r\n\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n if (base.contextualTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (var [baseName, baseType] of base.contextualTypeArguments) {\r\n this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n }\r\n\r\n // apply instance-specific contextual type arguments\r\n var declaration = this.prototype.declaration;\r\n var i: i32, k: i32;\r\n if (declaration) { // irrelevant for built-ins\r\n var typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n } else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n }\r\n\r\n toString(): string {\r\n return this.prototype.simpleName;\r\n }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: InterfaceDeclaration; // more specific\r\n\r\n /** Constructs a new interface prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: InterfaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName, declaration);\r\n }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n kind = ElementKind.INTERFACE;\r\n\r\n /** Prototype reference. */\r\n prototype: InterfacePrototype; // more specific\r\n /** Base interface, if applcable. */\r\n base: Interface | null; // more specific\r\n\r\n /** Constructs a new interface. */\r\n constructor(\r\n prototype: InterfacePrototype,\r\n internalName: string,\r\n typeArguments: Type[] = [],\r\n base: Interface | null = null\r\n ) {\r\n super(prototype, internalName, typeArguments, base);\r\n }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n /** No specific conditions. */\r\n NONE = 0,\r\n /** This branch always returns. */\r\n RETURNS = 1 << 0,\r\n /** This branch possibly throws. */\r\n POSSIBLY_THROWS = 1 << 1,\r\n /** This branch possible breaks. */\r\n POSSIBLY_BREAKS = 1 << 2,\r\n /** This branch possible continues. */\r\n POSSIBLY_CONTINUES = 1 << 3\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n /** Parent flow. */\r\n parent: Flow | null;\r\n /** Flow flags indicating specific conditions. */\r\n flags: FlowFlags;\r\n /** Function this flow belongs to. */\r\n currentFunction: Function;\r\n /** The label we break to when encountering a continue statement. */\r\n continueLabel: string | null;\r\n /** The label we break to when encountering a break statement. */\r\n breakLabel: string | null;\r\n /** Scoped local variables. */\r\n scopedLocals: Map | null = null;\r\n\r\n /** Creates the parent flow of the specified function. */\r\n static create(currentFunction: Function): Flow {\r\n var parentFlow = new Flow();\r\n parentFlow.parent = null;\r\n parentFlow.flags = FlowFlags.NONE;\r\n parentFlow.currentFunction = currentFunction;\r\n parentFlow.continueLabel = null;\r\n parentFlow.breakLabel = null;\r\n return parentFlow;\r\n }\r\n\r\n private constructor() { }\r\n\r\n /** Tests if this flow has the specified flag or flags. */\r\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n\r\n /** Sets the specified flag or flags. */\r\n set(flag: FlowFlags): void { this.flags |= flag; }\r\n\r\n /** Enters a new branch or scope and returns the new flow. */\r\n enterBranchOrScope(): Flow {\r\n var branchFlow = new Flow();\r\n branchFlow.parent = this;\r\n branchFlow.flags = this.flags;\r\n branchFlow.currentFunction = this.currentFunction;\r\n branchFlow.continueLabel = this.continueLabel;\r\n branchFlow.breakLabel = this.breakLabel;\r\n return branchFlow;\r\n }\r\n\r\n /** Leaves the current branch or scope and returns the parent flow. */\r\n leaveBranchOrScope(): Flow {\r\n var parent = assert(this.parent);\r\n\r\n // Free block-scoped locals\r\n if (this.scopedLocals) {\r\n for (var scopedLocal of this.scopedLocals.values()) {\r\n this.currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n this.scopedLocals = null;\r\n }\r\n\r\n // Propagate flags to parent\r\n if (this.is(FlowFlags.POSSIBLY_THROWS)) {\r\n parent.set(FlowFlags.POSSIBLY_THROWS);\r\n }\r\n if (this.is(FlowFlags.POSSIBLY_BREAKS) && parent.breakLabel == this.breakLabel) {\r\n parent.set(FlowFlags.POSSIBLY_BREAKS);\r\n }\r\n if (this.is(FlowFlags.POSSIBLY_CONTINUES) && parent.continueLabel == this.continueLabel) {\r\n parent.set(FlowFlags.POSSIBLY_CONTINUES);\r\n }\r\n\r\n return parent;\r\n }\r\n\r\n /** Adds a new scoped local of the specified name. */\r\n addScopedLocal(name: string, type: Type, reportNode: Node): void {\r\n var scopedLocal = this.currentFunction.getTempLocal(type);\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else if (this.scopedLocals.has(name)) {\r\n this.currentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n return;\r\n }\r\n this.scopedLocals.set(name, scopedLocal);\r\n }\r\n\r\n /** Gets the local of the specified name in the current scope. */\r\n getScopedLocal(name: string): Local | null {\r\n var local: Local | null;\r\n var current: Flow | null = this;\r\n do {\r\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n return local;\r\n }\r\n } while (current = current.parent);\r\n return this.currentFunction.locals.get(name);\r\n }\r\n\r\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n finalize(): bool {\r\n assert(this.parent == null, \"must be the topmost parent flow\");\r\n this.continueLabel = null;\r\n this.breakLabel = null;\r\n return this.is(FlowFlags.RETURNS);\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/program.ts","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 3\n// module chunks = 0","import {\r\n compileCall as compileBuiltinCall,\r\n compileGetConstant as compileBuiltinGetConstant,\r\n compileAllocate as compileBuiltinAllocate\r\n} from \"./builtins\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module,\r\n MemorySegment,\r\n ExpressionRef,\r\n UnaryOp,\r\n BinaryOp,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionId\r\n} from \"./module\";\r\n\r\nimport {\r\n Program,\r\n ClassPrototype,\r\n Class,\r\n Element,\r\n ElementKind,\r\n Enum,\r\n Field,\r\n FunctionPrototype,\r\n Function,\r\n Global,\r\n Local,\r\n Namespace,\r\n EnumValue,\r\n Property,\r\n VariableLikeElement,\r\n FlowFlags,\r\n ElementFlags,\r\n ConstantValueKind,\r\n Parameter,\r\n\r\n PATH_DELIMITER,\r\n LIBRARY_PREFIX\r\n} from \"./program\";\r\n\r\nimport {\r\n Token\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n TypeNode,\r\n Source,\r\n Range,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DoStatement,\r\n EmptyStatement,\r\n EnumDeclaration,\r\n ExportStatement,\r\n ExpressionStatement,\r\n FunctionDeclaration,\r\n ForStatement,\r\n IfStatement,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n ModifierKind,\r\n NamespaceDeclaration,\r\n ReturnStatement,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n VariableDeclaration,\r\n VariableStatement,\r\n WhileStatement,\r\n\r\n Expression,\r\n AssertionExpression,\r\n BinaryExpression,\r\n CallExpression,\r\n CommaExpression,\r\n ElementAccessExpression,\r\n FloatLiteralExpression,\r\n IdentifierExpression,\r\n IntegerLiteralExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n NewExpression,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n TernaryExpression,\r\n ArrayLiteralExpression,\r\n StringLiteralExpression,\r\n UnaryPostfixExpression,\r\n UnaryPrefixExpression,\r\n\r\n hasModifier\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n\r\n typesToNativeTypes\r\n} from \"./types\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n /** WebAssembly with 32-bit pointers. */\r\n WASM32,\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n target: Target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n noTreeShaking: bool = false;\r\n /** If true, replaces assertions with nops. */\r\n noAssert: bool = false;\r\n /** If true, does not set up a memory. */\r\n noMemory: bool = false;\r\n /** Static memory start offset. */\r\n memoryBase: u32 = 0;\r\n /** Memory allocation implementation to use. */\r\n allocateImpl: string = \"allocate_memory\";\r\n /** Memory freeing implementation to use. */\r\n freeImpl: string = \"free_memory\";\r\n /** If true, generates information necessary for source maps. */\r\n sourceMap: bool = false;\r\n\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get isWasm64(): bool {\r\n return this.target == Target.WASM64;\r\n }\r\n\r\n /** Gets the unsigned size type matching the target. */\r\n get usizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n }\r\n\r\n /** Gets the signed size type matching the target. */\r\n get isizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n }\r\n\r\n /** Gets the native size type matching the target. */\r\n get nativeSizeType(): NativeType {\r\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n }\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n /** No conversion. */\r\n NONE,\r\n /** Implicit conversion. */\r\n IMPLICIT,\r\n /** Explicit conversion. */\r\n EXPLICIT\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Provided options. */\r\n options: Options;\r\n /** Module instance being compiled. */\r\n module: Module;\r\n\r\n /** Start function being compiled. */\r\n startFunction: Function;\r\n /** Start function statements. */\r\n startFunctionBody: ExpressionRef[] = new Array();\r\n\r\n /** Current function in compilation. */\r\n currentFunction: Function;\r\n /** Current enum in compilation. */\r\n currentEnum: Enum | null = null;\r\n /** Current type in compilation. */\r\n currentType: Type = Type.void;\r\n\r\n /** Counting memory offset. */\r\n memoryOffset: I64;\r\n /** Memory segments being compiled. */\r\n memorySegments: MemorySegment[] = new Array();\r\n /** Map of already compiled static string segments. */\r\n stringSegments: Map = new Map();\r\n\r\n /** Already processed file names. */\r\n files: Set = new Set();\r\n\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n static compile(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n }\r\n\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n constructor(program: Program, options: Options | null = null) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n this.options = options ? options : new Options();\r\n this.memoryOffset = i64_new(\r\n max(this.options.memoryBase, this.options.usizeType.byteSize) // leave space for `null`\r\n );\r\n this.module = Module.create();\r\n }\r\n\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n compile(): Module {\r\n\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n this.program.initialize(this.options);\r\n\r\n // set up the start function wrapping top-level statements, of all files.\r\n var startFunctionPrototype = assert(this.program.elements.get(\"start\"));\r\n assert(startFunctionPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n var startFunctionInstance = new Function(\r\n startFunctionPrototype,\r\n startFunctionPrototype.internalName,\r\n null, // not generic\r\n null, // no parameters\r\n Type.void\r\n );\r\n startFunctionInstance.set(ElementFlags.START);\r\n this.currentFunction = this.startFunction = startFunctionInstance;\r\n\r\n var sources = this.program.sources;\r\n\r\n // compile entry file(s) while traversing to reachable elements\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) {\r\n this.compileSource(sources[i]);\r\n }\r\n }\r\n\r\n // compile the start function if not empty\r\n if (this.startFunctionBody.length) {\r\n var typeRef = this.module.getFunctionTypeBySignature(NativeType.None, []);\r\n if (!typeRef) typeRef = this.module.addFunctionType(\"v\", NativeType.None, []);\r\n var ref: FunctionRef;\r\n this.module.setStart(\r\n ref = this.module.addFunction(\r\n this.startFunction.prototype.internalName,\r\n typeRef,\r\n typesToNativeTypes(this.startFunction.additionalLocals),\r\n this.module.createBlock(null, this.startFunctionBody)\r\n )\r\n );\r\n this.startFunction.finalize(this.module, ref);\r\n }\r\n\r\n // set up static memory segments and the heap base pointer\r\n if (!this.options.noMemory) {\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, this.options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n if (this.options.isWasm64) {\r\n this.module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n false,\r\n this.module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n );\r\n } else {\r\n this.module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n this.module.createI32(i64_low(memoryOffset))\r\n );\r\n }\r\n\r\n // determine initial page size\r\n var pages = i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0));\r\n this.module.setMemory(\r\n i64_low(pages),\r\n Module.MAX_MEMORY_WASM32 /* TODO: not WASM64 compatible yet */,\r\n this.memorySegments,\r\n this.options.target,\r\n \"memory\"\r\n );\r\n }\r\n return this.module;\r\n }\r\n\r\n // sources\r\n\r\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n var sources = this.program.sources;\r\n\r\n var source: Source;\r\n var expected = normalizedPathWithoutExtension + \".ts\";\r\n for (var i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n expected = normalizedPathWithoutExtension + \"/index.ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n expected = LIBRARY_PREFIX + normalizedPathWithoutExtension + \".ts\";\r\n for (i = 0, k = sources.length; i < k; ++i) {\r\n source = sources[i];\r\n if (source.normalizedPath == expected) {\r\n this.compileSource(source);\r\n return;\r\n }\r\n }\r\n\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n reportNode.range, normalizedPathWithoutExtension\r\n );\r\n }\r\n\r\n compileSource(source: Source): void {\r\n var files = this.files;\r\n if (files.has(source.normalizedPath)) return;\r\n files.add(source.normalizedPath);\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (var i = 0, k = statements.length; i < k; ++i) {\r\n var statement = statements[i];\r\n switch (statement.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) &&\r\n !(statement).typeParameters.length\r\n ) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) &&\r\n !(statement).typeParameters.length\r\n ) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n\r\n case NodeKind.IMPORT:\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n (isEntry && hasModifier(ModifierKind.EXPORT, (statement).modifiers))\r\n ) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n\r\n case NodeKind.VARIABLE: // global, always compiled as initializers might have side effects\r\n var variableInit = this.compileVariableStatement(statement);\r\n if (variableInit) startFunctionBody.push(variableInit);\r\n break;\r\n\r\n case NodeKind.EXPORT:\r\n if ((statement).normalizedPath != null) {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n\r\n // otherwise a top-level statement that is part of the start function's body\r\n default:\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = this.startFunction;\r\n var expr = this.compileStatement(statement);\r\n this.startFunctionBody.push(expr);\r\n this.currentFunction = previousFunction;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // globals\r\n\r\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.GLOBAL) {\r\n throw new Error(\"global expected\");\r\n }\r\n if (!this.compileGlobal(element)) { // reports\r\n return null;\r\n }\r\n return element;\r\n }\r\n\r\n compileGlobal(global: Global): bool {\r\n if (global.is(ElementFlags.COMPILED) || global.is(ElementFlags.BUILTIN)) {\r\n return true;\r\n }\r\n\r\n var declaration = global.declaration;\r\n var initExpr: ExpressionRef = 0;\r\n if (global.type == Type.void) { // infer type\r\n if (declaration.type) {\r\n var resolvedType = this.program.resolveType(declaration.type); // reports\r\n if (!resolvedType) return false;\r\n if (resolvedType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.type.range, \"*\", resolvedType.toString()\r\n );\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n initExpr = this.compileExpression( // reports\r\n declaration.initializer,\r\n Type.void,\r\n ConversionKind.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.initializer.range, this.currentType.toString(), \"\"\r\n );\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n var nativeType = global.type.toNativeType();\r\n\r\n if (global.is(ElementFlags.DECLARED)) {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n this.module.addGlobalImport(\r\n global.internalName,\r\n global.namespace\r\n ? global.namespace.simpleName\r\n : \"env\",\r\n global.simpleName,\r\n nativeType\r\n );\r\n global.set(ElementFlags.COMPILED);\r\n return true;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n declaration.range\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n var initializeInStart = false;\r\n\r\n if (global.is(ElementFlags.INLINED)) {\r\n initExpr = this.compileInlineConstant(global, global.type);\r\n } else {\r\n if (declaration.initializer) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(declaration.initializer, global.type);\r\n }\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n initializeInStart = true;\r\n }\r\n } else {\r\n initializeInStart = true;\r\n }\r\n }\r\n } else {\r\n initExpr = global.type.toNativeZero(this.module);\r\n }\r\n }\r\n\r\n var internalName = global.internalName;\r\n if (initializeInStart) {\r\n this.module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(this.module));\r\n var setExpr = this.module.createSetGlobal(internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n } else {\r\n if (global.is(ElementFlags.CONSTANT)) {\r\n var exprType = _BinaryenExpressionGetType(initExpr);\r\n switch (exprType) {\r\n\r\n case NativeType.I32:\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(_BinaryenConstGetValueI32(initExpr), 0);\r\n break;\r\n\r\n case NativeType.I64:\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(\r\n _BinaryenConstGetValueI64Low(initExpr),\r\n _BinaryenConstGetValueI64High(initExpr)\r\n );\r\n break;\r\n\r\n case NativeType.F32:\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = _BinaryenConstGetValueF32(initExpr);\r\n break;\r\n\r\n case NativeType.F64:\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = _BinaryenConstGetValueF64(initExpr);\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n global.set(ElementFlags.INLINED);\r\n if (declaration.isTopLevel) { // might be re-exported\r\n this.module.addGlobal(internalName, nativeType, !global.is(ElementFlags.CONSTANT), initExpr);\r\n }\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addGlobalExport(global.internalName, declaration.programLevelInternalName);\r\n }\r\n } else {\r\n this.module.addGlobal(internalName, nativeType, !global.is(ElementFlags.CONSTANT), initExpr);\r\n }\r\n }\r\n global.set(ElementFlags.COMPILED);\r\n return true;\r\n }\r\n\r\n // enums\r\n\r\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.ENUM) throw new Error(\"enum expected\");\r\n return this.compileEnum(element) ? element : null;\r\n }\r\n\r\n compileEnum(element: Enum): bool {\r\n if (element.is(ElementFlags.COMPILED)) return true;\r\n\r\n // members might reference each other, triggering another compile\r\n element.set(ElementFlags.COMPILED);\r\n\r\n this.currentEnum = element;\r\n var previousValue: EnumValue | null = null;\r\n if (element.members) {\r\n for (var member of element.members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n var initInStart = false;\r\n var val = member;\r\n var valueDeclaration = val.declaration;\r\n val.set(ElementFlags.COMPILED);\r\n if (val.is(ElementFlags.INLINED)) {\r\n if (element.declaration.isTopLevelExport) {\r\n this.module.addGlobal(\r\n val.internalName,\r\n NativeType.I32,\r\n false, // constant\r\n this.module.createI32(val.constantValue)\r\n );\r\n }\r\n } else {\r\n var initExpr: ExpressionRef;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(valueDeclaration.value, Type.i32);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n initExpr = this.precomputeExpressionRef(initExpr);\r\n if (_BinaryenExpressionGetId(initExpr) != ExpressionId.Const) {\r\n if (element.is(ElementFlags.CONSTANT)) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n } else if (previousValue == null) {\r\n initExpr = this.module.createI32(0);\r\n } else if (previousValue.is(ElementFlags.INLINED)) {\r\n initExpr = this.module.createI32(previousValue.constantValue + 1);\r\n } else {\r\n // in TypeScript this errors with TS1061, but actually we can do:\r\n initExpr = this.module.createBinary(BinaryOp.AddI32,\r\n this.module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n this.module.createI32(1)\r\n );\r\n if (element.is(ElementFlags.CONSTANT)) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n if (initInStart) {\r\n this.module.addGlobal(\r\n val.internalName,\r\n NativeType.I32,\r\n true, // mutable\r\n this.module.createI32(0)\r\n );\r\n var setExpr = this.module.createSetGlobal(val.internalName, initExpr);\r\n this.startFunctionBody.push(setExpr);\r\n } else {\r\n this.module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\r\n if (_BinaryenExpressionGetType(initExpr) == NativeType.I32) {\r\n val.constantValue = _BinaryenConstGetValueI32(initExpr);\r\n val.set(ElementFlags.INLINED);\r\n } else {\r\n throw new Error(\"i32 expected\");\r\n }\r\n }\r\n }\r\n previousValue = val;\r\n\r\n // export values if the enum is exported\r\n if (element.declaration.range.source.isEntry && element.declaration.isTopLevelExport) {\r\n if (member.is(ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(member.internalName, member.internalName);\r\n } else if (valueDeclaration) {\r\n this.warning(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n valueDeclaration.range\r\n );\r\n }\r\n }\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n }\r\n\r\n // functions\r\n\r\n compileFunctionDeclaration(\r\n declaration: FunctionDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null\r\n ): Function | null {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n throw new Error(\"function expected\");\r\n }\r\n return this.compileFunctionUsingTypeArguments( // reports\r\n element,\r\n typeArguments,\r\n contextualTypeArguments,\r\n (element).declaration.name\r\n );\r\n }\r\n\r\n compileFunctionUsingTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n typeArguments,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!instance) return null;\r\n return this.compileFunction(instance) ? instance : null;\r\n }\r\n\r\n compileFunction(instance: Function): bool {\r\n if (instance.is(ElementFlags.COMPILED)) return true;\r\n\r\n assert(!instance.is(ElementFlags.BUILTIN) || instance.simpleName == \"abort\");\r\n\r\n var declaration = instance.prototype.declaration;\r\n if (instance.is(ElementFlags.DECLARED)) {\r\n if (declaration.statements) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n declaration.name.range\r\n );\r\n return false;\r\n }\r\n } else if (!declaration.statements) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n declaration.name.range\r\n );\r\n return false;\r\n }\r\n\r\n // might trigger compilation of other functions referring to this one\r\n instance.set(ElementFlags.COMPILED);\r\n\r\n // compile statements\r\n var stmts: ExpressionRef[] | null = null;\r\n if (!instance.is(ElementFlags.DECLARED)) {\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = instance;\r\n var statements = assert(declaration.statements, \"implementation expected\");\r\n stmts = this.compileStatements(statements);\r\n // make sure the top-level branch or all child branches return\r\n var allBranchesReturn = this.currentFunction.flow.finalize();\r\n if (instance.returnType != Type.void && !allBranchesReturn) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n assert(declaration.returnType, \"return type expected\").range\r\n );\r\n }\r\n this.currentFunction = previousFunction;\r\n }\r\n\r\n // create the function type\r\n var numParameters = instance.parameters ? instance.parameters.length : 0;\r\n var numParametersInclThis = instance.instanceMethodOf ? numParameters + 1 : numParameters;\r\n var paramIndex = 0;\r\n\r\n var nativeResultType = instance.returnType.toNativeType();\r\n var nativeParamTypes = new Array(numParametersInclThis);\r\n var signatureNameParts = new Array(numParametersInclThis + 1);\r\n\r\n if (instance.instanceMethodOf) {\r\n nativeParamTypes[paramIndex] = this.options.isWasm64 ? NativeType.I64 : NativeType.I32;\r\n signatureNameParts[paramIndex++] = instance.instanceMethodOf.type.toSignatureString();\r\n }\r\n if (instance.parameters) {\r\n for (var i = 0; i < numParameters; ++i) {\r\n nativeParamTypes[paramIndex] = instance.parameters[i].type.toNativeType();\r\n signatureNameParts[paramIndex++] = instance.parameters[i].type.toSignatureString();\r\n }\r\n }\r\n signatureNameParts[paramIndex] = instance.returnType.toSignatureString();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeResultType, nativeParamTypes);\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(\r\n signatureNameParts.join(\"\"),\r\n nativeResultType,\r\n nativeParamTypes\r\n );\r\n }\r\n\r\n // create the function\r\n var ref: FunctionRef;\r\n if (instance.is(ElementFlags.DECLARED)) {\r\n ref = this.module.addFunctionImport(\r\n instance.internalName,\r\n instance.prototype.namespace\r\n ? instance.prototype.namespace.simpleName\r\n : \"env\",\r\n instance.simpleName,\r\n typeRef\r\n );\r\n } else {\r\n ref = this.module.addFunction(\r\n instance.internalName,\r\n typeRef,\r\n typesToNativeTypes(instance.additionalLocals),\r\n this.module.createBlock(null, stmts, NativeType.None)\r\n );\r\n }\r\n\r\n // check module export\r\n if (declaration.range.source.isEntry && declaration.isTopLevelExport) {\r\n this.module.addFunctionExport(instance.internalName, declaration.name.text);\r\n }\r\n\r\n instance.finalize(this.module, ref);\r\n return true;\r\n }\r\n\r\n // namespaces\r\n\r\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n switch (member.kind) {\r\n\r\n case NodeKind.CLASSDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.INTERFACEDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.ENUMDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n\r\n case NodeKind.FUNCTIONDECLARATION:\r\n if (\r\n (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) && !(member).typeParameters.length\r\n ) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n\r\n case NodeKind.NAMESPACEDECLARATION:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n if (\r\n noTreeShaking ||\r\n hasModifier(ModifierKind.EXPORT, (member).modifiers)\r\n ) {\r\n var variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit) this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n\r\n default:\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n\r\n compileNamespace(ns: Namespace): void {\r\n if (!ns.members) return;\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (var element of ns.members.values()) {\r\n switch (element.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n if (\r\n (\r\n noTreeShaking ||\r\n (element).is(ElementFlags.EXPORTED)\r\n ) && !(element).is(ElementFlags.GENERIC)\r\n ) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n\r\n case ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (\r\n (\r\n noTreeShaking || (element).is(ElementFlags.EXPORTED)\r\n ) && !(element).is(ElementFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n\r\n case ElementKind.GLOBAL:\r\n this.compileGlobal(element);\r\n break;\r\n\r\n case ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // exports\r\n\r\n compileExportStatement(statement: ExportStatement): void {\r\n var members = statement.members;\r\n for (var i = 0, k = members.length; i < k; ++i) {\r\n var member = members[i];\r\n var internalExportName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n member.externalName.text\r\n );\r\n var element = this.program.exports.get(internalExportName);\r\n if (!element) continue; // reported in Program#initialize\r\n\r\n switch (element.kind) {\r\n\r\n case ElementKind.CLASS_PROTOTYPE:\r\n if (!(element).is(ElementFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n\r\n case ElementKind.ENUM:\r\n this.compileEnum(element);\r\n break;\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (\r\n !(element).is(ElementFlags.GENERIC) &&\r\n statement.range.source.isEntry\r\n ) {\r\n var functionInstance = this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n null,\r\n (element).declaration.name\r\n );\r\n if (functionInstance) {\r\n var functionDeclaration = functionInstance.prototype.declaration;\r\n if (functionDeclaration && functionDeclaration.needsExplicitExport(member)) {\r\n this.module.addFunctionExport(functionInstance.internalName, member.externalName.text);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case ElementKind.GLOBAL:\r\n if (this.compileGlobal(element) && statement.range.source.isEntry) {\r\n var globalDeclaration = (element).declaration;\r\n if (globalDeclaration && globalDeclaration.needsExplicitExport(member)) {\r\n if ((element).is(ElementFlags.INLINED)) {\r\n this.module.addGlobalExport(element.internalName, member.externalName.text);\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n member.range\r\n );\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case ElementKind.NAMESPACE:\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // classes\r\n\r\n compileClassDeclaration(\r\n declaration: ClassDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var element = this.program.elements.get(declaration.fileLevelInternalName);\r\n if (!element || element.kind != ElementKind.CLASS_PROTOTYPE) {\r\n throw new Error(\"class expected\");\r\n }\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n }\r\n\r\n compileClassUsingTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode\r\n );\r\n if (!instance) return;\r\n this.compileClass(instance);\r\n }\r\n\r\n compileClass(instance: Class): bool {\r\n if (instance.is(ElementFlags.COMPILED)) return true;\r\n instance.set(ElementFlags.COMPILED);\r\n return true;\r\n }\r\n\r\n compileInterfaceDeclaration(\r\n declaration: InterfaceDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n // memory\r\n\r\n /** Adds a static memory segment with the specified data. */\r\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n }\r\n\r\n // statements\r\n\r\n compileStatement(statement: Statement): ExpressionRef {\r\n var expr: ExpressionRef;\r\n switch (statement.kind) {\r\n\r\n case NodeKind.BLOCK:\r\n expr = this.compileBlockStatement(statement);\r\n break;\r\n\r\n case NodeKind.BREAK:\r\n expr = this.compileBreakStatement(statement);\r\n break;\r\n\r\n case NodeKind.CONTINUE:\r\n expr = this.compileContinueStatement(statement);\r\n break;\r\n\r\n case NodeKind.DO:\r\n expr = this.compileDoStatement(statement);\r\n break;\r\n\r\n case NodeKind.EMPTY:\r\n expr = this.compileEmptyStatement(statement);\r\n break;\r\n\r\n case NodeKind.EXPRESSION:\r\n expr = this.compileExpressionStatement(statement);\r\n break;\r\n\r\n case NodeKind.FOR:\r\n expr = this.compileForStatement(statement);\r\n break;\r\n\r\n case NodeKind.IF:\r\n expr = this.compileIfStatement(statement);\r\n break;\r\n\r\n case NodeKind.RETURN:\r\n expr = this.compileReturnStatement(statement);\r\n break;\r\n\r\n case NodeKind.SWITCH:\r\n expr = this.compileSwitchStatement(statement);\r\n break;\r\n\r\n case NodeKind.THROW:\r\n expr = this.compileThrowStatement(statement);\r\n break;\r\n\r\n case NodeKind.TRY:\r\n expr = this.compileTryStatement(statement);\r\n break;\r\n\r\n case NodeKind.VARIABLE:\r\n var variableInit = this.compileVariableStatement(statement);\r\n expr = variableInit ? variableInit : this.module.createNop();\r\n break;\r\n\r\n case NodeKind.WHILE:\r\n expr = this.compileWhileStatement(statement);\r\n break;\r\n\r\n case NodeKind.TYPEDECLARATION:\r\n if (this.currentFunction == this.startFunction) {\r\n return this.module.createNop();\r\n }\r\n // fall-through: must be top-level; function bodies are not guaranteed to be evaluated\r\n\r\n default:\r\n throw new Error(\"statement expected\");\r\n }\r\n\r\n this.addDebugLocation(expr, statement.range);\r\n return expr;\r\n }\r\n\r\n compileStatements(statements: Statement[]): ExpressionRef[] {\r\n var k = statements.length;\r\n var stmts = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n stmts[i] = this.compileStatement(statements[i]);\r\n }\r\n return stmts; // array of 0-es in noEmit-mode\r\n }\r\n\r\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n var statements = statement.statements;\r\n\r\n // NOTE that we could optimize this to a NOP if empty or unwrap a single\r\n // statement, but that's not what the source told us to do and left to the\r\n // optimizer.\r\n\r\n // Not actually a branch, but can contain its own scoped variables.\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n\r\n var stmt = this.module.createBlock(null, this.compileStatements(statements), NativeType.None);\r\n var stmtReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n if (stmtReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n }\r\n return stmt;\r\n }\r\n\r\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var breakLabel = this.currentFunction.flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_BREAKS);\r\n return this.module.createBreak(breakLabel);\r\n }\r\n\r\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var continueLabel = this.currentFunction.flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_CONTINUES);\r\n return this.module.createBreak(continueLabel);\r\n }\r\n\r\n compileDoStatement(statement: DoStatement): ExpressionRef {\r\n\r\n // A do statement does not initiate a new branch because it is executed at\r\n // least once, but has its own break and continue labels.\r\n var label = this.currentFunction.enterBreakContext();\r\n var previousBreakLabel = this.currentFunction.flow.breakLabel;\r\n var previousContinueLabel = this.currentFunction.flow.continueLabel;\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n\r\n // Reset to the previous break and continue labels, if any.\r\n this.currentFunction.flow.breakLabel = previousBreakLabel;\r\n this.currentFunction.flow.continueLabel = previousContinueLabel;\r\n\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n this.currentFunction.leaveBreakContext();\r\n\r\n return this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel,\r\n this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel, condition)\r\n ], NativeType.None))\r\n ], NativeType.None);\r\n }\r\n\r\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n return this.module.createNop();\r\n }\r\n\r\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE);\r\n if (this.currentType != Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = Type.void;\r\n }\r\n return expr;\r\n }\r\n\r\n compileForStatement(statement: ForStatement): ExpressionRef {\r\n\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var context = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + context;\r\n\r\n // Compile in correct order\r\n var initializer = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : this.module.createNop();\r\n var condition = statement.condition\r\n ? this.compileExpression(statement.condition, Type.i32)\r\n : this.module.createI32(1);\r\n var incrementor = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, Type.void)\r\n : this.module.createNop();\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = !statement.condition && this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n // TODO: check other always-true conditions as well, not just omitted\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n\r\n var expr = this.module.createBlock(breakLabel, [\r\n initializer,\r\n this.module.createLoop(continueLabel, this.module.createBlock(null, [\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n incrementor,\r\n this.module.createBreak(continueLabel)\r\n ], NativeType.None))\r\n ], NativeType.None))\r\n ], NativeType.None);\r\n\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n }\r\n\r\n compileIfStatement(statement: IfStatement): ExpressionRef {\r\n\r\n // The condition doesn't initiate a branch yet\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n // Each arm initiates a branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var ifTrue = this.compileStatement(statement.ifTrue);\r\n var ifTrueReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n\r\n var ifFalse: ExpressionRef = 0;\r\n var ifFalseReturns = false;\r\n if (statement.ifFalse) {\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n ifFalse = this.compileStatement(statement.ifFalse);\r\n ifFalseReturns = this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n }\r\n if (ifTrueReturns && ifFalseReturns) { // not necessary to append a hint\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n }\r\n return this.module.createIf(condition, ifTrue, ifFalse);\r\n }\r\n\r\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n var expression: ExpressionRef = 0;\r\n if (statement.value) {\r\n expression = this.compileExpression(statement.value, this.currentFunction.returnType);\r\n }\r\n\r\n // Remember that this flow returns\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n\r\n return this.module.createReturn(expression);\r\n }\r\n\r\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n\r\n // Everything within a switch uses the same break context\r\n var context = this.currentFunction.enterBreakContext();\r\n\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = this.currentFunction.getTempLocal(Type.i32);\r\n var k = statement.cases.length;\r\n\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + k);\r\n breaks[0] = this.module.createSetLocal( // initializer\r\n tempLocal.index,\r\n this.compileExpression(statement.condition, Type.i32)\r\n );\r\n\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (var i = 0; i < k; ++i) {\r\n var case_ = statement.cases[i];\r\n if (case_.label) {\r\n breaks[breakIndex++] = this.module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n this.module.createBinary(BinaryOp.EqI32,\r\n this.module.createGetLocal(tempLocal.index, NativeType.I32),\r\n this.compileExpression(case_.label, Type.i32)\r\n )\r\n );\r\n } else {\r\n defaultIndex = i;\r\n }\r\n }\r\n\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = this.module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\"\r\n ) + \"|\" + context);\r\n\r\n // nest blocks in order\r\n var currentBlock = this.module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n var alwaysReturns = true;\r\n for (i = 0; i < k; ++i) {\r\n case_ = statement.cases[i];\r\n var l = case_.statements.length;\r\n var body = new Array(1 + l);\r\n body[0] = currentBlock;\r\n\r\n // Each switch case initiates a new branch\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + context;\r\n\r\n var fallsThrough = i != k - 1;\r\n var nextLabel = !fallsThrough ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n for (var j = 0; j < l; ++j) {\r\n body[j + 1] = this.compileStatement(case_.statements[j]);\r\n }\r\n if (!(fallsThrough || this.currentFunction.flow.is(FlowFlags.RETURNS))) {\r\n alwaysReturns = false; // ignore fall-throughs\r\n }\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n\r\n currentBlock = this.module.createBlock(nextLabel, body, NativeType.None);\r\n }\r\n this.currentFunction.leaveBreakContext();\r\n\r\n // If the switch has a default and always returns, propagate that\r\n if (defaultIndex >= 0 && alwaysReturns) {\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n // Binaryen understands that so we don't need a hint\r\n }\r\n return currentBlock;\r\n }\r\n\r\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n\r\n // Remember that this branch possibly throws\r\n this.currentFunction.flow.set(FlowFlags.POSSIBLY_THROWS);\r\n\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n this.currentFunction.flow.set(FlowFlags.RETURNS);\r\n\r\n // TODO: requires exception-handling spec.\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileTryStatement(statement: TryStatement): ExpressionRef {\r\n throw new Error(\"not implemented\");\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n }\r\n\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n var declarations = statement.declarations;\r\n\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (\r\n this.currentFunction == this.startFunction &&\r\n statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n )) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (var i = 0, k = declarations.length; i < k; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n\r\n // other variables become locals\r\n var initializers = new Array();\r\n for (i = 0, k = declarations.length; i < k; ++i) {\r\n var declaration = declarations[i];\r\n var name = declaration.name.text;\r\n var type: Type | null = null;\r\n var init: ExpressionRef = 0;\r\n if (declaration.type) {\r\n type = this.program.resolveType( // reports\r\n declaration.type,\r\n this.currentFunction.contextualTypeArguments\r\n );\r\n if (!type) continue;\r\n if (declaration.initializer) {\r\n init = this.compileExpression(declaration.initializer, type); // reports\r\n }\r\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n init = this.compileExpression( // reports\r\n declaration.initializer,\r\n Type.void,\r\n ConversionKind.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.range, this.currentType.toString(), \"\"\r\n );\r\n continue;\r\n }\r\n type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n continue;\r\n }\r\n if (hasModifier(ModifierKind.CONST, declaration.modifiers)) {\r\n if (init) {\r\n init = this.precomputeExpressionRef(init);\r\n if (_BinaryenExpressionGetId(init) == ExpressionId.Const) {\r\n var local = new Local(this.program, name, -1, type);\r\n switch (_BinaryenExpressionGetType(init)) {\r\n case NativeType.I32:\r\n local = local.withConstantIntegerValue(_BinaryenConstGetValueI32(init), 0);\r\n break;\r\n case NativeType.I64:\r\n local = local.withConstantIntegerValue(\r\n _BinaryenConstGetValueI64Low(init),\r\n _BinaryenConstGetValueI64High(init)\r\n );\r\n break;\r\n case NativeType.F32:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF32(init));\r\n break;\r\n case NativeType.F64:\r\n local = local.withConstantFloatValue(_BinaryenConstGetValueF64(init));\r\n break;\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n var scopedLocals = this.currentFunction.flow.scopedLocals;\r\n if (!scopedLocals) scopedLocals = this.currentFunction.flow.scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return 0;\r\n }\r\n scopedLocals.set(name, local);\r\n return 0;\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n declaration.range\r\n );\r\n }\r\n }\r\n if (hasModifier(ModifierKind.LET, declaration.modifiers)) { // here: not top-level\r\n this.currentFunction.flow.addScopedLocal(name, type, declaration.name); // reports\r\n } else {\r\n this.currentFunction.addLocal(type, name); // reports\r\n }\r\n if (init) {\r\n initializers.push(this.compileAssignmentWithValue(declaration.name, init));\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, NativeType.None)\r\n : 0;\r\n }\r\n\r\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n\r\n // The condition does not yet initialize a branch\r\n var condition = this.compileExpression(statement.condition, Type.i32);\r\n\r\n // Statements initiate a new branch with its own break context\r\n var label = this.currentFunction.enterBreakContext();\r\n this.currentFunction.flow = this.currentFunction.flow.enterBranchOrScope();\r\n var breakLabel = this.currentFunction.flow.breakLabel = \"break|\" + label;\r\n var continueLabel = this.currentFunction.flow.continueLabel = \"continue|\" + label;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysReturns = false && this.currentFunction.flow.is(FlowFlags.RETURNS);\r\n // TODO: evaluate possible always-true conditions\r\n\r\n // Switch back to the parent flow\r\n this.currentFunction.flow = this.currentFunction.flow.leaveBranchOrScope();\r\n this.currentFunction.leaveBreakContext();\r\n\r\n var expr = this.module.createBlock(breakLabel, [\r\n this.module.createLoop(continueLabel,\r\n this.module.createIf(condition, this.module.createBlock(null, [\r\n body,\r\n this.module.createBreak(continueLabel)\r\n ], NativeType.None))\r\n )\r\n ], NativeType.None);\r\n\r\n // If the loop is guaranteed to run and return, propagate that and append a hint\r\n if (alwaysReturns) {\r\n expr = this.module.createBlock(null, [\r\n expr,\r\n this.module.createUnreachable()\r\n ]);\r\n }\r\n return expr;\r\n }\r\n\r\n // expressions\r\n\r\n /** Compiles an inlined constant value of a variable-like element. */\r\n compileInlineConstant(element: VariableLikeElement, contextualType: Type): ExpressionRef {\r\n assert(element.is(ElementFlags.INLINED));\r\n\r\n switch (\r\n element.type.is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n element.type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = element.type).kind\r\n ) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n var shift = element.type.computeSmallIntegerShift(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0\r\n );\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n var mask = element.type.computeSmallIntegerMask(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0\r\n );\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return element.constantValueKind == ConstantValueKind.INTEGER\r\n ? this.module.createI64(\r\n i64_low(element.constantIntegerValue),\r\n i64_high(element.constantIntegerValue)\r\n )\r\n : this.module.createI64(0);\r\n\r\n case TypeKind.F32:\r\n return this.module.createF32((element).constantFloatValue);\r\n\r\n case TypeKind.F64:\r\n return this.module.createF64((element).constantFloatValue);\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n }\r\n\r\n compileExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind = ConversionKind.IMPLICIT,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n this.currentType = contextualType;\r\n\r\n var expr: ExpressionRef;\r\n switch (expression.kind) {\r\n\r\n case NodeKind.ASSERTION:\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.BINARY:\r\n expr = this.compileBinaryExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n\r\n case NodeKind.CALL:\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.COMMA:\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.ELEMENTACCESS:\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.FALSE:\r\n case NodeKind.NULL:\r\n case NodeKind.THIS:\r\n case NodeKind.TRUE:\r\n expr = this.compileIdentifierExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.LITERAL:\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.NEW:\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.PARENTHESIZED:\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.PROPERTYACCESS:\r\n expr = this.compilePropertyAccessExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.TERNARY:\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.UNARYPOSTFIX:\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n\r\n case NodeKind.UNARYPREFIX:\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType, wrapSmallIntegers);\r\n break;\r\n\r\n default:\r\n throw new Error(\"expression expected\");\r\n }\r\n\r\n if (conversionKind != ConversionKind.NONE && this.currentType != contextualType) {\r\n expr = this.convertExpression(expr, this.currentType, contextualType, conversionKind, expression);\r\n this.currentType = contextualType;\r\n }\r\n\r\n this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n }\r\n\r\n precomputeExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind = ConversionKind.IMPLICIT\r\n ): ExpressionRef {\r\n return this.precomputeExpressionRef(this.compileExpression(expression, contextualType, conversionKind));\r\n }\r\n\r\n precomputeExpressionRef(expr: ExpressionRef): ExpressionRef {\r\n var nativeType = this.currentType.toNativeType();\r\n var typeRef = this.module.getFunctionTypeBySignature(nativeType, []);\r\n var typeRefAdded = false;\r\n if (!typeRef) {\r\n typeRef = this.module.addFunctionType(this.currentType.toSignatureString(), nativeType, []);\r\n typeRefAdded = true;\r\n }\r\n var funcRef = this.module.addFunction(\"__precompute\", typeRef, [], expr);\r\n this.module.runPasses([ \"precompute\" ], funcRef);\r\n var ret = _BinaryenFunctionGetBody(funcRef);\r\n this.module.removeFunction(\"__precompute\");\r\n if (typeRefAdded) {\r\n // TODO: also remove the function type somehow if no longer used or make the C-API accept\r\n // a `null` typeRef, using an implicit type.\r\n }\r\n return ret;\r\n }\r\n\r\n convertExpression(\r\n expr: ExpressionRef,\r\n fromType: Type,\r\n toType: Type,\r\n conversionKind: ConversionKind,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n if (conversionKind == ConversionKind.NONE) {\r\n assert(false, \"concrete type expected\");\r\n return expr;\r\n }\r\n\r\n // void to any\r\n if (fromType.kind == TypeKind.VOID) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // any to void\r\n if (toType.kind == TypeKind.VOID) {\r\n return this.module.createDrop(expr);\r\n }\r\n\r\n var mod = this.module;\r\n var losesInformation = false;\r\n\r\n if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n // float to float\r\n if (toType.is(TypeFlags.FLOAT)) {\r\n if (fromType.kind == TypeKind.F32) {\r\n\r\n // f32 to f64\r\n if (toType.kind == TypeKind.F64) {\r\n expr = mod.createUnary(UnaryOp.PromoteF32, expr);\r\n }\r\n\r\n // otherwise f32 to f32\r\n\r\n // f64 to f32\r\n } else if (toType.kind == TypeKind.F32) {\r\n losesInformation = true;\r\n expr = mod.createUnary(UnaryOp.DemoteF64, expr);\r\n }\r\n\r\n // otherwise f64 to f64\r\n\r\n // float to int\r\n } else if (toType.is(TypeFlags.INTEGER)) {\r\n losesInformation = true;\r\n\r\n // f32 to int\r\n if (fromType.kind == TypeKind.F32) {\r\n if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n\r\n // f64 to int\r\n } else {\r\n if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n } else {\r\n expr = mod.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // float to void\r\n } else {\r\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n expr = this.module.createDrop(expr);\r\n }\r\n\r\n // int to float\r\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n // int to f32\r\n if (toType.kind == TypeKind.F32) {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF32\r\n : UnaryOp.ConvertU64ToF32,\r\n expr\r\n );\r\n } else {\r\n losesInformation = !fromType.is(TypeFlags.SMALL);\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF32\r\n : UnaryOp.ConvertU32ToF32,\r\n expr\r\n );\r\n }\r\n\r\n // int to f64\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF64\r\n : UnaryOp.ConvertU64ToF64,\r\n expr\r\n );\r\n } else {\r\n expr = mod.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF64\r\n : UnaryOp.ConvertU32ToF64,\r\n expr\r\n );\r\n }\r\n }\r\n\r\n // int to int\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n\r\n // i64 to i32\r\n if (!toType.is(TypeFlags.LONG)) {\r\n losesInformation = true;\r\n expr = mod.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n if (toType.is(TypeFlags.SMALL)) {\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n }\r\n\r\n // i32 to i64\r\n } else if (toType.is(TypeFlags.LONG)) {\r\n expr = mod.createUnary(toType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32, expr);\r\n\r\n // i32 or smaller to even smaller or same size int with change of sign\r\n } else if (\r\n toType.is(TypeFlags.SMALL) &&\r\n (\r\n fromType.size > toType.size ||\r\n (\r\n fromType.size == toType.size &&\r\n fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED)\r\n )\r\n )\r\n ) {\r\n losesInformation = true;\r\n expr = makeSmallIntegerWrap(expr, toType, this.module);\r\n }\r\n\r\n // otherwise (smaller) i32/u32 to (same size) i32/u32\r\n }\r\n\r\n if (losesInformation && conversionKind == ConversionKind.IMPLICIT) {\r\n this.error(\r\n DiagnosticCode.Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n var toType = this.program.resolveType( // reports\r\n expression.toType,\r\n this.currentFunction.contextualTypeArguments\r\n );\r\n if (!toType) return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT);\r\n }\r\n\r\n compileBinaryExpression(\r\n expression: BinaryExpression,\r\n contextualType: Type,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n var left: ExpressionRef;\r\n var right: ExpressionRef;\r\n var condition: ExpressionRef;\r\n var expr: ExpressionRef;\r\n\r\n var compound = false;\r\n var possiblyOverflows = false;\r\n var tempLocal: Local | null = null;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.LESSTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.LtI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.LtI64, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.LtU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.LtU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.LtF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.LtF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.GtI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.GtI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.GtU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.GtU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.GtF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.GtF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.LESSTHAN_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.LeI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeI64\r\n : BinaryOp.LeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.LeI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.LeU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeU64\r\n : BinaryOp.LeU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.LeU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.LeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.LeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.GREATERTHAN_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.GeI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeI64\r\n : BinaryOp.GeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.GeI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.GeU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeU64\r\n : BinaryOp.GeU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.GeU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.GeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.GeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n // TODO?\r\n case Token.EQUALS_EQUALS:\r\n\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.EqI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.EqI64\r\n : BinaryOp.EqI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.EqI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.EqF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.EqF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n // TODO?\r\n case Token.EXCLAMATION_EQUALS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(expression.right, this.currentType);\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.NeI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.NeI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.NeF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.NeF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.EQUALS:\r\n return this.compileAssignment(expression.left, expression.right, contextualType);\r\n\r\n case Token.PLUS_EQUALS:\r\n compound = true;\r\n case Token.PLUS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.AddI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AddI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.AddF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.AddF64, left, right);\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.MINUS_EQUALS:\r\n compound = true;\r\n case Token.MINUS:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.SubI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.SubF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.SubF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.ASTERISK_EQUALS:\r\n compound = true;\r\n case Token.ASTERISK:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n // fall-through\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.MulI32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.MulI64\r\n : BinaryOp.MulI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.MulI64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.MulF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.MulF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.SLASH_EQUALS:\r\n compound = true;\r\n case Token.SLASH:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // TODO: when can division remain unwrapped? does it overflow?\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n possiblyOverflows = true;\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.DivI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivI64\r\n : BinaryOp.DivI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.DivI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.DivU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivU64\r\n : BinaryOp.DivU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.DivU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.DivF32, left, right);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.DivF64, left, right);\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.PERCENT_EQUALS:\r\n compound = true;\r\n case Token.PERCENT:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // TODO: when can remainder remain unwrapped? may it overflow?\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n expr = this.module.createBinary(BinaryOp.RemI32, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemI64\r\n : BinaryOp.RemI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.RemI64, left, right);\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n expr = this.module.createBinary(BinaryOp.RemU32, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemU64\r\n : BinaryOp.RemU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.RemU64, left, right);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n // TODO: internal fmod, possibly simply imported from JS\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n expr = this.module.createUnreachable();\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n compound = true;\r\n case Token.LESSTHAN_LESSTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n expr = this.module.createBinary(BinaryOp.ShlI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShlI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShlI64\r\n : BinaryOp.ShlI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // must wrap small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n default:\r\n // assumes signed shr on signed small integers does not overflow\r\n expr = this.module.createBinary(BinaryOp.ShrI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n expr = this.module.createBinary(BinaryOp.ShrI64, left, right);\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrI64\r\n : BinaryOp.ShrI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n // assumes unsigned shr on unsigned small integers does not overflow\r\n case TypeKind.U32:\r\n expr = this.module.createBinary(BinaryOp.ShrU32, left, right);\r\n break;\r\n\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShrU64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType == Type.void\r\n ? Type.u64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // modifies low bits of small integers if unsigned\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n true // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n possiblyOverflows = true;\r\n // fall-through\r\n default:\r\n // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = this.module.createBinary(BinaryOp.ShrU32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.ShrU64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.AMPERSAND_EQUALS:\r\n compound = true;\r\n case Token.AMPERSAND:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.AndI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AndI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AndI64\r\n : BinaryOp.AndI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.BAR_EQUALS:\r\n compound = true;\r\n case Token.BAR:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.OrI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.OrI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.OrI64\r\n : BinaryOp.OrI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.CARET_EQUALS:\r\n compound = true;\r\n case Token.CARET:\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // retains low bits of small integers\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false // ^\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // if left or right already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.XorI32, left, right);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.XorI64, left, right);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n left,\r\n right\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n // logical (no overloading)\r\n\r\n case Token.AMPERSAND_AMPERSAND: // left && right\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false\r\n );\r\n\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER);\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(\r\n condition, // left\r\n right, // ? right\r\n expr // : cloned left\r\n );\r\n }\r\n\r\n // otherwise make use of the temp. local\r\n else {\r\n expr = this.module.createIf(\r\n condition,\r\n right,\r\n this.module.createGetLocal(\r\n assert(tempLocal, \"tempLocal must be set\").index,\r\n this.currentType.toNativeType()\r\n )\r\n );\r\n }\r\n break;\r\n\r\n case Token.BAR_BAR: // left || right\r\n left = this.compileExpression(\r\n expression.left,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE\r\n );\r\n right = this.compileExpression(\r\n expression.right,\r\n this.currentType,\r\n ConversionKind.IMPLICIT,\r\n false\r\n );\r\n\r\n // clone left if free of side effects\r\n expr = this.module.cloneExpression(left, true, 0);\r\n\r\n // if not possible, tee left to a temp. local\r\n if (!expr) {\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n left = this.module.createTeeLocal(tempLocal.index, left);\r\n }\r\n\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER); // if right did\r\n condition = makeIsTrueish(left, this.currentType, this.module);\r\n\r\n // simplify when cloning left without side effects was successful\r\n if (expr) {\r\n expr = this.module.createIf(\r\n condition, // left\r\n expr, // ? cloned left\r\n right // : right\r\n );\r\n }\r\n\r\n // otherwise make use of the temp. local\r\n else {\r\n expr = this.module.createIf(\r\n condition,\r\n this.module.createGetLocal(\r\n assert(tempLocal, \"tempLocal must be set\").index,\r\n this.currentType.toNativeType()\r\n ),\r\n right\r\n );\r\n }\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"not implemented\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER), \"small integer type expected\");\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.left, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n // to compile just the value, we need to know the target's type\r\n var element = resolved.element;\r\n var elementType: Type;\r\n switch (element.kind) {\r\n\r\n case ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field compiled as a global\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void, \"concrete type expected\");\r\n // fall-through\r\n\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD:\r\n elementType = (element).type;\r\n break;\r\n\r\n case ElementKind.PROPERTY:\r\n var setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (!setterInstance) return this.module.createUnreachable();\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n elementType = (setterInstance.parameters)[0].type;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == NodeKind.ELEMENTACCESS) { // @operator(\"[]\")\r\n assert(\r\n resolved.target &&\r\n resolved.target.kind == ElementKind.CLASS &&\r\n element.simpleName == (resolved.target).prototype.fnIndexedGet\r\n );\r\n var resolvedIndexedSet = (element).resolve(null);\r\n if (resolvedIndexedSet) {\r\n elementType = resolvedIndexedSet.returnType;\r\n break;\r\n }\r\n }\r\n // fall-through\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // now compile the value and do the assignment\r\n this.currentType = elementType;\r\n return this.compileAssignmentWithValue(\r\n expression,\r\n this.compileExpression(valueExpression, elementType),\r\n contextualType != Type.void\r\n );\r\n }\r\n\r\n compileAssignmentWithValue(\r\n expression: Expression,\r\n valueWithCorrectType: ExpressionRef,\r\n tee: bool = false\r\n ): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n var tempLocal: Local;\r\n var targetExpr: ExpressionRef;\r\n switch (element.kind) {\r\n\r\n case ElementKind.LOCAL:\r\n this.currentType = tee ? (element).type : Type.void;\r\n if ((element).is(ElementFlags.CONSTANT)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return tee\r\n ? this.module.createTeeLocal((element).index, valueWithCorrectType)\r\n : this.module.createSetLocal((element).index, valueWithCorrectType);\r\n\r\n case ElementKind.GLOBAL:\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void, \"concrete type expected\");\r\n this.currentType = tee ? (element).type : Type.void;\r\n if ((element).is(ElementFlags.CONSTANT)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range,\r\n (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n if (!tee) {\r\n return this.module.createSetGlobal((element).internalName, valueWithCorrectType);\r\n }\r\n var globalNativeType = (element).type.toNativeType();\r\n return this.module.createBlock(null, [ // emulated teeGlobal\r\n this.module.createSetGlobal((element).internalName, valueWithCorrectType),\r\n this.module.createGetGlobal((element).internalName, globalNativeType)\r\n ], globalNativeType);\r\n\r\n case ElementKind.FIELD:\r\n if ((element).prototype.isReadonly) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n assert(resolved.targetExpression != null, \"target expression expected\");\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType, \"class type expected\");\r\n this.currentType = tee ? (element).type : Type.void;\r\n var elementNativeType = (element).type.toNativeType();\r\n if (!tee) {\r\n return this.module.createStore(\r\n (element).type.size >> 3,\r\n targetExpr,\r\n valueWithCorrectType,\r\n elementNativeType,\r\n (element).memoryOffset\r\n );\r\n }\r\n tempLocal = this.currentFunction.getAndFreeTempLocal((element).type);\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal(tempLocal.index, valueWithCorrectType),\r\n this.module.createStore(\r\n (element).type.size >> 3,\r\n targetExpr,\r\n this.module.createGetLocal(tempLocal.index, elementNativeType),\r\n elementNativeType,\r\n (element).memoryOffset\r\n ),\r\n this.module.createGetLocal(tempLocal.index, elementNativeType)\r\n ], elementNativeType);\r\n\r\n case ElementKind.PROPERTY:\r\n var setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) {\r\n var setterInstance = setterPrototype.resolve(); // reports\r\n if (setterInstance) {\r\n assert(setterInstance.parameters && setterInstance.parameters.length == 1);\r\n if (!tee) {\r\n if (setterInstance.is(ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n this.currentType = Type.void;\r\n return this.makeCall(setterInstance, [ targetExpr, valueWithCorrectType ]);\r\n } else {\r\n this.currentType = Type.void;\r\n return this.makeCall(setterInstance, [ valueWithCorrectType ]);\r\n }\r\n }\r\n var getterPrototype = (element).getterPrototype;\r\n assert(getterPrototype != null);\r\n var getterInstance = (getterPrototype).resolve(); // reports\r\n if (getterInstance) {\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n if (setterInstance.is(ElementFlags.INSTANCE)) {\r\n assert(resolved.targetExpression != null);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(getterInstance.returnType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [\r\n this.module.createTeeLocal(tempLocal.index, targetExpr), valueWithCorrectType\r\n ]),\r\n this.makeCall(getterInstance, [\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ])\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n } else {\r\n return this.module.createBlock(null, [\r\n this.makeCall(setterInstance, [ valueWithCorrectType ]),\r\n this.makeCall(getterInstance)\r\n ], (this.currentType = getterInstance.returnType).toNativeType());\r\n }\r\n }\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (element).internalName\r\n );\r\n }\r\n return this.module.createUnreachable();\r\n\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n if (expression.kind == NodeKind.ELEMENTACCESS) { // @operator(\"[]\")\r\n assert(resolved.target && resolved.target.kind == ElementKind.CLASS);\r\n var resolvedIndexedGet = (element).resolve();\r\n if (!resolvedIndexedGet) return this.module.createUnreachable();\r\n var indexedSetName = (resolved.target).prototype.fnIndexedSet;\r\n var indexedSet: Element | null;\r\n if (\r\n indexedSetName != null &&\r\n (resolved.target).members &&\r\n (indexedSet = (>(resolved.target).members).get(indexedSetName)) &&\r\n indexedSet.kind == ElementKind.FUNCTION_PROTOTYPE\r\n ) { // @operator(\"[]=\")\r\n var resolvedIndexedSet = (indexedSet).resolve();\r\n if (!resolvedIndexedSet) return this.module.createUnreachable();\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32,\r\n ConversionKind.NONE\r\n );\r\n assert(this.currentType.classType);\r\n var elementExpr = this.compileExpression(\r\n (expression).elementExpression,\r\n Type.i32\r\n );\r\n if (!tee) {\r\n this.currentType = resolvedIndexedSet.returnType;\r\n return this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n this.currentType = resolvedIndexedGet.returnType;\r\n tempLocal = this.currentFunction.getAndFreeTempLocal(this.currentType);\r\n return this.module.createBlock(null, [\r\n this.makeCall(resolvedIndexedSet, [\r\n targetExpr,\r\n elementExpr,\r\n this.module.createTeeLocal(tempLocal.index, valueWithCorrectType)\r\n ]),\r\n // TODO: could be different from an actual __get (needs 2 temp locals)\r\n this.module.createGetLocal(tempLocal.index, tempLocal.type.toNativeType())\r\n ], this.currentType.toNativeType());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, (resolved.target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n // fall-through\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression(expression.expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n if (element.kind != ElementKind.FUNCTION_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, element.internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n var functionPrototype = element;\r\n var functionInstance: Function | null = null;\r\n\r\n // TODO: generalize?\r\n if (functionPrototype.is(ElementFlags.BUILTIN)) {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n if (expression.typeArguments) {\r\n var k = expression.typeArguments.length;\r\n resolvedTypeArguments = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n var resolvedType = this.program.resolveType( // reports\r\n expression.typeArguments[i],\r\n this.currentFunction.contextualTypeArguments,\r\n true\r\n );\r\n if (!resolvedType) return this.module.createUnreachable();\r\n resolvedTypeArguments[i] = resolvedType;\r\n }\r\n }\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n resolvedTypeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n\r\n // TODO: infer type arguments from parameter types if omitted\r\n functionInstance = functionPrototype.resolveInclTypeArguments( // reports\r\n expression.typeArguments,\r\n this.currentFunction.contextualTypeArguments,\r\n expression\r\n );\r\n if (!functionInstance) return this.module.createUnreachable();\r\n\r\n // TODO: generalize? (see above)\r\n /* if (functionInstance.is(ElementFlags.BUILTIN)) {\r\n var expr = compileBuiltinCall(\r\n this,\r\n functionPrototype,\r\n functionInstance.typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(DiagnosticCode.Operation_not_supported, expression.range);\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n } */\r\n\r\n var numArguments = expression.arguments.length;\r\n var numArgumentsInclThis = functionInstance.instanceMethodOf\r\n ? numArguments + 1\r\n : numArguments;\r\n var argumentIndex = 0;\r\n\r\n var args = new Array(numArgumentsInclThis);\r\n if (functionInstance.instanceMethodOf) {\r\n assert(resolved.targetExpression != null);\r\n args[argumentIndex++] = resolved.targetExpression;\r\n }\r\n for (i = 0; i < numArguments; ++i) {\r\n args[argumentIndex++] = expression.arguments[i];\r\n }\r\n return this.compileCall(functionInstance, args, expression);\r\n }\r\n\r\n /**\r\n * Compiles a call to a function. If an instance method, `this` is the first element in\r\n * `argumentExpressions` or can be specified explicitly as the last argument.\r\n */\r\n compileCall(\r\n functionInstance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n\r\n // validate and compile arguments\r\n var parameters = functionInstance.parameters;\r\n\r\n var numParameters = parameters ? parameters.length : 0;\r\n var numParametersInclThis = functionInstance.instanceMethodOf != null\r\n ? numParameters + 1\r\n : numParameters;\r\n var numArgumentsInclThis = argumentExpressions.length;\r\n var numArguments = functionInstance.instanceMethodOf != null\r\n ? numArgumentsInclThis - 1\r\n : numArgumentsInclThis;\r\n if (thisArg) numArgumentsInclThis++;\r\n\r\n if (numArgumentsInclThis > numParametersInclThis) { // too many arguments\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, numParameters.toString(10), numArguments.toString(10)\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var operands = new Array(numParametersInclThis);\r\n var operandIndex = 0;\r\n var argumentIndex = 0;\r\n if (functionInstance.instanceMethodOf) {\r\n if (thisArg) {\r\n operands[operandIndex++] = thisArg;\r\n } else {\r\n operands[operandIndex++] = this.compileExpression(\r\n argumentExpressions[argumentIndex++],\r\n functionInstance.instanceMethodOf.type\r\n );\r\n }\r\n }\r\n if (parameters) {\r\n for (; operandIndex < numParametersInclThis; ++operandIndex) {\r\n\r\n // argument has been provided\r\n if (numArgumentsInclThis > operandIndex) {\r\n operands[operandIndex] = this.compileExpression(\r\n argumentExpressions[argumentIndex++],\r\n parameters[operandIndex + numParameters - numParametersInclThis].type\r\n );\r\n\r\n // argument has been omitted\r\n } else {\r\n var initializer = parameters[operandIndex + numParameters - numParametersInclThis].initializer;\r\n if (initializer) { // fall back to provided initializer\r\n operands[operandIndex] = this.compileExpression(\r\n initializer,\r\n parameters[operandIndex + numParameters - numParametersInclThis].type\r\n );\r\n // FIXME: here, the initializer is compiled in the caller's scope.\r\n // a solution could be to use a stub for each possible overload, calling the\r\n // full function with optional arguments being part of the stub's body.\r\n\r\n } else { // too few arguments\r\n this.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range,\r\n (operandIndex + numParameters - numParametersInclThis).toString(10),\r\n numArguments.toString(10)\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.currentType = functionInstance.returnType;\r\n return this.makeCall(functionInstance, operands);\r\n }\r\n\r\n /** Makes a call operation as is. */\r\n makeCall(functionInstance: Function, operands: ExpressionRef[] | null = null): ExpressionRef {\r\n if (!(functionInstance.is(ElementFlags.COMPILED) || this.compileFunction(functionInstance))) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // imported function\r\n if (functionInstance.is(ElementFlags.DECLARED)) {\r\n return this.module.createCallImport(\r\n functionInstance.internalName,\r\n operands,\r\n functionInstance.returnType.toNativeType()\r\n );\r\n }\r\n\r\n // internal function\r\n return this.module.createCall(\r\n functionInstance.internalName,\r\n operands,\r\n functionInstance.returnType.toNativeType()\r\n );\r\n }\r\n\r\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n var expressions = expression.expressions;\r\n var k = expressions.length;\r\n var exprs = new Array(k--);\r\n for (var i = 0; i < k; ++i) {\r\n exprs[i] = this.compileExpression(expressions[i], Type.void); // drop all\r\n }\r\n exprs[i] = this.compileExpression(expressions[i], contextualType); // except last\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n }\r\n\r\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveElementAccess(expression, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n assert(\r\n resolved.element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n resolved.target &&\r\n resolved.target.kind == ElementKind.CLASS\r\n );\r\n var instance = (resolved.element).resolve(\r\n null,\r\n (resolved.target).contextualTypeArguments\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n return this.compileCall(instance, [\r\n expression.expression,\r\n expression.elementExpression\r\n ], expression);\r\n }\r\n\r\n compileIdentifierExpression(expression: IdentifierExpression, contextualType: Type): ExpressionRef {\r\n // check special keywords first\r\n switch (expression.kind) {\r\n\r\n case NodeKind.NULL:\r\n if (this.options.isWasm64) {\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == TypeKind.USIZE);\r\n this.currentType = Type.usize64;\r\n }\r\n return this.module.createI64(0);\r\n }\r\n if (!contextualType.classType) {\r\n assert(contextualType.kind == TypeKind.USIZE);\r\n this.currentType = Type.usize32;\r\n }\r\n return this.module.createI32(0);\r\n\r\n case NodeKind.TRUE:\r\n this.currentType = Type.bool;\r\n return this.module.createI32(1);\r\n\r\n case NodeKind.FALSE:\r\n this.currentType = Type.bool;\r\n return this.module.createI32(0);\r\n\r\n case NodeKind.THIS:\r\n if (this.currentFunction.instanceMethodOf) {\r\n this.currentType = this.currentFunction.instanceMethodOf.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n this.currentType = this.options.isWasm64 ? Type.usize64 : Type.usize32;\r\n return this.module.createUnreachable();\r\n\r\n case NodeKind.SUPER:\r\n if (this.currentFunction.instanceMethodOf && this.currentFunction.instanceMethodOf.base) {\r\n this.currentType = this.currentFunction.instanceMethodOf.base.type;\r\n return this.module.createGetLocal(0, this.currentType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n this.currentType = this.options.isWasm64 ? Type.usize64 : Type.usize32;\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // otherwise resolve\r\n var resolved = this.program.resolveIdentifier( // reports\r\n expression,\r\n this.currentFunction,\r\n this.currentEnum\r\n );\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n switch (element.kind) {\r\n\r\n case ElementKind.LOCAL:\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n assert((element).index >= 0);\r\n this.currentType = (element).type;\r\n return this.module.createGetLocal((element).index, this.currentType.toNativeType());\r\n\r\n case ElementKind.GLOBAL:\r\n if (element.is(ElementFlags.BUILTIN)) {\r\n return compileBuiltinGetConstant(this, element, expression);\r\n }\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void);\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = (element).type;\r\n return this.module.createGetGlobal((element).internalName, this.currentType.toNativeType());\r\n\r\n case ElementKind.ENUMVALUE: // here: if referenced from within the same enum\r\n if (!element.is(ElementFlags.COMPILED)) {\r\n this.error(\r\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n expression.range\r\n );\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.module.createI32((element).constantValue);\r\n }\r\n return this.module.createGetGlobal((element).internalName, NativeType.I32);\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileLiteralExpression(\r\n expression: LiteralExpression,\r\n contextualType: Type,\r\n implicitNegate: bool = false\r\n ): ExpressionRef {\r\n switch (expression.literalKind) {\r\n\r\n case LiteralKind.ARRAY:\r\n assert(!implicitNegate);\r\n var classType = contextualType.classType;\r\n if (\r\n classType &&\r\n classType == this.program.elements.get(\"Array\") &&\r\n classType.typeArguments && classType.typeArguments.length == 1\r\n ) {\r\n return this.compileStaticArray(\r\n classType.typeArguments[0],\r\n (expression).elementExpressions\r\n );\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n\r\n case LiteralKind.FLOAT: {\r\n var floatValue = (expression).value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == Type.f32) {\r\n return this.module.createF32(floatValue);\r\n }\r\n this.currentType = Type.f64;\r\n return this.module.createF64(floatValue);\r\n }\r\n\r\n case LiteralKind.INTEGER:\r\n var intValue = (expression).value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(\r\n i64_new(0),\r\n intValue\r\n );\r\n }\r\n switch (contextualType.kind) {\r\n\r\n // compile to contextualType if matching\r\n\r\n case TypeKind.I8:\r\n if (i64_is_i8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.I16:\r\n if (i64_is_i16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.I32:\r\n if (i64_is_i32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U8:\r\n if (i64_is_u8(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U16:\r\n if (i64_is_u16(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.U32:\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.BOOL:\r\n if (i64_is_bool(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.USIZE:\r\n if (!this.options.isWasm64) {\r\n if (i64_is_u32(intValue)) {\r\n return this.module.createI32(i64_low(intValue));\r\n }\r\n break;\r\n }\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n\r\n case TypeKind.F32:\r\n if (i64_is_f32(intValue)) {\r\n return this.module.createF32(i64_to_f32(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.F64:\r\n if (i64_is_f64(intValue)) {\r\n return this.module.createF64(i64_to_f64(intValue));\r\n }\r\n break;\r\n\r\n case TypeKind.VOID:\r\n break;\r\n\r\n default:\r\n assert(false);\r\n break;\r\n }\r\n\r\n // otherwise compile to best fitting native type\r\n\r\n if (i64_is_i32(intValue)) {\r\n this.currentType = Type.i32;\r\n return this.module.createI32(i64_low(intValue));\r\n } else {\r\n this.currentType = Type.i64;\r\n return this.module.createI64(i64_low(intValue), i64_high(intValue));\r\n }\r\n\r\n case LiteralKind.STRING:\r\n assert(!implicitNegate);\r\n return this.compileStaticString((expression).value);\r\n\r\n // case LiteralKind.OBJECT:\r\n // case LiteralKind.REGEXP:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n compileStaticString(stringValue: string): ExpressionRef {\r\n var stringSegment: MemorySegment | null = this.stringSegments.get(stringValue);\r\n if (!stringSegment) {\r\n var stringLength = stringValue.length;\r\n var stringBuffer = new Uint8Array(4 + stringLength * 2);\r\n stringBuffer[0] = stringLength & 0xff;\r\n stringBuffer[1] = (stringLength >>> 8) & 0xff;\r\n stringBuffer[2] = (stringLength >>> 16) & 0xff;\r\n stringBuffer[3] = (stringLength >>> 24) & 0xff;\r\n for (var i = 0; i < stringLength; ++i) {\r\n stringBuffer[4 + i * 2] = stringValue.charCodeAt(i) & 0xff;\r\n stringBuffer[5 + i * 2] = (stringValue.charCodeAt(i) >>> 8) & 0xff;\r\n }\r\n stringSegment = this.addMemorySegment(stringBuffer, this.options.usizeType.byteSize);\r\n this.stringSegments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n this.currentType = this.options.usizeType;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n }\r\n assert(i64_is_i32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n }\r\n\r\n compileStaticArray(elementType: Type, expressions: (Expression | null)[]): ExpressionRef {\r\n // compile as static if all element expressions are precomputable, otherwise\r\n // initialize in place.\r\n var isStatic = true;\r\n var size = expressions.length;\r\n\r\n var nativeType = elementType.toNativeType();\r\n var values: usize;\r\n switch (nativeType) {\r\n\r\n case NativeType.I32:\r\n values = changetype(new Int32Array(size));\r\n break;\r\n\r\n case NativeType.I64:\r\n values = changetype(new Array(size));\r\n break;\r\n\r\n case NativeType.F32:\r\n values = changetype(new Float32Array(size));\r\n break;\r\n\r\n case NativeType.F64:\r\n values = changetype(new Float64Array(size));\r\n break;\r\n\r\n default:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n\r\n var exprs = new Array(size);\r\n var expr: BinaryenExpressionRef;\r\n for (var i = 0; i < size; ++i) {\r\n exprs[i] = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType)\r\n : elementType.toNativeZero(this.module);\r\n if (isStatic) {\r\n expr = this.precomputeExpressionRef(exprs[i]);\r\n if (_BinaryenExpressionGetId(expr) == ExpressionId.Const) {\r\n assert(_BinaryenExpressionGetType(expr) == nativeType);\r\n switch (nativeType) {\r\n\r\n case NativeType.I32:\r\n changetype(values)[i] = _BinaryenConstGetValueI32(expr);\r\n break;\r\n\r\n case NativeType.I64:\r\n changetype(values)[i] = i64_new(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n break;\r\n\r\n case NativeType.F32:\r\n changetype(values)[i] = _BinaryenConstGetValueF32(expr);\r\n break;\r\n\r\n case NativeType.F64:\r\n changetype(values)[i] = _BinaryenConstGetValueF64(expr);\r\n break;\r\n\r\n default:\r\n assert(false); // checked above\r\n }\r\n } else {\r\n // TODO: emit a warning if declared 'const'\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n\r\n if (isStatic) {\r\n // TODO: convert to Uint8Array and create the segment\r\n } else {\r\n // TODO: initialize in place\r\n }\r\n // TODO: alternatively, static elements could go into data segments while\r\n // dynamic ones are initialized on top? any benefits? (doesn't seem so)\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolveExpression( // reports\r\n expression.expression,\r\n this.currentFunction\r\n );\r\n if (resolved) {\r\n if (resolved.element.kind == ElementKind.CLASS_PROTOTYPE) {\r\n var prototype = resolved.element;\r\n var instance = prototype.resolveInclTypeArguments( // reports\r\n expression.typeArguments,\r\n null,\r\n expression\r\n );\r\n if (instance) {\r\n var thisExpr = compileBuiltinAllocate(this, instance, expression);\r\n var initializers = new Array();\r\n\r\n // use a temp local for 'this'\r\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\r\n initializers.push(this.module.createSetLocal(tempLocal.index, thisExpr));\r\n\r\n // apply field initializers\r\n if (instance.members) {\r\n for (var member of instance.members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n var field = member;\r\n var fieldDeclaration = field.prototype.declaration;\r\n if (field.is(ElementFlags.CONSTANT)) {\r\n assert(false); // there are no built-in fields currently\r\n } else if (fieldDeclaration && fieldDeclaration.initializer) {\r\n initializers.push(this.module.createStore(field.type.byteSize,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\r\n this.compileExpression(fieldDeclaration.initializer, field.type),\r\n field.type.toNativeType(),\r\n field.memoryOffset\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // apply constructor\r\n var constructorInstance = instance.constructorInstance;\r\n if (constructorInstance) {\r\n initializers.push(this.compileCall(constructorInstance, expression.arguments, expression,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType)\r\n ));\r\n }\r\n\r\n // return 'this'\r\n initializers.push(this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType));\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n thisExpr = this.module.createBlock(null, initializers, this.options.nativeSizeType);\r\n\r\n this.currentType = instance.type;\r\n return thisExpr;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n expression.expression.range\r\n );\r\n }\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileParenthesizedExpression(expression: ParenthesizedExpression, contextualType: Type): ExpressionRef {\r\n // does not change types, just order\r\n return this.compileExpression(expression.expression, contextualType, ConversionKind.NONE);\r\n }\r\n\r\n compilePropertyAccessExpression(propertyAccess: PropertyAccessExpression, contextualType: Type): ExpressionRef {\r\n var resolved = this.program.resolvePropertyAccess(propertyAccess, this.currentFunction); // reports\r\n if (!resolved) return this.module.createUnreachable();\r\n\r\n var element = resolved.element;\r\n var targetExpr: ExpressionRef;\r\n switch (element.kind) {\r\n\r\n case ElementKind.GLOBAL: // static property\r\n if (element.is(ElementFlags.BUILTIN)) {\r\n return compileBuiltinGetConstant(this, element, propertyAccess);\r\n }\r\n if (!this.compileGlobal(element)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n assert((element).type != Type.void);\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.compileInlineConstant(element, contextualType);\r\n }\r\n this.currentType = (element).type;\r\n return this.module.createGetGlobal((element).internalName, this.currentType.toNativeType());\r\n\r\n case ElementKind.ENUMVALUE: // enum value\r\n if (!this.compileEnum((element).enum)) {\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((element).is(ElementFlags.INLINED)) {\r\n return this.module.createI32((element).constantValue);\r\n }\r\n return this.module.createGetGlobal((element).internalName, NativeType.I32);\r\n\r\n case ElementKind.FIELD: // instance field\r\n assert(resolved.target != null);\r\n assert(resolved.targetExpression != null);\r\n assert((element).memoryOffset >= 0);\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.usizeType\r\n );\r\n this.currentType = (element).type;\r\n return this.module.createLoad(\r\n (element).type.size >> 3,\r\n (element).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n targetExpr,\r\n (element).type.toNativeType(),\r\n (element).memoryOffset\r\n );\r\n\r\n case ElementKind.PROPERTY: // instance property (here: getter)\r\n var getter = (element).getterPrototype;\r\n assert(getter != null);\r\n var getterInstance = (getter).resolve(null); // reports\r\n if (!getterInstance) return this.module.createUnreachable();\r\n assert(!getterInstance.parameters || !getterInstance.parameters.length);\r\n this.currentType = getterInstance.returnType;\r\n if (getterInstance.is(ElementFlags.INSTANCE)) {\r\n targetExpr = this.compileExpression(\r\n resolved.targetExpression,\r\n this.options.isWasm64\r\n ? Type.usize64\r\n : Type.usize32\r\n );\r\n this.currentType = getterInstance.returnType;\r\n return this.makeCall(getterInstance, [ targetExpr ]);\r\n } else {\r\n return this.makeCall(getterInstance);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n propertyAccess.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n var condition = this.compileExpression(expression.condition, Type.i32);\r\n var ifThen = this.compileExpression(expression.ifThen, contextualType);\r\n var ifElse = this.compileExpression(expression.ifElse, contextualType);\r\n return this.module.createIf(condition, ifThen, ifElse);\r\n }\r\n\r\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n var op: BinaryOp;\r\n var nativeType: NativeType;\r\n var nativeOne: ExpressionRef;\r\n var possiblyOverflows = false;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.PLUS_PLUS:\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n op = BinaryOp.AddI32;\r\n nativeType = NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n op = this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32;\r\n nativeType = this.options.isWasm64\r\n ? NativeType.I64\r\n : NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n op = BinaryOp.AddI64;\r\n nativeType = NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n\r\n case TypeKind.F32:\r\n op = BinaryOp.AddF32;\r\n nativeType = NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n op = BinaryOp.AddF64;\r\n nativeType = NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n case Token.MINUS_MINUS:\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true;\r\n default:\r\n op = BinaryOp.SubI32;\r\n nativeType = NativeType.I32;\r\n nativeOne = this.module.createI32(1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: check operator overload\r\n case TypeKind.ISIZE:\r\n op = this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32;\r\n nativeType = this.options.isWasm64\r\n ? NativeType.I64\r\n : NativeType.I32;\r\n nativeOne = this.currentType.toNativeOne(this.module);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n op = BinaryOp.SubI64;\r\n nativeType = NativeType.I64;\r\n nativeOne = this.module.createI64(1);\r\n break;\r\n\r\n case TypeKind.F32:\r\n op = BinaryOp.SubF32;\r\n nativeType = NativeType.F32;\r\n nativeOne = this.module.createF32(1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n op = BinaryOp.SubF64;\r\n nativeType = NativeType.F64;\r\n nativeOne = this.module.createF64(1);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"concrete type expected\");\r\n }\r\n break;\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"unary postfix operator expected\");\r\n }\r\n\r\n var setValue: ExpressionRef;\r\n var tempLocal: Local | null = null;\r\n\r\n // simplify if dropped anyway\r\n if (contextualType == Type.void) {\r\n setValue = this.module.createBinary(op,\r\n getValue,\r\n nativeOne\r\n );\r\n\r\n // otherwise use a temp local for the intermediate value\r\n } else {\r\n tempLocal = this.currentFunction.getTempLocal(this.currentType);\r\n setValue = this.module.createBinary(op,\r\n this.module.createGetLocal(tempLocal.index, nativeType),\r\n nativeOne\r\n );\r\n }\r\n\r\n if (possiblyOverflows) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER));\r\n setValue = makeSmallIntegerWrap(setValue, this.currentType, this.module);\r\n }\r\n\r\n setValue = this.compileAssignmentWithValue(expression.operand, setValue, false);\r\n // ^ sets currentType = void\r\n if (contextualType == Type.void) {\r\n assert(!tempLocal);\r\n return setValue;\r\n }\r\n\r\n this.currentType = assert(tempLocal).type;\r\n this.currentFunction.freeTempLocal(tempLocal);\r\n return this.module.createBlock(null, [\r\n this.module.createSetLocal((tempLocal).index, getValue),\r\n setValue,\r\n this.module.createGetLocal((tempLocal).index, nativeType)\r\n ], nativeType);\r\n }\r\n\r\n compileUnaryPrefixExpression(\r\n expression: UnaryPrefixExpression,\r\n contextualType: Type,\r\n wrapSmallIntegers: bool = true\r\n ): ExpressionRef {\r\n var possiblyOverflows = false;\r\n var compound = false;\r\n var expr: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n\r\n case Token.PLUS:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n possiblyOverflows = this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER); // if operand already did\r\n break;\r\n\r\n case Token.MINUS:\r\n if (expression.operand.kind == NodeKind.LITERAL && (\r\n (expression.operand).literalKind == LiteralKind.INTEGER ||\r\n (expression.operand).literalKind == LiteralKind.FLOAT\r\n )) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n this.addDebugLocation(expr, expression.range); // compileExpression normally does this\r\n } else {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.SubI32, this.module.createI32(0), expr);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n this.currentType.toNativeZero(this.module),\r\n expr\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, this.module.createI64(0), expr);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createUnary(UnaryOp.NegF32, expr);\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createUnary(UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n }\r\n break;\r\n\r\n case Token.PLUS_PLUS:\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n expr,\r\n this.currentType.toNativeOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.AddI64, expr, this.module.createI64(1));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.AddF32, expr, this.module.createF32(1));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.AddF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.MINUS_MINUS:\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n false // wrapped below\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n // fall-through\r\n default:\r\n expr = this.module.createBinary(BinaryOp.SubI32, expr, this.module.createI32(1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n expr,\r\n this.currentType.toNativeOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.SubI64, expr, this.module.createI64(1));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = this.module.createBinary(BinaryOp.SubF32, expr, this.module.createF32(1));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = this.module.createBinary(BinaryOp.SubF64, expr, this.module.createF64(1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.EXCLAMATION:\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n true // must wrap small integers\r\n );\r\n expr = makeIsFalseish(expr, this.currentType, this.module);\r\n this.currentType = Type.bool;\r\n break;\r\n\r\n case Token.TILDE:\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n contextualType == Type.void\r\n ? ConversionKind.NONE\r\n : ConversionKind.IMPLICIT,\r\n false // retains low bits of small integers\r\n );\r\n\r\n switch (this.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n possiblyOverflows = true; // or if operand already did\r\n default:\r\n expr = this.module.createBinary(BinaryOp.XorI32, expr, this.module.createI32(-1));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (this.currentType.isReference) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n expr = this.module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n expr,\r\n this.currentType.toNativeNegOne(this.module)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = this.module.createBinary(BinaryOp.XorI64, expr, this.module.createI64(-1, -1));\r\n break;\r\n }\r\n break;\r\n\r\n case Token.TYPEOF:\r\n // it might make sense to implement typeof in a way that a generic function can detect\r\n // whether its type argument is a class type or string. that could then be used, for\r\n // example, to generate hash codes for sets and maps, depending on the kind of type\r\n // parameter we have. ideally the comparison would not involve actual string comparison and\r\n // limit available operations to hard-coded string literals.\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"not implemented\");\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n throw new Error(\"unary operator expected\");\r\n }\r\n if (possiblyOverflows && wrapSmallIntegers) {\r\n assert(this.currentType.is(TypeFlags.SMALL | TypeFlags.INTEGER));\r\n expr = makeSmallIntegerWrap(expr, this.currentType, this.module);\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n if (this.options.sourceMap != null) {\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) {\r\n source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n }\r\n range.debugInfoRef = expr;\r\n if (!this.currentFunction.debugLocations) this.currentFunction.debugLocations = [];\r\n this.currentFunction.debugLocations.push(range);\r\n }\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n/** Wraps a 32-bit integer expression so it evaluates to a valid value of the specified type. */\r\nexport function makeSmallIntegerWrap(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n case TypeKind.I8:\r\n expr = module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(24)\r\n ),\r\n module.createI32(24)\r\n );\r\n break;\r\n\r\n case TypeKind.I16:\r\n expr = module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(16)\r\n ),\r\n module.createI32(16)\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xff)\r\n );\r\n break;\r\n\r\n case TypeKind.U16:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xffff)\r\n );\r\n break;\r\n\r\n case TypeKind.BOOL:\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0x1)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\r\n/** Creates a comparison whether an expression is not 'true' in a broader sense. */\r\nexport function makeIsFalseish(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n default: // any integer up to 32 bits\r\n expr = module.createUnary(UnaryOp.EqzI32, expr);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = module.createUnary(UnaryOp.EqzI64, expr);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: strings\r\n case TypeKind.ISIZE:\r\n expr = module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\r\n/** Creates a comparison whether an expression is 'true' in a broader sense. */\r\nexport function makeIsTrueish(expr: ExpressionRef, type: Type, module: Module): ExpressionRef {\r\n switch (type.kind) {\r\n\r\n default: // any integer up to 32 bits\r\n expr = module.createBinary(BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n // TODO: strings\r\n case TypeKind.ISIZE:\r\n expr = type.size == 64\r\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n : module.createBinary(BinaryOp.NeI32, expr, module.createI32(0));\r\n break;\r\n\r\n case TypeKind.F32:\r\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n break;\r\n\r\n case TypeKind.F64:\r\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n break;\r\n\r\n case TypeKind.VOID:\r\n throw new Error(\"concrete type expected\");\r\n }\r\n return expr;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/compiler.ts","import {\r\n Class,\r\n Function\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionRef,\r\n Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n // signed integers\r\n I8,\r\n I16,\r\n I32,\r\n I64,\r\n ISIZE,\r\n\r\n // unsigned integers\r\n U8,\r\n U16,\r\n U32,\r\n U64,\r\n USIZE,\r\n BOOL, // sic\r\n\r\n // floats\r\n F32,\r\n F64,\r\n\r\n // other\r\n VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n NONE = 0,\r\n /** Is a signed type that can represent negative values. */\r\n SIGNED = 1 << 0,\r\n /** Is an unsigned type that cannot represent negative values. */\r\n UNSIGNED = 1 << 1,\r\n /** Is an integer type. */\r\n INTEGER = 1 << 2,\r\n /** Is a floating point type. */\r\n FLOAT = 1 << 3,\r\n /** Is a sized integer type with a target specific bit size. */\r\n SIZE = 1 << 4,\r\n /** Is a small type that is emulated in a larger type. */\r\n SMALL = 1 << 5,\r\n /** Is a long type larger than 32-bits. */\r\n LONG = 1 << 6,\r\n /** Is a value type. */\r\n VALUE = 1 << 7,\r\n /** Is a reference type. */\r\n REFERENCE = 1 << 8,\r\n /** Is a nullable type. */\r\n NULLABLE = 1 << 9\r\n}\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n /** Type kind. */\r\n kind: TypeKind;\r\n /** Type flags. */\r\n flags: TypeFlags;\r\n /** Size in bits. */\r\n size: u32;\r\n /** Size in bytes. Ceiled to 8-bits. */\r\n byteSize: i32;\r\n /** Underlying class type, if a class type. */\r\n classType: Class | null;\r\n /** Underlying function type, if a function type. */\r\n functionType: Function | null;\r\n /** Respective nullable type, if non-nullable. */\r\n nullableType: Type | null = null;\r\n /** Respective non-nullable type, if nullable. */\r\n nonNullableType: Type;\r\n\r\n /** Constructs a new resolved type. */\r\n constructor(kind: TypeKind, flags: TypeFlags, size: i32) {\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classType = null;\r\n this.nonNullableType = this;\r\n }\r\n\r\n /** Computes the sign-extending shift in the target type. */\r\n computeSmallIntegerShift(targetType: Type): u32 {\r\n return targetType.size - this.size;\r\n }\r\n\r\n /** Computes the truncating mask in the target type. */\r\n computeSmallIntegerMask(targetType: Type): u32 {\r\n return -1 >>> (targetType.size - this.size);\r\n }\r\n\r\n /** Tests if this type has the specified capabilities. */\r\n is(flags: TypeFlags): bool {\r\n return (this.flags & flags) == flags;\r\n }\r\n\r\n /** Tests if this type is a class type. */\r\n get isClass(): bool { return this.classType != null; }\r\n /** Tests if this type is a function type. */\r\n get isFunction(): bool { return this.functionType != null; }\r\n /** Tests if this type is a reference type. */\r\n get isReference(): bool { return this.classType != null || this.functionType != null; }\r\n\r\n /** Composes a class type from this type and a class. */\r\n asClass(classType: Class): Type {\r\n assert(this.kind == TypeKind.USIZE);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.classType = classType;\r\n return ret;\r\n }\r\n\r\n /** Composes a function type from this type and a function. */\r\n asFunction(functionType: Function): Type {\r\n assert(this.kind == TypeKind.USIZE && !this.isReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.functionType = functionType;\r\n return ret;\r\n }\r\n\r\n /** Composes the respective nullable type of this type. */\r\n asNullable(): Type | null {\r\n assert(this.kind == TypeKind.USIZE);\r\n if (!this.nullableType) {\r\n assert(!this.is(TypeFlags.NULLABLE) && this.isReference);\r\n this.nullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n this.nullableType.classType = this.classType;\r\n this.nullableType.functionType = this.functionType;\r\n }\r\n return this.nullableType;\r\n }\r\n\r\n /** Converts this type to its TypeScript representation. */\r\n toString(kindOnly: bool = false): string {\r\n switch (this.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"i64\";\r\n case TypeKind.ISIZE: return \"isize\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n case TypeKind.U64: return \"u64\";\r\n case TypeKind.USIZE:\r\n if (kindOnly) return \"usize\";\r\n return this.classType\r\n ? this.classType.toString()\r\n : this.functionType\r\n ? this.functionType.toTypeString()\r\n : \"usize\";\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.VOID: return \"void\";\r\n default: assert(false); return \"\";\r\n }\r\n }\r\n\r\n // Binaryen specific\r\n\r\n /** Converts this type to its respective native type. */\r\n toNativeType(): NativeType {\r\n switch (this.kind) {\r\n\r\n default:\r\n return NativeType.I32;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return NativeType.I64;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n\r\n case TypeKind.F32:\r\n return NativeType.F32;\r\n\r\n case TypeKind.F64:\r\n return NativeType.F64;\r\n\r\n case TypeKind.VOID:\r\n return NativeType.None;\r\n }\r\n }\r\n\r\n /** Converts this type to its native `0` value. */\r\n toNativeZero(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(0);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(0);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(0);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(0);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(0);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `1` value. */\r\n toNativeOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(1);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(1);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(1);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(1);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(1);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `-1` value. */\r\n toNativeNegOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n\r\n case TypeKind.VOID:\r\n assert(false);\r\n\r\n default:\r\n return module.createI32(-1);\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n if (this.size != 64) return module.createI32(-1);\r\n // fall-through\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return module.createI64(-1, -1);\r\n\r\n case TypeKind.F32:\r\n return module.createF32(-1);\r\n\r\n case TypeKind.F64:\r\n return module.createF64(-1);\r\n }\r\n }\r\n\r\n /** Converts this type to its signature string. */\r\n toSignatureString(): string {\r\n switch (this.kind) {\r\n\r\n default:\r\n return \"i\";\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n return \"I\";\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n return this.size == 64 ? \"I\" : \"i\";\r\n\r\n case TypeKind.F32:\r\n return \"f\";\r\n\r\n case TypeKind.F64:\r\n return \"F\";\r\n\r\n case TypeKind.VOID:\r\n return \"v\";\r\n }\r\n }\r\n\r\n // Types\r\n\r\n /** An 8-bit signed integer. */\r\n static readonly i8: Type = new Type(TypeKind.I8,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit signed integer. */\r\n static readonly i16: Type = new Type(TypeKind.I16,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit signed integer. */\r\n static readonly i32: Type = new Type(TypeKind.I32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed integer. */\r\n static readonly i64: Type = new Type(TypeKind.I64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit signed size. WASM32 only. */\r\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed size. WASM64 only. */\r\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** An 8-bit unsigned integer. */\r\n static readonly u8: Type = new Type(TypeKind.U8,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit unsigned integer. */\r\n static readonly u16: Type = new Type(TypeKind.U16,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit unsigned integer. */\r\n static readonly u32: Type = new Type(TypeKind.U32,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned integer. */\r\n static readonly u64: Type = new Type(TypeKind.U64,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.SIZE |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 1-bit unsigned integer. */\r\n static readonly bool: Type = new Type(TypeKind.BOOL,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SMALL |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 1\r\n );\r\n\r\n /** A 32-bit float. */\r\n static readonly f32: Type = new Type(TypeKind.F32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit float. */\r\n static readonly f64: Type = new Type(TypeKind.F64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** No return type. */\r\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n var k = types.length;\r\n var ret = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n ret[i] = types[i].toNativeType();\r\n }\r\n return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n var k = types.length;\r\n if (!k) return \"\";\r\n var sb = new Array(k);\r\n for (var i = 0; i < k; ++i) {\r\n sb[i] = types[i].toString();\r\n }\r\n return sb.join(\", \");\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/types.ts","import {\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER\r\n} from \"./program\";\r\n\r\nimport {\r\n Token,\r\n Tokenizer,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n normalize as normalizePath,\r\n resolve as resolvePath\r\n} from \"./util/path\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n SOURCE,\r\n\r\n // types\r\n TYPE,\r\n TYPEPARAMETER,\r\n\r\n // expressions\r\n IDENTIFIER,\r\n ASSERTION,\r\n BINARY,\r\n CALL,\r\n COMMA,\r\n ELEMENTACCESS,\r\n FALSE,\r\n LITERAL,\r\n NEW,\r\n NULL,\r\n PARENTHESIZED,\r\n PROPERTYACCESS,\r\n TERNARY,\r\n SUPER,\r\n THIS,\r\n TRUE,\r\n CONSTRUCTOR,\r\n UNARYPOSTFIX,\r\n UNARYPREFIX,\r\n\r\n // statements\r\n BLOCK,\r\n BREAK,\r\n CONTINUE,\r\n DO,\r\n EMPTY,\r\n EXPORT,\r\n EXPORTIMPORT,\r\n EXPRESSION,\r\n FOR,\r\n IF,\r\n IMPORT,\r\n RETURN,\r\n SWITCH,\r\n THROW,\r\n TRY,\r\n VARIABLE,\r\n WHILE,\r\n\r\n // declaration statements\r\n CLASSDECLARATION,\r\n ENUMDECLARATION,\r\n ENUMVALUEDECLARATION,\r\n FIELDDECLARATION,\r\n FUNCTIONDECLARATION,\r\n IMPORTDECLARATION,\r\n INTERFACEDECLARATION,\r\n METHODDECLARATION,\r\n NAMESPACEDECLARATION,\r\n TYPEDECLARATION,\r\n VARIABLEDECLARATION,\r\n\r\n // other\r\n DECORATOR,\r\n EXPORTMEMBER,\r\n MODIFIER,\r\n PARAMETER,\r\n SWITCHCASE\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n /** Node kind indicator. */\r\n kind: NodeKind;\r\n /** Source range. */\r\n range: Range;\r\n /** Parent node. */\r\n parent: Node | null = null;\r\n\r\n // types\r\n\r\n static createType(\r\n identifier: IdentifierExpression,\r\n typeArguments: TypeNode[],\r\n isNullable: bool,\r\n range: Range\r\n ): TypeNode {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = identifier;\r\n type.typeArguments = typeArguments;\r\n type.isNullable = isNullable;\r\n return type;\r\n }\r\n\r\n // expressions\r\n\r\n static createIdentifierExpression(\r\n name: string,\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n }\r\n\r\n static createArrayLiteralExpression(\r\n elements: (Expression | null)[],\r\n range: Range\r\n ): ArrayLiteralExpression {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements; setParentOpt(elements, expr);\r\n return expr;\r\n }\r\n\r\n static createAssertionExpression(\r\n assertionKind: AssertionKind,\r\n expression: Expression,\r\n toType: TypeNode,\r\n range: Range\r\n ): AssertionExpression {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.toType = toType; toType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createBinaryExpression(\r\n operator: Token,\r\n left: Expression,\r\n right: Expression,\r\n range: Range\r\n ): BinaryExpression {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left; left.parent = expr;\r\n expr.right = right; right.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createCallExpression(\r\n expression: Expression,\r\n typeArgs: TypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): CallExpression {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createCommaExpression(\r\n expressions: Expression[],\r\n range: Range\r\n ): CommaExpression {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions; setParent(expressions, expr);\r\n return expr;\r\n }\r\n\r\n static createConstructorExpression(\r\n range: Range\r\n ): ConstructorExpression {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createElementAccessExpression(\r\n expression: Expression,\r\n element: Expression,\r\n range: Range\r\n ): ElementAccessExpression {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.elementExpression = element; element.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createFalseExpression(\r\n range: Range\r\n ): FalseExpression {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createFloatLiteralExpression(\r\n value: f64,\r\n range: Range\r\n ): FloatLiteralExpression {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createIntegerLiteralExpression(\r\n value: I64,\r\n range: Range\r\n ): IntegerLiteralExpression {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createNewExpression(\r\n expression: Expression,\r\n typeArgs: TypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): NewExpression {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createNullExpression(\r\n range: Range\r\n ): NullExpression {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createParenthesizedExpression(\r\n expression: Expression,\r\n range: Range\r\n ): ParenthesizedExpression {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createPropertyAccessExpression(\r\n expression: Expression,\r\n property: IdentifierExpression,\r\n range: Range\r\n ): PropertyAccessExpression {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.property = property; property.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createRegexpLiteralExpression(\r\n pattern: string,\r\n flags: string,\r\n range: Range\r\n ): RegexpLiteralExpression {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n }\r\n\r\n static createTernaryExpression(\r\n condition: Expression,\r\n ifThen: Expression,\r\n ifElse: Expression,\r\n range: Range\r\n ): TernaryExpression {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition; condition.parent = expr;\r\n expr.ifThen = ifThen; ifThen.parent = expr;\r\n expr.ifElse = ifElse; ifElse.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createStringLiteralExpression(\r\n value: string,\r\n range: Range\r\n ): StringLiteralExpression {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createSuperExpression(\r\n range: Range\r\n ): SuperExpression {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createThisExpression(\r\n range: Range\r\n ): ThisExpression {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createTrueExpression(\r\n range: Range\r\n ): TrueExpression {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createUnaryPostfixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPostfixExpression {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createUnaryPrefixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPrefixExpression {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n // statements\r\n\r\n static createBlockStatement(\r\n statements: Statement[],\r\n range: Range\r\n ): BlockStatement {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createBreakStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): BreakStatement {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createClassDeclaration(\r\n identifier: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n extendsType: TypeNode | null,\r\n implementsTypes: TypeNode[],\r\n members: DeclarationStatement[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): ClassDeclaration {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.name = identifier; identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes; setParent(implementsTypes, stmt);\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createContinueStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): ContinueStatement {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createDecorator(\r\n expression: Expression,\r\n args: Expression[] | null,\r\n range: Range\r\n ): Decorator {\r\n var stmt = new Decorator();\r\n stmt.range = range;\r\n stmt.name = expression; expression.parent = stmt;\r\n stmt.arguments = args; if (args) setParent(args, stmt);\r\n if (expression.kind == NodeKind.IDENTIFIER) {\r\n switch ((expression).text) {\r\n case \"global\": stmt.decoratorKind = DecoratorKind.GLOBAL; break;\r\n case \"operator\": stmt.decoratorKind = DecoratorKind.OPERATOR; break;\r\n case \"unmanaged\": stmt.decoratorKind = DecoratorKind.UNMANAGED; break;\r\n case \"offset\": stmt.decoratorKind = DecoratorKind.OFFSET; break;\r\n default: stmt.decoratorKind = DecoratorKind.CUSTOM; break;\r\n }\r\n } else {\r\n stmt.decoratorKind = DecoratorKind.CUSTOM;\r\n }\r\n return stmt;\r\n }\r\n\r\n static createDoStatement(\r\n statement: Statement,\r\n condition: Expression,\r\n range: Range\r\n ): DoStatement {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement; statement.parent = stmt;\r\n stmt.condition = condition; condition.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createEmptyStatement(\r\n range: Range\r\n ): EmptyStatement {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n }\r\n\r\n static createEnumDeclaration(\r\n name: IdentifierExpression,\r\n members: EnumValueDeclaration[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): EnumDeclaration {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.values = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createEnumValueDeclaration(\r\n name: IdentifierExpression,\r\n value: Expression | null,\r\n range: Range\r\n ): EnumValueDeclaration {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportStatement(\r\n members: ExportMember[],\r\n path: StringLiteralExpression | null,\r\n modifiers: Modifier[] | null,\r\n range: Range\r\n ): ExportStatement {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n } else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n return stmt;\r\n }\r\n\r\n static createExportImportStatement(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression,\r\n range: Range\r\n ): ExportImportStatement {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.externalName = externalName; externalName.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportMember(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression | null,\r\n range: Range\r\n ): ExportMember {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n } else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n }\r\n\r\n static createExpressionStatement(\r\n expression: Expression\r\n ): ExpressionStatement {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression; expression.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createIfStatement(\r\n condition: Expression,\r\n ifTrue: Statement,\r\n ifFalse: Statement | null,\r\n range: Range\r\n ): IfStatement {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createImportStatement(\r\n decls: ImportDeclaration[] | null,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportStatementWithWildcard(\r\n identifier: IdentifierExpression,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = resolvePath(\r\n normalizePath(path.value),\r\n range.source.normalizedPath\r\n );\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportDeclaration(\r\n externalName: IdentifierExpression,\r\n name: IdentifierExpression | null,\r\n range: Range\r\n ): ImportDeclaration {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName; externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n } else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n }\r\n\r\n static createInterfaceDeclaration(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n members: DeclarationStatement[],\r\n modifiers: Modifier[] | null,\r\n range: Range\r\n ): InterfaceDeclaration {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n return stmt;\r\n }\r\n\r\n static createFieldDeclaration(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): FieldDeclaration {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.type = type; if (type) type.parent = stmt;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createForStatement(\r\n initializer: Statement | null,\r\n condition: Expression | null,\r\n incrementor: Expression | null,\r\n statement: Statement,\r\n range: Range\r\n ): ForStatement {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.condition = condition; if (condition) condition.parent = stmt;\r\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTypeParameter(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n range: Range\r\n ): TypeParameter {\r\n var elem = new TypeParameter();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createParameter(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n kind: ParameterKind,\r\n range: Range\r\n ): Parameter {\r\n var elem = new Parameter();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n }\r\n\r\n static createFunctionDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n parameters: Parameter[],\r\n returnType: TypeNode | null,\r\n statements: Statement[] | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): FunctionDeclaration {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.parameters = parameters; setParent(parameters, stmt);\r\n stmt.returnType = returnType; if (returnType) returnType.parent = stmt;\r\n stmt.statements = statements; if (statements) setParent(statements, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createMethodDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameter[],\r\n parameters: Parameter[],\r\n returnType: TypeNode | null,\r\n statements: Statement[] | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): MethodDeclaration {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.parameters = parameters; setParent(parameters, stmt);\r\n stmt.returnType = returnType; if (returnType) returnType.parent = stmt;\r\n stmt.statements = statements; if (statements) setParent(statements, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createModifier(kind: ModifierKind, range: Range): Modifier {\r\n var elem = new Modifier();\r\n elem.range = range;\r\n elem.modifierKind = kind;\r\n return elem;\r\n }\r\n\r\n static createNamespaceDeclaration(\r\n name: IdentifierExpression,\r\n members: Statement[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): NamespaceDeclaration {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createReturnStatement(\r\n value: Expression | null,\r\n range: Range\r\n ): ReturnStatement {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createSwitchStatement(\r\n condition: Expression,\r\n cases: SwitchCase[],\r\n range: Range\r\n ): SwitchStatement {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.cases = cases; setParent(cases, stmt);\r\n return stmt;\r\n }\r\n\r\n static createSwitchCase(\r\n label: Expression | null,\r\n statements: Statement[],\r\n range: Range\r\n ): SwitchCase {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label; if (label) label.parent = elem;\r\n elem.statements = statements; setParent(statements, elem);\r\n return elem;\r\n }\r\n\r\n static createThrowStatement(\r\n value: Expression,\r\n range: Range\r\n ): ThrowStatement {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value; value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTryStatement(\r\n statements: Statement[],\r\n catchVariable: IdentifierExpression | null,\r\n catchStatements: Statement[] | null,\r\n finallyStatements: Statement[] | null,\r\n range: Range\r\n ): TryStatement {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable) catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements) setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements) setParent(finallyStatements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createTypeDeclaration(\r\n name: IdentifierExpression,\r\n alias: TypeNode,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): TypeDeclaration {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.alias = alias; alias.parent = stmt;\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableStatement(\r\n declarations: VariableDeclaration[],\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): VariableStatement {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.declarations = declarations; setParent(declarations, stmt);\r\n stmt.modifiers = modifiers; if (modifiers) setParent(modifiers, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableDeclaration(\r\n name: IdentifierExpression,\r\n type: TypeNode | null,\r\n initializer: Expression | null,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null,\r\n range: Range\r\n ): VariableDeclaration {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.modifiers = modifiers; // inherited from parent VariableStatement\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n }\r\n\r\n static createWhileStatement(\r\n condition: Expression,\r\n statement: Statement,\r\n range: Range\r\n ): WhileStatement {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n}\r\n\r\n// types\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends Node {\r\n kind = NodeKind.TYPE;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Type argument references. */\r\n typeArguments: TypeNode[];\r\n /** Whether nullable or not. */\r\n isNullable: bool;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameter extends Node {\r\n kind = NodeKind.TYPEPARAMETER;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Extended type reference, if any. */\r\n extendsType: TypeNode | null;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n kind = NodeKind.IDENTIFIER;\r\n\r\n /** Textual name. */\r\n text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport const enum LiteralKind {\r\n FLOAT,\r\n INTEGER,\r\n STRING,\r\n REGEXP,\r\n ARRAY,\r\n OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n kind = NodeKind.LITERAL;\r\n\r\n /** Specific literal kind. */\r\n literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.ARRAY;\r\n\r\n /** Nested element expressions. */\r\n elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport const enum AssertionKind {\r\n PREFIX,\r\n AS\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n kind = NodeKind.ASSERTION;\r\n\r\n /** Specific kind of this assertion. */\r\n assertionKind: AssertionKind;\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Target type. */\r\n toType: TypeNode;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n kind = NodeKind.BINARY;\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Left-hand side expression */\r\n left: Expression;\r\n /** Right-hand side expression. */\r\n right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n kind = NodeKind.CALL;\r\n\r\n /** Called expression. Usually an identifier or property access expression. */\r\n expression: Expression;\r\n /** Provided type arguments. */\r\n typeArguments: TypeNode[] | null;\r\n /** Provided arguments. */\r\n arguments: Expression[];\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n kind = NodeKind.COMMA;\r\n\r\n /** Sequential expressions. */\r\n expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n kind = NodeKind.CONSTRUCTOR;\r\n text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n kind = NodeKind.ELEMENTACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Element of the expression being accessed. */\r\n elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.FLOAT;\r\n\r\n /** Float value. */\r\n value: f64;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.INTEGER;\r\n\r\n /** Integer value. */\r\n value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n kind = NodeKind.NULL;\r\n text = \"null\";\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n kind = NodeKind.PARENTHESIZED;\r\n\r\n /** Expression in parenthesis. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n kind = NodeKind.PROPERTYACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Property of the expression being accessed. */\r\n property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.REGEXP;\r\n\r\n /** Regular expression pattern. */\r\n pattern: string;\r\n /** Regular expression flags. */\r\n patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n kind = NodeKind.TERNARY;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Expression executed when condition is `true`. */\r\n ifThen: Expression;\r\n /** Expression executed when condition is `false`. */\r\n ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.STRING;\r\n\r\n /** String value without quotes. */\r\n value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n kind = NodeKind.SUPER;\r\n text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n kind = NodeKind.THIS;\r\n text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n kind = NodeKind.TRUE;\r\n text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n kind = NodeKind.FALSE;\r\n text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Operand expression. */\r\n operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\n/** Indicates the specific kind of a modifier. */\r\nexport enum ModifierKind {\r\n ASYNC,\r\n CONST,\r\n LET,\r\n DECLARE,\r\n EXPORT,\r\n IMPORT,\r\n STATIC,\r\n ABSTRACT,\r\n PUBLIC,\r\n PRIVATE,\r\n PROTECTED,\r\n READONLY,\r\n GET,\r\n SET,\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n /** Default source. Usually imported from an entry file. */\r\n DEFAULT,\r\n /** Entry file. */\r\n ENTRY,\r\n /** Library file. */\r\n LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n kind = NodeKind.SOURCE;\r\n parent = null;\r\n\r\n /** Source kind. */\r\n sourceKind: SourceKind;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Path used internally. */\r\n internalPath: string;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Full source text. */\r\n text: string;\r\n /** Tokenizer reference. */\r\n tokenizer: Tokenizer | null = null;\r\n /** Source map index. */\r\n debugInfoIndex: i32 = -1;\r\n\r\n /** Constructs a new source node. */\r\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n super();\r\n this.sourceKind = kind;\r\n this.normalizedPath = normalizedPath;\r\n this.internalPath = mangleInternalPath(this.normalizedPath);\r\n this.statements = new Array();\r\n this.range = new Range(this, 0, text.length);\r\n this.text = text;\r\n }\r\n\r\n /** Tests if this source is an entry file. */\r\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n /** Tests if this source is a stdlib file. */\r\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n /** Simple name being declared. */\r\n name: IdentifierExpression;\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of decorators. */\r\n decorators: Decorator[] | null = null;\r\n\r\n protected cachedProgramLevelInternalName: string | null = null;\r\n protected cachedFileLevelInternalName: string | null = null;\r\n\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get programLevelInternalName(): string {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n }\r\n\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get fileLevelInternalName(): string {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n }\r\n\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get isTopLevel(): bool {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n }\r\n\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get isTopLevelExport(): bool {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return (\r\n hasModifier(ModifierKind.EXPORT, this.modifiers) &&\r\n (parent).isTopLevelExport\r\n );\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return (\r\n hasModifier(ModifierKind.STATIC, this.modifiers) &&\r\n (parent).isTopLevelExport\r\n );\r\n }\r\n return (\r\n parent.kind == NodeKind.SOURCE &&\r\n hasModifier(ModifierKind.EXPORT, this.modifiers)\r\n );\r\n }\r\n\r\n /** Tests if this declaration needs an explicit export. */\r\n needsExplicitExport(member: ExportMember): bool {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (\r\n member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n }\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n /** Variable type. */\r\n type: TypeNode | null;\r\n /** Variable initializer. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n kind = NodeKind.BLOCK;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n kind = NodeKind.BREAK;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n kind = NodeKind.CLASSDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameter[];\r\n /** Base class type being extended. */\r\n extendsType: TypeNode | null;\r\n /** Interface types being implemented. */\r\n implementsTypes: TypeNode[];\r\n /** Class member declarations. */\r\n members: DeclarationStatement[];\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n kind = NodeKind.CONTINUE;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Built-in decorator kinds. */\r\nexport const enum DecoratorKind {\r\n CUSTOM,\r\n GLOBAL,\r\n OPERATOR,\r\n UNMANAGED,\r\n OFFSET\r\n}\r\n\r\n/** Depresents a decorator. */\r\nexport class Decorator extends Statement {\r\n kind = NodeKind.DECORATOR;\r\n\r\n /** Name expression. */\r\n name: Expression;\r\n /** Argument expressions. */\r\n arguments: Expression[] | null;\r\n /** Built-in kind, if applicable. */\r\n decoratorKind: DecoratorKind;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n kind = NodeKind.DO;\r\n\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n /** Condition when to repeat. */\r\n condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMDECLARATION;\r\n\r\n /** Enum value declarations. */\r\n values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMVALUEDECLARATION;\r\n modifiers = null;\r\n // name is inherited\r\n\r\n /** Value expression. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n kind = NodeKind.EXPORTIMPORT;\r\n\r\n /** Identifier being imported. */\r\n name: IdentifierExpression;\r\n /** Identifier being exported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n kind = NodeKind.EXPORTMEMBER;\r\n\r\n /** Identifier being exported. */\r\n name: IdentifierExpression;\r\n /** Identifier seen when imported again. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n kind = NodeKind.EXPORT;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of members. */\r\n members: ExportMember[];\r\n /** Path being exported from, if applicable. */\r\n path: StringLiteralExpression | null;\r\n /** Normalized path, if `path` is set. */\r\n normalizedPath: string | null;\r\n /** Mangled internal path being referenced, if `path` is set. */\r\n internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n kind = NodeKind.EXPRESSION;\r\n\r\n /** Expression being used as a statement.*/\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.FIELDDECLARATION;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n kind = NodeKind.FOR;\r\n\r\n /**\r\n * Initializer statement, if present.\r\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n */\r\n initializer: Statement | null;\r\n /** Condition expression, if present. */\r\n condition: Expression | null;\r\n /** Incrementor expression, if present. */\r\n incrementor: Expression | null;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameter[];\r\n /** Accepted parameters. */\r\n parameters: Parameter[];\r\n /** Return type. */\r\n returnType: TypeNode | null;\r\n /** Contained statements. */\r\n statements: Statement[] | null;\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n kind = NodeKind.IF;\r\n\r\n /** Condition. */\r\n condition: Expression;\r\n /** Statement executed when condition is `true`. */\r\n ifTrue: Statement;\r\n /** Statement executed when condition is `false`. */\r\n ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n kind = NodeKind.IMPORTDECLARATION;\r\n modifiers = null;\r\n\r\n /** Identifier being imported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n kind = NodeKind.IMPORT;\r\n\r\n /** Array of member declarations or `null` if an asterisk import. */\r\n declarations: ImportDeclaration[] | null;\r\n /** Name of the local namespace, if an asterisk import. */\r\n namespaceName: IdentifierExpression | null;\r\n /** Path being imported from. */\r\n path: StringLiteralExpression;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Mangled internal path being referenced. */\r\n internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n /** Array of namespace members. */\r\n members: Statement[];\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n /** No specific flags. */\r\n DEFAULT,\r\n /** Is an optional parameter. */\r\n OPTIONAL,\r\n /** Is a rest parameter. */\r\n REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class Parameter extends Node {\r\n kind = NodeKind.PARAMETER;\r\n\r\n /** Parameter name. */\r\n name: IdentifierExpression;\r\n /** Parameter type. */\r\n type: TypeNode | null;\r\n /** Parameter kind. */\r\n parameterKind: ParameterKind;\r\n /** Initializer expression, if present. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a single modifier. */\r\nexport class Modifier extends Node {\r\n kind = NodeKind.MODIFIER;\r\n\r\n /** Specific modifier kind. */\r\n modifierKind: ModifierKind;\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n kind = NodeKind.RETURN;\r\n\r\n /** Value expression being returned, if present. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n kind = NodeKind.SWITCHCASE;\r\n\r\n /** Label expression. `null` indicates the default case. */\r\n label: Expression | null;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n kind = NodeKind.SWITCH;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Contained cases. */\r\n cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n kind = NodeKind.THROW;\r\n\r\n /** Value expression being thrown. */\r\n value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n kind = NodeKind.TRY;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Exception variable name, if a `catch` clause is present. */\r\n catchVariable: IdentifierExpression | null;\r\n /** Statements being executed on catch, if a `catch` clause is present. */\r\n catchStatements: Statement[] | null;\r\n /** Statements being executed afterwards, if a `finally` clause is present. */\r\n finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n kind = NodeKind.TYPEDECLARATION;\r\n\r\n /** Type being aliased. */\r\n alias: TypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.VARIABLEDECLARATION;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n kind = NodeKind.VARIABLE;\r\n\r\n /** Array of modifiers. */\r\n modifiers: Modifier[] | null;\r\n /** Array of decorators. */\r\n decorators: Decorator[] | null;\r\n /** Array of member declarations. */\r\n declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n kind = NodeKind.WHILE;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Cached unused modifiers for reuse. */\r\nvar reusableModifiers: Modifier[] | null = null;\r\n\r\nexport function setReusableModifiers(modifiers: Modifier[]): void {\r\n reusableModifiers = modifiers;\r\n}\r\n\r\n/** Creates a new modifiers array. */\r\nexport function createModifiers(): Modifier[] {\r\n var ret: Modifier[];\r\n if (reusableModifiers != null) {\r\n ret = reusableModifiers;\r\n reusableModifiers = null;\r\n } else {\r\n ret = [];\r\n }\r\n ret.length = 0;\r\n return ret;\r\n}\r\n\r\n// Utility\r\n\r\n/** Adds a modifier to a set of modifiers. Creates a new set if `null`. */\r\nexport function addModifier(modifier: Modifier, modifiers: Modifier[] | null): Modifier[] {\r\n if (modifiers == null) modifiers = createModifiers();\r\n modifiers.push(modifier);\r\n return modifiers;\r\n}\r\n\r\n/** Gets a specific modifier from the specified set of modifiers. */\r\nexport function getModifier(kind: ModifierKind, modifiers: Modifier[] | null): Modifier | null {\r\n if (modifiers) {\r\n for (var i = 0, k = modifiers.length; i < k; ++i) {\r\n if (modifiers[i].modifierKind == kind) {\r\n return modifiers[i];\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Tests whether a modifier exists in the specified set of modifiers. */\r\nexport function hasModifier(kind: ModifierKind, modifiers: Modifier[] | null): bool {\r\n return getModifier(kind, modifiers) != null;\r\n}\r\n\r\n/** Gets the first decorator by name within at set of decorators, if present. */\r\nexport function getFirstDecorator(name: string, decorators: Decorator[] | null): Decorator | null {\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n var decorator = decorators[i];\r\n var expression = decorator.name;\r\n if (expression.kind == NodeKind.IDENTIFIER && (expression).text == name) {\r\n return decorator;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Tests if a specific decorator is present within the specified decorators. */\r\nexport function hasDecorator(name: string, decorators: Decorator[] | null): bool {\r\n return getFirstDecorator(name, decorators) != null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent) return name;\r\n if (\r\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE\r\n ) { // skip over\r\n if (!(parent = parent.parent)) return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (\r\n hasModifier(ModifierKind.STATIC, declaration.modifiers)\r\n ? STATIC_DELIMITER\r\n : INSTANCE_DELIMITER\r\n ) + name;\r\n }\r\n if (\r\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION\r\n ) {\r\n return mangleInternalName(parent, asGlobal) +\r\n STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\n\r\n// Helpers\r\n\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\n\r\nfunction setParentOpt(nodes: (Node | null)[], parent: Node): void {\r\n for (var i = 0, k = nodes.length; i < k; ++i) {\r\n var node = nodes[i];\r\n if (node) node.parent = parent;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/ast.ts","/*\r\n\r\n This is a modified version of TypeScript's scanner that doesn't perform as much bookkeeping, simply\r\n skips over trivia and provides a more general mark/reset mechanism for the parser to utilize on\r\n ambiguous tokens.\r\n\r\n next() advances the token\r\n peek() peeks for the next token\r\n skip(token) skips over a token if possible\r\n mark() marks at current token\r\n reset() resets to marked state\r\n range() gets the range of the current token\r\n\r\n readFloat() on FLOATLITERAL\r\n readIdentifier() on IDENTIFIER\r\n readInteger() on INTEGERLITERAL\r\n readString() on STRINGLITERAL\r\n\r\n*/\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Source\r\n} from \"./ast\";\r\n\r\nimport {\r\n CharCode,\r\n isLineBreak,\r\n isWhiteSpace,\r\n isIdentifierStart,\r\n isIdentifierPart,\r\n isDecimalDigit,\r\n isOctalDigit,\r\n isKeywordCharacter\r\n} from \"./util/charcode\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n ABSTRACT,\r\n AS,\r\n ASYNC,\r\n AWAIT, // ES2017\r\n BREAK, // ES2017\r\n CASE, // ES2017\r\n CATCH, // ES2017\r\n CLASS, // ES2017\r\n CONST, // ES2017\r\n CONTINUE, // ES2017\r\n CONSTRUCTOR,\r\n DEBUGGER, // ES2017\r\n DECLARE,\r\n DEFAULT, // ES2017\r\n DELETE, // ES2017\r\n DO, // ES2017\r\n ELSE, // ES2017\r\n ENUM, // ES2017 future\r\n EXPORT, // ES2017\r\n EXTENDS, // ES2017\r\n FALSE, // ES\r\n FINALLY, // ES2017\r\n FOR, // ES2017\r\n FROM, // AS possible identifier\r\n FUNCTION, // ES2017\r\n GET,\r\n IF, // ES2017\r\n IMPLEMENTS, // ES2017 non-lexical\r\n IMPORT, // ES2017\r\n IN, // ES2017\r\n INSTANCEOF, // ES2017\r\n INTERFACE, // ES2017 non-lexical\r\n IS,\r\n KEYOF,\r\n LET, // ES2017 non-lexical\r\n MODULE, // AS possible identifier\r\n NAMESPACE, // AS possible identifier\r\n NEW, // ES2017\r\n NULL, // ES\r\n OF,\r\n PACKAGE, // ES2017 non-lexical\r\n PRIVATE, // ES2017 non-lexical\r\n PROTECTED, // ES2017 non-lexical\r\n PUBLIC, // ES2017 non-lexical\r\n READONLY,\r\n RETURN, // ES2017\r\n SET,\r\n STATIC, // ES2017 non-lexical\r\n SUPER, // ES2017\r\n SWITCH, // ES2017\r\n THIS, // ES2017\r\n THROW, // ES2017\r\n TRUE, // ES\r\n TRY, // ES2017\r\n TYPE, // AS possible identifier\r\n TYPEOF, // ES2017\r\n VAR, // ES2017\r\n VOID, // ES2017\r\n WHILE, // ES2017\r\n WITH, // ES2017\r\n YIELD, // ES2017\r\n\r\n // punctuation\r\n\r\n OPENBRACE,\r\n CLOSEBRACE,\r\n OPENPAREN,\r\n CLOSEPAREN,\r\n OPENBRACKET,\r\n CLOSEBRACKET,\r\n DOT,\r\n DOT_DOT_DOT,\r\n SEMICOLON,\r\n COMMA,\r\n LESSTHAN,\r\n GREATERTHAN,\r\n LESSTHAN_EQUALS,\r\n GREATERTHAN_EQUALS,\r\n EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS,\r\n EQUALS_EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS_EQUALS,\r\n EQUALS_GREATERTHAN,\r\n PLUS,\r\n MINUS,\r\n ASTERISK_ASTERISK,\r\n ASTERISK,\r\n SLASH,\r\n PERCENT,\r\n PLUS_PLUS,\r\n MINUS_MINUS,\r\n LESSTHAN_LESSTHAN,\r\n GREATERTHAN_GREATERTHAN,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n AMPERSAND,\r\n BAR,\r\n CARET,\r\n EXCLAMATION,\r\n TILDE,\r\n AMPERSAND_AMPERSAND,\r\n BAR_BAR,\r\n QUESTION,\r\n COLON,\r\n EQUALS,\r\n PLUS_EQUALS,\r\n MINUS_EQUALS,\r\n ASTERISK_EQUALS,\r\n ASTERISK_ASTERISK_EQUALS,\r\n SLASH_EQUALS,\r\n PERCENT_EQUALS,\r\n LESSTHAN_LESSTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n AMPERSAND_EQUALS,\r\n BAR_EQUALS,\r\n CARET_EQUALS,\r\n AT,\r\n\r\n // literals\r\n\r\n IDENTIFIER,\r\n STRINGLITERAL,\r\n INTEGERLITERAL,\r\n FLOATLITERAL,\r\n\r\n // meta\r\n\r\n INVALID,\r\n ENDOFFILE\r\n}\r\n\r\nexport namespace Token {\r\n\r\n export function fromKeyword(text: string): Token {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n case \"break\": return Token.BREAK;\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n case \"get\": return Token.GET;\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n case \"keyof\": return Token.KEYOF;\r\n case \"let\": return Token.LET;\r\n case \"module\": return Token.MODULE;\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n case \"of\": return Token.OF;\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n case \"yield\": return Token.YIELD;\r\n default: return Token.INVALID;\r\n }\r\n }\r\n\r\n export function isAlsoIdentifier(token: Token): bool {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nexport class Range {\r\n\r\n source: Source;\r\n start: i32;\r\n end: i32;\r\n\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n\r\n constructor(source: Source, start: i32, end: i32) {\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n\r\n static join(a: Range, b: Range): Range {\r\n if (a.source != b.source) throw new Error(\"source mismatch\");\r\n return new Range(a.source,\r\n a.start < b.start ? a.start : b.start,\r\n a.end > b.end ? a.end : b.end\r\n );\r\n }\r\n\r\n get atStart(): Range {\r\n return new Range(this.source, this.start, this.start);\r\n }\r\n get atEnd(): Range {\r\n return new Range(this.source, this.end, this.end);\r\n }\r\n\r\n get line(): i32 {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var line = 1;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) {\r\n line++;\r\n }\r\n }\r\n return line;\r\n }\r\n\r\n get column(): i32 {\r\n var text = this.source.text;\r\n var pos = this.start;\r\n var column = 0;\r\n while (pos-- > 0) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n column++;\r\n }\r\n return column;\r\n }\r\n\r\n toString(): string {\r\n return this.source.text.substring(this.start, this.end);\r\n }\r\n\r\n debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n source: Source;\r\n end: i32 = 0;\r\n\r\n pos: i32 = 0;\r\n token: Token = -1;\r\n tokenPos: i32 = 0;\r\n\r\n markedPos: i32 = 0;\r\n markedToken: Token = -1;\r\n markedTokenPos: i32 = 0;\r\n\r\n nextToken: Token = -1;\r\n nextTokenOnNewLine: bool = false;\r\n\r\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.source = source;\r\n this.pos = 0;\r\n this.end = source.text.length;\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n var text = source.text;\r\n\r\n // skip bom\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n ) {\r\n ++this.pos;\r\n }\r\n\r\n // skip shebang\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.HASH &&\r\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n ) {\r\n this.pos += 2;\r\n while (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n }\r\n\r\n next(preferIdentifier: bool = false): Token {\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(preferIdentifier);\r\n }\r\n\r\n private unsafeNext(preferIdentifier: bool = false, maxTokenLength: i32 = i32.MAX_VALUE): Token {\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n var c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n\r\n case CharCode.CARRIAGERETURN:\r\n if (\r\n ++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n break;\r\n\r\n case CharCode.LINEFEED:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.SPACE:\r\n ++this.pos;\r\n break;\r\n\r\n case CharCode.EXCLAMATION:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n\r\n case CharCode.DOUBLEQUOTE:\r\n case CharCode.SINGLEQUOTE:\r\n case CharCode.BACKTICK: // TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n\r\n case CharCode.PERCENT:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n\r\n case CharCode.AMPERSAND:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n\r\n case CharCode.OPENPAREN:\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n\r\n case CharCode.CLOSEPAREN:\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n\r\n case CharCode.ASTERISK:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n\r\n case CharCode.PLUS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n\r\n case CharCode.COMMA:\r\n ++this.pos;\r\n return Token.COMMA;\r\n\r\n case CharCode.MINUS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n\r\n case CharCode.DOT:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (\r\n maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.DOT &&\r\n text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n ) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n\r\n case CharCode.SLASH:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n // TODO: triple-slash?\r\n // if (\r\n // this.pos + 1 < this.end &&\r\n // text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n // ) {\r\n // }\r\n while (++this.pos < this.end) {\r\n if (isLineBreak(text.charCodeAt(this.pos))) break;\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n var closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (\r\n c == CharCode.ASTERISK &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n this.range(this.pos), \"*/\"\r\n );\r\n }\r\n continue;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n\r\n case CharCode._0:\r\n case CharCode._1:\r\n case CharCode._2:\r\n case CharCode._3:\r\n case CharCode._4:\r\n case CharCode._5:\r\n case CharCode._6:\r\n case CharCode._7:\r\n case CharCode._8:\r\n case CharCode._9:\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n\r\n case CharCode.COLON:\r\n ++this.pos;\r\n return Token.COLON;\r\n\r\n case CharCode.SEMICOLON:\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n\r\n case CharCode.LESSTHAN:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n\r\n case CharCode.EQUALS:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n\r\n case CharCode.GREATERTHAN:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n\r\n case CharCode.QUESTION:\r\n ++this.pos;\r\n return Token.QUESTION;\r\n\r\n case CharCode.OPENBRACKET:\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n\r\n case CharCode.CLOSEBRACKET:\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n\r\n case CharCode.CARET:\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n\r\n case CharCode.OPENBRACE:\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n\r\n case CharCode.BAR:\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n\r\n case CharCode.CLOSEBRACE:\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n\r\n case CharCode.TILDE:\r\n ++this.pos;\r\n return Token.TILDE;\r\n\r\n case CharCode.AT:\r\n ++this.pos;\r\n return Token.AT;\r\n\r\n default:\r\n if (isIdentifierStart(c)) {\r\n if (isKeywordCharacter(c)) {\r\n var posBefore = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(c = text.charCodeAt(this.pos))\r\n ) {\r\n if (!isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n var keywordText = text.substring(posBefore, this.pos);\r\n var keywordToken = Token.fromKeyword(keywordText);\r\n if (\r\n keywordToken != Token.INVALID &&\r\n !(preferIdentifier && Token.isAlsoIdentifier(keywordToken))\r\n ) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n } else if (isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Invalid_character,\r\n this.range(this.pos, this.pos + 1)\r\n );\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n }\r\n\r\n peek(\r\n checkOnNewLine: bool = false,\r\n preferIdentifier: bool = false,\r\n maxCompoundLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(preferIdentifier, maxCompoundLength);\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n while (--this.tokenPos > posBefore) {\r\n if (isLineBreak(text.charCodeAt(this.tokenPos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n }\r\n\r\n skip(token: Token): bool {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN: // where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n this.token = this.unsafeNext(token == Token.IDENTIFIER, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n } else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n }\r\n\r\n // skipUntil(token1: Token, token2: Token = -1): bool {\r\n // var next: Token;\r\n // do {\r\n // if ((next = this.peek()) == Token.ENDOFFILE)\r\n // return false;\r\n // if (next == token1 || next == token2)\r\n // return true;\r\n // this.next();\r\n // } while (true);\r\n // }\r\n\r\n mark(): void {\r\n this.markedPos = this.pos;\r\n this.markedToken = this.token;\r\n this.markedTokenPos = this.tokenPos;\r\n }\r\n\r\n reset(): void {\r\n this.pos = this.markedPos;\r\n this.token = this.markedToken;\r\n this.tokenPos = this.markedTokenPos;\r\n this.nextToken = -1;\r\n }\r\n\r\n range(start: i32 = -1, end: i32 = -1): Range {\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n } else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n }\r\n\r\n readIdentifier(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(text.charCodeAt(this.pos))\r\n );\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readString(): string {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.end)\r\n );\r\n break;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == CharCode.BACKSLASH) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n }\r\n\r\n readEscapeSequence(): string {\r\n if (++this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.end)\r\n );\r\n return \"\";\r\n }\r\n\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n\r\n case CharCode._0:\r\n return \"\\0\";\r\n\r\n case CharCode.b:\r\n return \"\\b\";\r\n\r\n case CharCode.t:\r\n return \"\\t\";\r\n\r\n case CharCode.n:\r\n return \"\\n\";\r\n\r\n case CharCode.v:\r\n return \"\\v\";\r\n\r\n case CharCode.f:\r\n return \"\\f\";\r\n\r\n case CharCode.r:\r\n return \"\\r\";\r\n\r\n case CharCode.SINGLEQUOTE:\r\n return \"'\";\r\n\r\n case CharCode.DOUBLEQUOTE:\r\n return \"\\\"\";\r\n\r\n case CharCode.u: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n ) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n\r\n case CharCode.CARRIAGERETURN:\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n\r\n case CharCode.LINEFEED:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR:\r\n return \"\";\r\n default:\r\n return String.fromCharCode(c);\r\n }\r\n }\r\n\r\n readRegexpPattern(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.end)\r\n );\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode.SLASH && !escaped) break;\r\n if (isLineBreak(c)) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readRegexpFlags(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n var c: i32 = text.charCodeAt(this.pos);\r\n if (!isIdentifierPart(c)) break;\r\n ++this.pos;\r\n\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n\r\n case CharCode.g:\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n\r\n case CharCode.i:\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n\r\n case CharCode.m:\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n\r\n default:\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(\r\n DiagnosticCode.Invalid_regular_expression_flags,\r\n this.range(start, this.pos)\r\n );\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n testInteger(): bool {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case CharCode.X:\r\n case CharCode.x:\r\n case CharCode.B:\r\n case CharCode.b:\r\n case CharCode.O:\r\n case CharCode.o:\r\n return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n var c = text.charCodeAt(pos);\r\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n return false;\r\n }\r\n if (c < CharCode._0 || c > CharCode._9) break;\r\n pos++;\r\n }\r\n return true;\r\n }\r\n\r\n readInteger(): I64 {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n\r\n case CharCode.X:\r\n case CharCode.x:\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n\r\n case CharCode.B:\r\n case CharCode.b:\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n\r\n case CharCode.O:\r\n case CharCode.o:\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n var start = this.pos;\r\n ++this.pos;\r\n var value = this.readOctalInteger();\r\n this.error(\r\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n this.range(start, this.pos)\r\n );\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n }\r\n\r\n readHexInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.A, 0)\r\n );\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.a, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readDecimalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_10),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readOctalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c >= CharCode._0 && c <= CharCode._7) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_8),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Octal_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readBinaryInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode._0) {\r\n // value = value * 2;\r\n value = i64_mul(\r\n value,\r\n i64_2\r\n );\r\n } else if (c == CharCode._1) {\r\n // value = value * 2 + 1;\r\n value = i64_add(\r\n i64_mul(value, i64_2),\r\n i64_1\r\n );\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Binary_digit_expected,\r\n this.range(start)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readFloat(): f64 {\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n ++this.pos;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos);\r\n if (c == CharCode.E || c == CharCode.e) {\r\n if (\r\n ++this.pos < this.end && (\r\n text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n text.charCodeAt(this.pos) == CharCode.PLUS\r\n ) &&\r\n isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n ) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n }\r\n\r\n readUnicodeEscape(): string {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n var c = text.charCodeAt(this.pos++);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n value = value * 16 + c - CharCode._0;\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n value = value * 16 + 10 + c - CharCode.A;\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n value = value * 16 + 10 + c - CharCode.a;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(this.pos - 1, this.pos)\r\n );\r\n return \"\";\r\n }\r\n if (--remain == 0) break;\r\n }\r\n if (remain) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.pos)\r\n );\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n }\r\n\r\n private readExtendedUnicodeEscape(): string {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(\r\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(start, this.end)\r\n );\r\n invalid = true;\r\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n ++this.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n if (invalid) return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode(\r\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\r\n );\r\n }\r\n\r\n finish(): void {\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/tokenizer.ts","// code below is generated from diagnosticsMessages.json by scripts/build-diagnostics\n/* tslint:disable:max-line-length */\n\nexport enum DiagnosticCode {\n Operation_not_supported = 100,\n Operation_is_unsafe = 101,\n Conversion_from_type_0_to_1_possibly_loses_information_and_thus_requires_an_explicit_cast = 200,\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n Type_0_cannot_be_changed_to_type_1 = 202,\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n Basic_type_0_cannot_be_nullable = 204,\n Cannot_export_a_mutable_global = 205,\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n Structs_cannot_extend_classes_and_vice_versa = 207,\n Structs_cannot_implement_interfaces = 208,\n Invalid_regular_expression_flags = 209,\n Implementation_0_must_match_the_signature_1 = 210,\n Unterminated_string_literal = 1002,\n Identifier_expected = 1003,\n _0_expected = 1005,\n A_file_cannot_have_a_reference_to_itself = 1006,\n Trailing_comma_not_allowed = 1009,\n Unexpected_token = 1012,\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n Parameter_cannot_have_question_mark_and_initializer = 1015,\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n Enum_member_must_have_initializer = 1061,\n Statements_are_not_allowed_in_ambient_contexts = 1036,\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\n _0_modifier_cannot_be_used_here = 1042,\n A_rest_parameter_cannot_be_optional = 1047,\n A_rest_parameter_cannot_have_an_initializer = 1048,\n A_set_accessor_must_have_exactly_one_parameter = 1049,\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n A_get_accessor_cannot_have_parameters = 1054,\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n An_accessor_cannot_have_type_parameters = 1094,\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n Type_parameter_list_cannot_be_empty = 1098,\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\n Expression_expected = 1109,\n Type_expected = 1110,\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n Duplicate_label_0 = 1114,\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\n Digit_expected = 1124,\n Hexadecimal_digit_expected = 1125,\n Unexpected_end_of_text = 1126,\n Invalid_character = 1127,\n _case_or_default_expected = 1130,\n Type_argument_expected = 1140,\n String_literal_expected = 1141,\n Line_break_not_permitted_here = 1142,\n Declaration_expected = 1146,\n _const_declarations_must_be_initialized = 1155,\n Unterminated_regular_expression_literal = 1161,\n Binary_digit_expected = 1177,\n Octal_digit_expected = 1178,\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n Unterminated_Unicode_escape_sequence = 1199,\n Decorators_are_not_valid_here = 1206,\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n A_class_may_only_extend_another_class = 1311,\n Duplicate_identifier_0 = 2300,\n Cannot_find_name_0 = 2304,\n Module_0_has_no_exported_member_1 = 2305,\n Generic_type_0_requires_1_type_argument_s = 2314,\n Type_0_is_not_generic = 2315,\n Type_0_is_not_assignable_to_type_1 = 2322,\n Index_signature_is_missing_in_type_0 = 2329,\n _this_cannot_be_referenced_in_current_location = 2332,\n _super_can_only_be_referenced_in_a_derived_class = 2335,\n Property_0_does_not_exist_on_type_1 = 2339,\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n _get_and_set_accessor_must_have_the_same_type = 2380,\n Constructor_implementation_is_missing = 2390,\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n Multiple_constructor_implementations_are_not_allowed = 2392,\n Duplicate_function_implementation = 2393,\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n Index_signature_in_type_0_only_permits_reading = 2542,\n Expected_0_arguments_but_got_1 = 2554,\n Expected_at_least_0_arguments_but_got_1 = 2555,\n Expected_0_type_arguments_but_got_1 = 2558,\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n Namespace_0_has_no_exported_member_1 = 2694,\n File_0_not_found = 6054\n}\n\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n switch (code) {\n case 100: return \"Operation not supported.\";\n case 101: return \"Operation is unsafe.\";\n case 200: return \"Conversion from type '{0}' to '{1}' possibly loses information and thus requires an explicit cast.\";\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n case 204: return \"Basic type '{0}' cannot be nullable.\";\n case 205: return \"Cannot export a mutable global.\";\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n case 207: return \"Structs cannot extend classes and vice-versa.\";\n case 208: return \"Structs cannot implement interfaces.\";\n case 209: return \"Invalid regular expression flags.\";\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n case 1002: return \"Unterminated string literal.\";\n case 1003: return \"Identifier expected.\";\n case 1005: return \"'{0}' expected.\";\n case 1006: return \"A file cannot have a reference to itself.\";\n case 1009: return \"Trailing comma not allowed.\";\n case 1012: return \"Unexpected token.\";\n case 1014: return \"A rest parameter must be last in a parameter list.\";\n case 1015: return \"Parameter cannot have question mark and initializer.\";\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\n case 1061: return \"Enum member must have initializer.\";\n case 1036: return \"Statements are not allowed in ambient contexts.\";\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\n case 1042: return \"'{0}' modifier cannot be used here.\";\n case 1047: return \"A rest parameter cannot be optional.\";\n case 1048: return \"A rest parameter cannot have an initializer.\";\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n case 1054: return \"A 'get' accessor cannot have parameters.\";\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n case 1094: return \"An accessor cannot have type parameters.\";\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n case 1098: return \"Type parameter list cannot be empty.\";\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n case 1108: return \"A 'return' statement can only be used within a function body.\";\n case 1109: return \"Expression expected.\";\n case 1110: return \"Type expected.\";\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n case 1114: return \"Duplicate label '{0}'.\";\n case 1121: return \"Octal literals are not allowed in strict mode.\";\n case 1124: return \"Digit expected.\";\n case 1125: return \"Hexadecimal digit expected.\";\n case 1126: return \"Unexpected end of text.\";\n case 1127: return \"Invalid character.\";\n case 1130: return \"'case' or 'default' expected.\";\n case 1140: return \"Type argument expected.\";\n case 1141: return \"String literal expected.\";\n case 1142: return \"Line break not permitted here.\";\n case 1146: return \"Declaration expected.\";\n case 1155: return \"'const' declarations must be initialized.\";\n case 1161: return \"Unterminated regular expression literal.\";\n case 1177: return \"Binary digit expected.\";\n case 1178: return \"Octal digit expected.\";\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n case 1199: return \"Unterminated Unicode escape sequence.\";\n case 1206: return \"Decorators are not valid here.\";\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n case 1311: return \"A class may only extend another class.\";\n case 2300: return \"Duplicate identifier '{0}'.\";\n case 2304: return \"Cannot find name '{0}'.\";\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n case 2315: return \"Type '{0}' is not generic.\";\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n case 2329: return \"Index signature is missing in type '{0}'.\";\n case 2332: return \"'this' cannot be referenced in current location.\";\n case 2335: return \"'super' can only be referenced in a derived class.\";\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\n case 2390: return \"Constructor implementation is missing.\";\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n case 2392: return \"Multiple constructor implementations are not allowed.\";\n case 2393: return \"Duplicate function implementation.\";\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\n case 2554: return \"Expected {0} arguments, but got {1}.\";\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n case 6054: return \"File '{0}' not found.\";\n default: return \"\";\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/diagnosticMessages.generated.ts","/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n NULL = 0,\r\n LINEFEED = 0x0A,\r\n CARRIAGERETURN = 0x0D,\r\n LINESEPARATOR = 0x2028,\r\n PARAGRAPHSEPARATOR = 0x2029,\r\n NEXTLINE = 0x0085,\r\n\r\n SPACE = 0x20,\r\n NONBREAKINGSPACE = 0xA0,\r\n ENQUAD = 0x2000,\r\n EMQUAD = 0x2001,\r\n ENSPACE = 0x2002,\r\n EMSPACE = 0x2003,\r\n THREEPEREMSPACE = 0x2004,\r\n FOURPEREMSPACE = 0x2005,\r\n SIXPEREMSPACE = 0x2006,\r\n FIGURESPACE = 0x2007,\r\n PUNCTUATIONSPACE = 0x2008,\r\n THINSPACE = 0x2009,\r\n HAIRSPACE = 0x200A,\r\n ZEROWIDTHSPACE = 0x200B,\r\n NARROWNOBREAKSPACE = 0x202F,\r\n IDEOGRAPHICSPACE = 0x3000,\r\n MATHEMATICALSPACE = 0x205F,\r\n OGHAM = 0x1680,\r\n\r\n _ = 0x5F,\r\n\r\n _0 = 0x30,\r\n _1 = 0x31,\r\n _2 = 0x32,\r\n _3 = 0x33,\r\n _4 = 0x34,\r\n _5 = 0x35,\r\n _6 = 0x36,\r\n _7 = 0x37,\r\n _8 = 0x38,\r\n _9 = 0x39,\r\n\r\n a = 0x61,\r\n b = 0x62,\r\n c = 0x63,\r\n d = 0x64,\r\n e = 0x65,\r\n f = 0x66,\r\n g = 0x67,\r\n h = 0x68,\r\n i = 0x69,\r\n j = 0x6A,\r\n k = 0x6B,\r\n l = 0x6C,\r\n m = 0x6D,\r\n n = 0x6E,\r\n o = 0x6F,\r\n p = 0x70,\r\n q = 0x71,\r\n r = 0x72,\r\n s = 0x73,\r\n t = 0x74,\r\n u = 0x75,\r\n v = 0x76,\r\n w = 0x77,\r\n x = 0x78,\r\n y = 0x79,\r\n z = 0x7A,\r\n\r\n A = 0x41,\r\n B = 0x42,\r\n C = 0x43,\r\n D = 0x44,\r\n E = 0x45,\r\n F = 0x46,\r\n G = 0x47,\r\n H = 0x48,\r\n I = 0x49,\r\n J = 0x4A,\r\n K = 0x4B,\r\n L = 0x4C,\r\n M = 0x4D,\r\n N = 0x4E,\r\n O = 0x4F,\r\n P = 0x50,\r\n Q = 0x51,\r\n R = 0x52,\r\n S = 0x53,\r\n T = 0x54,\r\n U = 0x55,\r\n V = 0x56,\r\n W = 0x57,\r\n X = 0x58,\r\n Y = 0x59,\r\n Z = 0x5a,\r\n\r\n AMPERSAND = 0x26,\r\n ASTERISK = 0x2A,\r\n AT = 0x40,\r\n BACKSLASH = 0x5C,\r\n BACKTICK = 0x60,\r\n BAR = 0x7C,\r\n CARET = 0x5E,\r\n CLOSEBRACE = 0x7D,\r\n CLOSEBRACKET = 0x5D,\r\n CLOSEPAREN = 0x29,\r\n COLON = 0x3A,\r\n COMMA = 0x2C,\r\n DOLLAR = 0x24,\r\n DOT = 0x2E,\r\n DOUBLEQUOTE = 0x22,\r\n EQUALS = 0x3D,\r\n EXCLAMATION = 0x21,\r\n GREATERTHAN = 0x3E,\r\n HASH = 0x23,\r\n LESSTHAN = 0x3C,\r\n MINUS = 0x2D,\r\n OPENBRACE = 0x7B,\r\n OPENBRACKET = 0x5B,\r\n OPENPAREN = 0x28,\r\n PERCENT = 0x25,\r\n PLUS = 0x2B,\r\n QUESTION = 0x3F,\r\n SEMICOLON = 0x3B,\r\n SINGLEQUOTE = 0x27,\r\n SLASH = 0x2F,\r\n TILDE = 0x7E,\r\n\r\n BACKSPACE = 0x08,\r\n FORMFEED = 0x0C,\r\n BYTEORDERMARK = 0xFEFF,\r\n TAB = 0x09,\r\n VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n switch (c) {\r\n case CharCode.LINEFEED:\r\n case CharCode.CARRIAGERETURN:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n switch (c) {\r\n case CharCode.SPACE:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.NONBREAKINGSPACE:\r\n case CharCode.NEXTLINE:\r\n case CharCode.OGHAM:\r\n case CharCode.NARROWNOBREAKSPACE:\r\n case CharCode.MATHEMATICALSPACE:\r\n case CharCode.IDEOGRAPHICSPACE:\r\n case CharCode.BYTEORDERMARK:\r\n return true;\r\n default:\r\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is a decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is an octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c >= CharCode._0 && c <= CharCode._9\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n if (code < map[0]) return false;\r\n\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid: i32;\r\n\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n } else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/charcode.ts","import {\r\n CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalize(path: string): string {\r\n var pos = 0;\r\n var len = path.length;\r\n\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == CharCode.DOT &&\r\n path.charCodeAt(pos + 1) == separator\r\n ) {\r\n pos += 2;\r\n }\r\n\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n\r\n var atEnd: bool;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n\r\n // we are only interested in '/.' sequences ...\r\n if (\r\n path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == CharCode.DOT\r\n ) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator\r\n ) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n path.charCodeAt(pos + 3) == separator\r\n ) {\r\n // find preceeding '/'\r\n var ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n path.charCodeAt(ipos + 2) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != CharCode.DOT ||\r\n path.charCodeAt(1) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolve(normalizedPath: string, origin: string): string {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalize(\r\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/util/path.ts","import \"../../../std/portable\";\r\nimport \"./binaryen\";\r\nimport \"./i64\";\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/glue/js/index.ts","var globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 1, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"MIN_VALUE\": { value: Math.fround(-3.40282347e+38), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.40282347e+38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false },\r\n \"EPSILON\": { value: Math.fround(1.19209290e-07), writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"MIN_VALUE\": { value: -1.7976931348623157e+308, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false },\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./std/portable.js\n// module id = 13\n// module chunks = 0","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\n\r\nfor (var key in binaryen)\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\"))\r\n global[key] = binaryen[key];\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.allocate_memory = function(size) {\r\n if (!size) return 0; // should be safe in our case\r\n return binaryen._malloc(size);\r\n};\r\n\r\nglobal.free_memory = function(ptr) {\r\n if (ptr) binaryen._free(ptr);\r\n};\r\n\r\nglobal.move_memory = function(dest, src, n) {\r\n return binaryen._memmove(dest, src, n);\r\n};\r\n\r\nglobal.store = function(ptr, val) {\r\n binaryen.HEAPU8[ptr] = val;\r\n};\r\n\r\nglobal.load = function(ptr) {\r\n return binaryen.HEAPU8[ptr];\r\n};\r\n\r\n// Implement module stubs\r\n\r\nconst Module = require(\"../../module\").Module;\r\n\r\nModule.prototype.toText = function toText() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrint(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\r\nModule.prototype.toAsmjs = function toAsmjs() {\r\n var previousPrint = binaryen.print;\r\n var ret = \"\";\r\n binaryen.print = function(x) { ret += x + \"\\n\" };\r\n _BinaryenModulePrintAsmjs(this.ref);\r\n binaryen.print = previousPrint;\r\n return ret;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glue/js/binaryen.js\n// module id = 14\n// module chunks = 0","module.exports = __WEBPACK_EXTERNAL_MODULE_15__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"binaryen\"\n// module id = 15\n// module chunks = 0","import {\r\n Compiler,\r\n ConversionKind,\r\n\r\n makeSmallIntegerWrap\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node,\r\n Expression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n NativeType,\r\n ExpressionRef,\r\n ExpressionId\r\n} from \"./module\";\r\n\r\nimport {\r\n Global,\r\n FunctionPrototype,\r\n Local,\r\n ElementFlags,\r\n Class,\r\n ElementKind\r\n} from \"./program\";\r\n\r\n/** Compiles a get of a built-in global. */\r\nexport function compileGetConstant(\r\n compiler: Compiler,\r\n global: Global,\r\n reportNode: Node\r\n): ExpressionRef {\r\n switch (global.internalName) {\r\n\r\n case \"NaN\": // context-sensitive\r\n if (compiler.currentType == Type.f32) {\r\n return compiler.module.createF32(NaN);\r\n } else {\r\n compiler.currentType = Type.f64;\r\n return compiler.module.createF64(NaN);\r\n }\r\n\r\n case \"Infinity\": // context-sensitive\r\n if (compiler.currentType == Type.f32) {\r\n return compiler.module.createF32(Infinity);\r\n } else {\r\n compiler.currentType = Type.f64;\r\n return compiler.module.createF64(Infinity);\r\n }\r\n\r\n case \"HEAP_BASE\": // never inlined for linking purposes\r\n compiler.currentType = compiler.options.usizeType;\r\n return compiler.module.createGetGlobal(\"HEAP_BASE\", compiler.currentType.toNativeType());\r\n }\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return compiler.module.createUnreachable();\r\n}\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n\r\n var arg0: ExpressionRef,\r\n arg1: ExpressionRef,\r\n arg2: ExpressionRef,\r\n ret: ExpressionRef;\r\n\r\n var tempLocal0: Local,\r\n tempLocal1: Local;\r\n\r\n var type: Type,\r\n offset: i32;\r\n\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once/ it's known if/how embedders handle it.\r\n // search: createSelect\r\n\r\n switch (prototype.internalName) {\r\n\r\n // math\r\n\r\n case \"isNaN\": // isNaN(value: T) -> bool\r\n compiler.currentType = Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createBinary(BinaryOp.NeF32,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createBinary(BinaryOp.NeF64,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // every other type is never NaN\r\n ret = module.createI32(0);\r\n break;\r\n\r\n }\r\n compiler.currentType = Type.bool;\r\n return ret;\r\n\r\n case \"isFinite\": // isFinite(value: T) -> bool\r\n compiler.currentType = Type.bool;\r\n if (operands.length != 1) {\r\n if (typeArguments && typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createSelect(\r\n module.createBinary(BinaryOp.NeF32,\r\n module.createUnary(UnaryOp.AbsF32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n module.createF32(Infinity)\r\n ),\r\n module.createI32(0),\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createGetLocal(tempLocal0.index, NativeType.F32),\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createSelect(\r\n module.createBinary(BinaryOp.NeF64,\r\n module.createUnary(UnaryOp.AbsF64,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n module.createF64(Infinity)\r\n ),\r\n module.createI32(0),\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createGetLocal(tempLocal0.index, NativeType.F64),\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // every other type is always finite\r\n ret = module.createI32(1);\r\n break;\r\n }\r\n compiler.currentType = Type.bool;\r\n return ret;\r\n\r\n case \"clz\": // clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ClzI64\r\n : UnaryOp.ClzI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"ctz\": // ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.CtzI64\r\n : UnaryOp.CtzI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"popcnt\": // popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.PopcntI64\r\n : UnaryOp.PopcntI32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n break;\r\n\r\n case TypeKind.F32:\r\n case TypeKind.F64:\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"rotl\": // rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n ret = makeSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n compiler.currentType,\r\n module\r\n );\r\n // fall-through\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotlI64\r\n : BinaryOp.RotlI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"rotr\": // rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n ret = makeSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n compiler.currentType,\r\n module\r\n );\r\n break;\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotrI64\r\n : BinaryOp.RotrI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"abs\": // abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n // doesn't need sign-extension here because ifFalse below is either positive\r\n // or MIN_VALUE (-MIN_VALUE == MIN_VALUE) if selected\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(BinaryOp.SubI32, // ifFalse\r\n module.createI32(0),\r\n module.createGetLocal(tempLocal0.index, NativeType.I32)\r\n ),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createI32(0)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n compiler.options.usizeType.toNativeZero(module),\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)\r\n ),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n compiler.options.usizeType.toNativeZero(module)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createBinary(BinaryOp.SubI64,\r\n module.createI64(0, 0),\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n ),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createI64(0, 0)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.U64:\r\n case TypeKind.BOOL:\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n ret = module.createUnreachable();\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"max\": // max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"min\": // min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i32);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType);\r\n tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n\r\n default: // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"ceil\": // ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"floor\": // floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"copysign\": // copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType);\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n // TODO: does an integer version make sense?\r\n\r\n case TypeKind.F32:\r\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n\r\n default:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"nearest\": // nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"reinterpret\": // reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (typeArguments[0].kind) {\r\n\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n arg0 = compiler.compileExpression(operands[0], Type.f32);\r\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n arg0 = compiler.compileExpression(operands[0], Type.f64);\r\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n\r\n case TypeKind.USIZE:\r\n if (typeArguments[0].isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n case TypeKind.ISIZE:\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.f64\r\n : Type.f32\r\n );\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ReinterpretF64\r\n : UnaryOp.ReinterpretF32,\r\n arg0\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n arg0 = compiler.compileExpression(operands[0], Type.u32);\r\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n arg0 = compiler.compileExpression(operands[0], Type.u64);\r\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n\r\n default: // small integers and void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n\r\n case \"sqrt\": // sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n // TODO: integer versions (that return f64 or convert)?\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n break;\r\n\r\n default:\r\n // case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"trunc\": // trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE);\r\n }\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n case TypeKind.USIZE:\r\n if (compiler.currentType.isReference) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n default: // any integer\r\n ret = arg0;\r\n break;\r\n\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n\r\n case TypeKind.F32:\r\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n // memory access\r\n\r\n case \"load\": // load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n return module.createLoad(\r\n typeArguments[0].byteSize,\r\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size >= typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n\r\n case \"store\": // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // wraps a larger integer type to a smaller one, i.e. i32.store8\r\n : ConversionKind.IMPLICIT\r\n );\r\n if (\r\n compiler.currentType.is(TypeFlags.INTEGER) &&\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n typeArguments[0].size > compiler.currentType.size\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n\r\n case \"sizeof\": // sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n ret = compiler.options.isWasm64\r\n ? module.createI64(typeArguments[0].byteSize, 0)\r\n : module.createI32(typeArguments[0].byteSize);\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n return ret;\r\n\r\n // control flow\r\n\r\n case \"select\": // select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], type = compiler.currentType);\r\n arg2 = compiler.compileExpression(operands[2], Type.bool);\r\n compiler.currentType = type;\r\n\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n return ret;\r\n\r\n case \"unreachable\": // unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n\r\n // host operations\r\n\r\n case \"current_memory\": // current_memory() -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.CurrentMemory);\r\n\r\n case \"grow_memory\": // grow_memory(pages: i32) -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n arg0 = module.createUnreachable();\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"move_memory\": // move_memory(dest: usize, src: usize: n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], compiler.options.usizeType);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n\r\n case \"set_memory\": // set_memory(dest: usize, value: u32, n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], compiler.options.usizeType);\r\n arg1 = compiler.compileExpression(operands[1], Type.u32);\r\n arg2 = compiler.compileExpression(operands[2], compiler.options.usizeType);\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n\r\n // other\r\n\r\n case \"changetype\": // changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n } else if (typeArguments[0].kind != TypeKind.USIZE) { // any usize\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.NONE\r\n );\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.kind != TypeKind.USIZE) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n\r\n case \"assert\": // assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else if (operands.length > 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0]);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE);\r\n }\r\n\r\n type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == Type.void) {\r\n compiler.currentType = Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n\r\n var abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n compiler.currentType = type.nonNullableType;\r\n\r\n if (contextualType == Type.void) { // simplify if dropped anyway\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n\r\n case TypeKind.F32:\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n arg0,\r\n module.createF32(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n arg0,\r\n module.createF64(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n compiler.currentType = Type.void;\r\n } else {\r\n switch (compiler.currentType.kind) {\r\n\r\n default: // any integer up to 32-bits incl. bool\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i32);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32)\r\n );\r\n break;\r\n\r\n case TypeKind.I64:\r\n case TypeKind.U64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.i64);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64)\r\n );\r\n break;\r\n\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType);\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal0.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType)\r\n );\r\n break;\r\n\r\n case TypeKind.F32:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f32);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createF32(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.F32)\r\n );\r\n break;\r\n\r\n case TypeKind.F64:\r\n tempLocal0 = compiler.currentFunction.getAndFreeTempLocal(Type.f64);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createF64(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal0.index, NativeType.F64)\r\n );\r\n break;\r\n\r\n case TypeKind.VOID:\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n return ret;\r\n\r\n // conversions\r\n\r\n case \"i8\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i8, ConversionKind.EXPLICIT);\r\n\r\n case \"i16\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i16, ConversionKind.EXPLICIT);\r\n\r\n case \"i32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i32, ConversionKind.EXPLICIT);\r\n\r\n case \"i64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.i64, ConversionKind.EXPLICIT);\r\n\r\n case \"isize\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32,\r\n ConversionKind.EXPLICIT\r\n );\r\n\r\n case \"u8\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u8, ConversionKind.EXPLICIT);\r\n\r\n case \"u16\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u16, ConversionKind.EXPLICIT);\r\n\r\n case \"u32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u32, ConversionKind.EXPLICIT);\r\n\r\n case \"u64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.u64, ConversionKind.EXPLICIT);\r\n\r\n case \"usize\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.EXPLICIT\r\n );\r\n\r\n case \"bool\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.bool, ConversionKind.EXPLICIT);\r\n\r\n case \"f32\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.f32, ConversionKind.EXPLICIT);\r\n\r\n case \"f64\":\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(operands[0], Type.f64, ConversionKind.EXPLICIT);\r\n }\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n}\r\n\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n var expr: ExpressionRef;\r\n var value: i32;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, Type.i64);\r\n if (\r\n _BinaryenExpressionGetId(expr) != ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != NativeType.I64 ||\r\n _BinaryenConstGetValueI64High(expr) != 0 ||\r\n (value = _BinaryenConstGetValueI64Low(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n } else {\r\n expr = compiler.precomputeExpression(expression, Type.i32);\r\n if (\r\n _BinaryenExpressionGetId(expr) != ExpressionId.Const ||\r\n _BinaryenExpressionGetType(expr) != NativeType.I32 ||\r\n (value = _BinaryenConstGetValueI32(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nexport function compileAllocate(\r\n compiler: Compiler,\r\n cls: Class,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = cls.program;\r\n var prototype = program.elements.get(compiler.options.allocateImpl);\r\n if (prototype) {\r\n if (prototype.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n var instance = (prototype).resolve(); // reports\r\n if (instance) {\r\n if (\r\n !instance.is(ElementFlags.GENERIC) &&\r\n instance.returnType == compiler.options.usizeType &&\r\n instance.parameters &&\r\n instance.parameters.length == 1 &&\r\n instance.parameters[0].type == compiler.options.usizeType\r\n ) {\r\n if (compiler.compileFunction(instance)) { // reports\r\n return compiler.makeCall(instance, [\r\n compiler.options.isWasm64\r\n ? compiler.module.createI64(cls.currentMemoryOffset)\r\n : compiler.module.createI32(cls.currentMemoryOffset)\r\n ]);\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Implementation_0_must_match_the_signature_1,\r\n reportNode.range, compiler.options.allocateImpl, \"(size: usize): usize\"\r\n );\r\n }\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n reportNode.range, compiler.options.allocateImpl\r\n );\r\n }\r\n return compiler.module.createUnreachable();\r\n}\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n compiler: Compiler,\r\n message: Expression | null,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n var abort: ExpressionRef = module.createUnreachable();\r\n var abortPrototype = compiler.program.elements.get(\"abort\");\r\n var stringType = compiler.program.types.get(\"string\");\r\n if (\r\n abortPrototype &&\r\n abortPrototype.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n stringType\r\n ) {\r\n var abortInstance = (abortPrototype).resolve(); // reports\r\n if (\r\n abortInstance &&\r\n compiler.compileFunction(abortInstance) // reports\r\n ) {\r\n assert(abortInstance.parameters && abortInstance.parameters.length == 4); // to be sure\r\n abort = module.createBlock(null, [\r\n compiler.makeCall(abortInstance, [\r\n message != null\r\n ? compiler.compileExpression(message, stringType)\r\n : compiler.options.usizeType.toNativeZero(module),\r\n compiler.compileStaticString(reportNode.range.source.normalizedPath),\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ]),\r\n abort\r\n ]);\r\n }\r\n }\r\n return abort;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/builtins.ts","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/glue/js/i64.js\n// module id = 17\n// module chunks = 0","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/long/src/long.js\n// module id = 18\n// module chunks = 0","//////////////////////// Low-level C-Like Compiler API /////////////////////////\r\n\r\nimport {\r\n Compiler,\r\n Options,\r\n Target\r\n} from \"./compiler\";\r\n\r\nimport {\r\n Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n DiagnosticMessage,\r\n DiagnosticCategory,\r\n formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module\r\n} from \"./module\";\r\n\r\nimport {\r\n Parser\r\n} from \"./parser\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n parser: Parser | null = null\r\n): Parser {\r\n if (!parser) {\r\n parser = new Parser();\r\n isEntry = true;\r\n }\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `noMemory` option. */\r\nexport function setNoMemory(options: Options, noMemory: bool): void {\r\n options.noMemory = noMemory;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compile(parser: Parser, options: Options | null = null): Module {\r\n var program = parser.finish();\r\n var compiler = new Compiler(program, options);\r\n return compiler.compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./program\";\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.ts","import {\r\n Module,\r\n NativeType,\r\n ExpressionId,\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n FunctionRef,\r\n ExpressionRef,\r\n Index,\r\n readString\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n static decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n }\r\n\r\n text: string[] = [];\r\n functionId: i32 = 0;\r\n\r\n constructor() { }\r\n\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n decompile(module: Module) {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n decompileFunction(func: FunctionRef): void {\r\n var name = readString(_BinaryenFunctionGetName(func)) || \"$\" + this.functionId.toString(10);\r\n var body = _BinaryenFunctionGetBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (var i: Index = 0, k: Index = _BinaryenFunctionGetNumParams(func); i < k; ++i) {\r\n if (i > 0) this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetParam(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(_BinaryenFunctionGetResult(func)));\r\n this.push(\" \");\r\n if (_BinaryenExpressionGetId(body) != ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (_BinaryenExpressionGetId(body) != ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n }\r\n\r\n decompileExpression(expr: ExpressionRef): void {\r\n var id = _BinaryenExpressionGetId(expr);\r\n var type = _BinaryenExpressionGetType(expr);\r\n\r\n var nested: ExpressionRef;\r\n var string: string | null;\r\n var i: Index, k: Index;\r\n\r\n switch (id) {\r\n\r\n case ExpressionId.Block: // TODO: magic\r\n if ((string = readString(_BinaryenBlockGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = _BinaryenBlockGetNumChildren(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(_BinaryenBlockGetChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n\r\n case ExpressionId.If:\r\n if (type == NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n if (nested = _BinaryenIfGetIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n } else {\r\n this.decompileExpression(_BinaryenIfGetCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(_BinaryenIfGetIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(_BinaryenIfGetIfFalse(expr));\r\n }\r\n return;\r\n\r\n case ExpressionId.Loop:\r\n if ((string = readString(_BinaryenLoopGetName(expr))) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(_BinaryenLoopGetBody(expr));\r\n this.push(\"while (0);\\n\");\r\n\r\n case ExpressionId.Break:\r\n if (nested = _BinaryenBreakGetCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = readString(_BinaryenBreakGetName(expr))) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n\r\n case ExpressionId.Switch:\r\n\r\n case ExpressionId.Call:\r\n\r\n case ExpressionId.CallImport:\r\n\r\n case ExpressionId.CallIndirect:\r\n\r\n case ExpressionId.GetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenGetLocalGetIndex(expr).toString(10));\r\n return;\r\n\r\n case ExpressionId.SetLocal:\r\n this.push(\"$\");\r\n this.push(_BinaryenSetLocalGetIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(_BinaryenSetLocalGetValue(expr));\r\n return;\r\n\r\n case ExpressionId.GetGlobal:\r\n\r\n case ExpressionId.SetGlobal:\r\n\r\n case ExpressionId.Load:\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenLoadGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenLoadGetPtr(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Store:\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(_BinaryenStoreGetOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenStoreGetPtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenStoreGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Const:\r\n switch (type) {\r\n\r\n case NativeType.I32:\r\n this.push(_BinaryenConstGetValueI32(expr).toString(10));\r\n return;\r\n\r\n case NativeType.I64:\r\n this.push(\r\n i64_to_string(\r\n i64_new(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n )\r\n )\r\n );\r\n return;\r\n\r\n case NativeType.F32:\r\n this.push(_BinaryenConstGetValueF32(expr).toString(10));\r\n return;\r\n\r\n case NativeType.F64:\r\n this.push(_BinaryenConstGetValueF64(expr).toString(10));\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Unary:\r\n switch (_BinaryenUnaryGetOp(expr)) {\r\n\r\n case UnaryOp.ClzI32:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CtzI32:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.PopcntI32:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NegF32:\r\n case UnaryOp.NegF64:\r\n this.push(\"-\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.AbsF32:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CeilF32:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.FloorF32:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.TruncF32:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NearestF32:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.SqrtF32:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64:\r\n this.push(\"!\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ClzI64:\r\n this.push(\"clz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CtzI64:\r\n this.push(\"ctz(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.PopcntI64:\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.AbsF64:\r\n this.push(\"abs(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.CeilF64:\r\n this.push(\"ceil(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.FloorF64:\r\n this.push(\"floor(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.TruncF64:\r\n this.push(\"trunc(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.NearestF64:\r\n this.push(\"nearest(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.SqrtF64:\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ExtendI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ExtendU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.WrapI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF32ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToI32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToI64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.TruncF64ToU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ReinterpretF32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ReinterpretF64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ConvertI32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU32ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU32ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertI64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU64ToF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ConvertU64ToF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.PromoteF32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.DemoteF64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n return;\r\n\r\n case UnaryOp.ReinterpretI32:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case UnaryOp.ReinterpretI64:\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(_BinaryenUnaryGetValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Binary: // TODO: precedence\r\n switch (_BinaryenBinaryGetOp(expr)) {\r\n\r\n case BinaryOp.AddI32:\r\n case BinaryOp.AddI64:\r\n case BinaryOp.AddF32:\r\n case BinaryOp.AddF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.SubI32:\r\n case BinaryOp.SubI64:\r\n case BinaryOp.SubF32:\r\n case BinaryOp.SubF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.MulI32:\r\n case BinaryOp.MulI64:\r\n case BinaryOp.MulF32:\r\n case BinaryOp.MulF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivI32:\r\n case BinaryOp.DivI64:\r\n case BinaryOp.DivF32:\r\n case BinaryOp.DivF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RemU32:\r\n this.push(\"(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.AndI32:\r\n case BinaryOp.AndI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.OrI32:\r\n case BinaryOp.OrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.XorI32:\r\n case BinaryOp.XorI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShlI32:\r\n case BinaryOp.ShlI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShrU32:\r\n case BinaryOp.ShrU64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.ShrI32:\r\n case BinaryOp.ShrI64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RotlI32:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RotrI32:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64:\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeU32:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.DivU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RemU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.RotlI64:\r\n this.push(\"rotl(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.RotrI64:\r\n this.push(\"rotr(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.LtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.LeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GtU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.GeU64:\r\n this.push(\"\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n return;\r\n\r\n case BinaryOp.CopysignF32:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MinF32:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MaxF32:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.CopysignF64:\r\n this.push(\"copysign(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MinF64:\r\n this.push(\"min(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case BinaryOp.MaxF64:\r\n this.push(\"max(\");\r\n this.decompileExpression(_BinaryenBinaryGetLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenBinaryGetRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n return;\r\n\r\n case ExpressionId.Select:\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(_BinaryenSelectGetIfTrue(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetIfFalse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(_BinaryenSelectGetCondition(expr));\r\n this.push(\")\");\r\n return;\r\n\r\n case ExpressionId.Drop:\r\n this.decompileExpression(_BinaryenDropGetValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n\r\n case ExpressionId.Return:\r\n if (nested = _BinaryenReturnGetValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n\r\n case ExpressionId.Host:\r\n switch (_BinaryenHostGetOp(expr)) {\r\n case HostOp.CurrentMemory:\r\n this.push(\"current_memory()\");\r\n return;\r\n case HostOp.GrowMemory:\r\n this.push(\"grow_memory(\");\r\n this.decompileExpression(_BinaryenHostGetOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n break;\r\n\r\n case ExpressionId.Nop:\r\n this.push(\";\\n\");\r\n return;\r\n\r\n case ExpressionId.Unreachable:\r\n this.push(\"unreachable()\");\r\n return;\r\n\r\n case ExpressionId.AtomicCmpxchg:\r\n\r\n case ExpressionId.AtomicRMW:\r\n\r\n case ExpressionId.AtomicWait:\r\n\r\n case ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n private push(text: string): void {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n }\r\n\r\n finish(): string {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n switch (type) {\r\n case NativeType.None: return \"void\";\r\n case NativeType.I32: return \"i32\";\r\n case NativeType.I64: return \"i64\";\r\n case NativeType.F32: return \"f32\";\r\n case NativeType.F64: return \"f64\";\r\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/decompiler.ts","/*\r\n\r\n This is a custom parser specifically written for the AssemblyScript subset. It accepts some of the\r\n most common TypeScript-only patterns that it knows an appropriate error message for but, though it\r\n uses TypeScript's codes for diagnostics, doesn't ultimately aim at full compatibility.\r\n\r\n*/\r\n\r\nimport {\r\n Program,\r\n LIBRARY_PREFIX,\r\n PATH_DELIMITER\r\n} from \"./program\";\r\n\r\nimport {\r\n Tokenizer,\r\n Token,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n normalize as normalizePath\r\n} from \"./util/path\";\r\n\r\nimport {\r\n\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n TypeNode,\r\n\r\n Expression,\r\n AssertionKind,\r\n CallExpression,\r\n IdentifierExpression,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n Decorator,\r\n DoStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportImportStatement,\r\n ExportMember,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n FunctionDeclaration,\r\n IfStatement,\r\n ImportDeclaration,\r\n ImportStatement,\r\n Modifier,\r\n ModifierKind,\r\n NamespaceDeclaration,\r\n Parameter,\r\n ParameterKind,\r\n ReturnStatement,\r\n SwitchCase,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n TypeDeclaration,\r\n TypeParameter,\r\n VariableStatement,\r\n VariableDeclaration,\r\n WhileStatement,\r\n\r\n addModifier,\r\n getModifier,\r\n hasModifier,\r\n setReusableModifiers\r\n\r\n} from \"./ast\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n /** Program being created. */\r\n program: Program;\r\n /** Log of source file names to be requested. */\r\n backlog: string[] = new Array();\r\n /** Log of source file names already processed. */\r\n seenlog: Set = new Set();\r\n\r\n /** Constructs a new parser. */\r\n constructor() {\r\n super();\r\n this.program = new Program(this.diagnostics);\r\n }\r\n\r\n /** Parses a file and adds its definitions to the program. */\r\n parseFile(\r\n text: string,\r\n path: string,\r\n isEntry: bool\r\n ): void {\r\n\r\n // check if already parsed\r\n var normalizedPath = normalizePath(path);\r\n for (var i = 0, k = this.program.sources.length; i < k; ++i) {\r\n if (this.program.sources[i].normalizedPath == normalizedPath) return;\r\n }\r\n this.seenlog.add(normalizedPath);\r\n\r\n // create the source element\r\n var source = new Source(\r\n normalizedPath,\r\n text,\r\n isEntry\r\n ? SourceKind.ENTRY\r\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n ? SourceKind.LIBRARY\r\n : SourceKind.DEFAULT\r\n );\r\n this.program.sources.push(source);\r\n\r\n // tokenize and parse\r\n var tn = new Tokenizer(source, this.program.diagnostics);\r\n source.tokenizer = tn;\r\n while (!tn.skip(Token.ENDOFFILE)) {\r\n var statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n source.statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n }\r\n\r\n /** Parses a top-level statement. */\r\n parseTopLevelStatement(\r\n tn: Tokenizer,\r\n isNamespaceMember: bool = false\r\n ): Statement | null {\r\n\r\n // check decorators\r\n var decorators: Decorator[] | null = null;\r\n while (tn.skip(Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n if (!decorators) decorators = [];\r\n decorators.push(decorator);\r\n }\r\n\r\n // check modifiers\r\n var modifiers: Modifier[] | null = null;\r\n if (tn.skip(Token.EXPORT)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.EXPORT, tn.range()), modifiers);\r\n }\r\n if (tn.skip(Token.DECLARE)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.DECLARE, tn.range()), modifiers);\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) {\r\n this.error(\r\n DiagnosticCode.Line_break_not_permitted_here,\r\n tn.range(tn.pos)\r\n ); // recoverable, compatibility\r\n }\r\n }\r\n\r\n // remember where we took off\r\n tn.mark();\r\n\r\n // parse the statement\r\n var statement: Statement | null = null;\r\n var modifier: Modifier | null;\r\n\r\n // handle declarations\r\n switch (tn.next()) {\r\n\r\n case Token.CONST:\r\n modifiers = addModifier(Node.createModifier(ModifierKind.CONST, tn.range()), modifiers);\r\n if (tn.skip(Token.ENUM)) {\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n break;\r\n }\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.LET:\r\n modifiers = addModifier(Node.createModifier(ModifierKind.LET, tn.range()), modifiers);\r\n // fall-through\r\n\r\n case Token.VAR:\r\n statement = this.parseVariable(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.ENUM:\r\n statement = this.parseEnum(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.FUNCTION:\r\n statement = this.parseFunction(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.ABSTRACT:\r\n if (!tn.skip(Token.CLASS)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"class\"\r\n );\r\n break;\r\n }\r\n modifiers = addModifier(\r\n Node.createModifier(ModifierKind.ABSTRACT, tn.range()), modifiers\r\n );\r\n // fall through\r\n\r\n case Token.CLASS:\r\n statement = this.parseClass(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.NAMESPACE:\r\n statement = this.parseNamespace(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n case Token.IMPORT:\r\n if (modifier = getModifier(ModifierKind.EXPORT, modifiers)) {\r\n statement = this.parseExportImport(tn, modifier.range);\r\n } else {\r\n statement = this.parseImport(tn);\r\n }\r\n if (modifiers) setReusableModifiers(modifiers);\r\n break;\r\n\r\n case Token.TYPE:\r\n statement = this.parseTypeDeclaration(tn, modifiers, decorators);\r\n decorators = null;\r\n break;\r\n\r\n default:\r\n\r\n // handle plain exports\r\n if (hasModifier(ModifierKind.EXPORT, modifiers)) {\r\n tn.reset();\r\n statement = this.parseExport(tn, modifiers); // TODO: why exactly does this have modifiers again? 'declare'?\r\n\r\n // handle non-declaration statements\r\n } else {\r\n if (modifiers) {\r\n if (modifier = getModifier(ModifierKind.DECLARE, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"declare\"\r\n ); // recoverable\r\n }\r\n setReusableModifiers(modifiers);\r\n }\r\n tn.reset();\r\n if (!isNamespaceMember) {\r\n statement = this.parseStatement(tn, true);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (var i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n decorators[i].range\r\n );\r\n }\r\n }\r\n return statement;\r\n }\r\n\r\n /** Obtains the next file to parse. */\r\n nextFile(): string | null {\r\n return this.backlog.length ? this.backlog.shift() : null;\r\n }\r\n\r\n /** Finishes parsing and returns the program. */\r\n finish(): Program {\r\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n return this.program;\r\n }\r\n\r\n /** Parses a type. */\r\n parseType(\r\n tn: Tokenizer,\r\n acceptParenthesized: bool = true,\r\n suppressErrors: bool = false\r\n ): TypeNode | null {\r\n\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n\r\n // void\r\n if (token == Token.VOID) {\r\n return Node.createType(\r\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n }\r\n\r\n var type: TypeNode;\r\n\r\n // ( ... )\r\n if (acceptParenthesized && token == Token.OPENPAREN) {\r\n var innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"}\"\r\n );\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n\r\n // this\r\n } else if (token == Token.THIS) {\r\n type = Node.createType(\r\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // true\r\n } else if (token == Token.TRUE || token == Token.FALSE) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // string literal\r\n } else if (token == Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // Name\r\n } else if (token == Token.IDENTIFIER) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var parameters = new Array();\r\n var nullable = false;\r\n\r\n // Name\r\n if (tn.skip(Token.LESSTHAN)) {\r\n do {\r\n var parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter) return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \">\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(Token.OPENBRACKET)) {\r\n var bracketStart = tn.tokenPos;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n return null;\r\n }\r\n var bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n // ...[] | null\r\n nullable = false;\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"Array\", bracketRange),\r\n [ type ],\r\n nullable,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (nullable) break;\r\n }\r\n\r\n return type;\r\n }\r\n\r\n // statements\r\n\r\n parseDecorator(\r\n tn: Tokenizer\r\n ): Decorator | null {\r\n\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var name = tn.readIdentifier();\r\n var expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n name = tn.readIdentifier();\r\n expression = Node.createPropertyAccessExpression(\r\n expression,\r\n Node.createIdentifierExpression(name, tn.range()),\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n var args: Expression[] | null;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVariable(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): VariableStatement | null {\r\n\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n var members = new Array();\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseVariableDeclaration(tn, isDeclare, modifiers, decorators);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n\r\n var ret = Node.createVariableStatement(members, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseVariableDeclaration(\r\n tn: Tokenizer,\r\n isDeclare: bool = false,\r\n parentModifiers: Modifier[] | null,\r\n parentDecorators: Decorator[] | null\r\n ): VariableDeclaration | null {\r\n\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var type: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isDeclare) {\r\n this.error(\r\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n } else {\r\n if (hasModifier(ModifierKind.CONST, parentModifiers)) {\r\n if (!hasModifier(ModifierKind.DECLARE, parentModifiers)) {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n identifier.range\r\n );\r\n }\r\n } else if (!type) { // neither type nor initializer\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n }\r\n return Node.createVariableDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n parentModifiers,\r\n parentDecorators,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseEnum(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): EnumDeclaration | null {\r\n\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.next() != Token.IDENTIFIER) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != Token.OPENBRACE) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseEnumValue(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n var ret = Node.createEnumDeclaration(\r\n identifier,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseEnumValue(\r\n tn: Tokenizer\r\n ): EnumValueDeclaration | null {\r\n\r\n // before: Identifier ('=' Expression)?\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n }\r\n return Node.createEnumValueDeclaration(\r\n identifier,\r\n value,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseReturn(\r\n tn: Tokenizer\r\n ): ReturnStatement | null {\r\n\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n var expr: Expression | null = null;\r\n if (\r\n tn.peek(true) != Token.SEMICOLON &&\r\n tn.nextToken != Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine\r\n ) {\r\n if (!(expr = this.parseExpression(tn))) return null;\r\n }\r\n\r\n var ret = Node.createReturnStatement(expr, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTypeParameters(\r\n tn: Tokenizer\r\n ): TypeParameter[] | null {\r\n\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n var typeParameters = new Array();\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n do {\r\n var typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter) return null;\r\n typeParameters.push(typeParameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return typeParameters;\r\n }\r\n\r\n parseTypeParameter(\r\n tn: Tokenizer\r\n ): TypeParameter | null {\r\n\r\n // before: Identifier ('extends' Type)?\r\n\r\n if (tn.next() == Token.IDENTIFIER) {\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n if (!(extendsType = this.parseType(tn))) return null;\r\n }\r\n return Node.createTypeParameter(\r\n identifier,\r\n extendsType,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseParameters(\r\n tn: Tokenizer\r\n ): Parameter[] | null {\r\n\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n var parameters = new Array();\r\n var seenRest: Parameter | null = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n\r\n if (tn.peek() != Token.CLOSEPAREN) {\r\n do {\r\n var param = this.parseParameter(tn);\r\n if (!param) return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n seenRest.name.range\r\n );\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n\r\n default:\r\n if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n param.name.range\r\n );\r\n }\r\n break;\r\n\r\n case ParameterKind.OPTIONAL:\r\n seenOptional = true;\r\n break;\r\n\r\n case ParameterKind.REST:\r\n seenRest = param;\r\n break;\r\n }\r\n parameters.push(param);\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return parameters;\r\n }\r\n\r\n parseParameter(\r\n tn: Tokenizer\r\n ): Parameter | null {\r\n\r\n // before: '...'? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange: Range | null = null;\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n isRest = true;\r\n startRange = tn.range();\r\n }\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n if (!isRest) startRange = tn.range();\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var type: TypeNode | null = null;\r\n if (isOptional = tn.skip(Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n identifier.range\r\n );\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n }\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n if (isOptional) {\r\n this.error(\r\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n identifier.range\r\n );\r\n } else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n }\r\n return Node.createParameter(\r\n identifier,\r\n type,\r\n initializer,\r\n isRest\r\n ? ParameterKind.REST\r\n : isOptional\r\n ? ParameterKind.OPTIONAL\r\n : ParameterKind.DEFAULT,\r\n Range.join(startRange, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseFunction(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): FunctionDeclaration | null {\r\n\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var typeParameters: TypeParameter[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n var isSetter = hasModifier(ModifierKind.SET, modifiers);\r\n if (isSetter) {\r\n\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var isGetter = hasModifier(ModifierKind.GET, modifiers);\r\n if (isGetter && parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n\r\n var returnType: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn, isSetter);\r\n if (!returnType) return null;\r\n\r\n } else if (!isSetter) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n\r\n var statements: Statement[] | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n statements = new Array();\r\n\r\n if (isDeclare) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n\r\n } else if (!isDeclare) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range(tn.pos)\r\n );\r\n }\r\n\r\n var ret = Node.createFunctionDeclaration(\r\n identifier,\r\n typeParameters,\r\n parameters,\r\n returnType,\r\n statements,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseClass(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): ClassDeclaration | null {\r\n\r\n // at 'class':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n\r\n var startPos = decorators && decorators.length\r\n ? decorators[0].range.start\r\n : modifiers && modifiers.length\r\n ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n\r\n var typeParameters: TypeParameter[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n extendsType = this.parseType(tn);\r\n if (!extendsType) return null;\r\n }\r\n\r\n var implementsTypes = new Array();\r\n if (tn.skip(Token.IMPLEMENTS)) {\r\n do {\r\n var type = this.parseType(tn);\r\n if (!type) return null;\r\n implementsTypes.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n\r\n if (tn.skip(Token.OPENBRACE)) {\r\n\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n var isDeclare = hasModifier(ModifierKind.DECLARE, modifiers);\r\n do {\r\n var member = this.parseClassMember(tn, isDeclare);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return Node.createClassDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n implementsTypes,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseClassMember(\r\n tn: Tokenizer,\r\n parentIsDeclare: bool\r\n ): DeclarationStatement | null {\r\n\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n\r\n var startPos = tn.pos;\r\n\r\n var decorators = new Array();\r\n while (tn.skip(Token.AT)) {\r\n var decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n decorators.push(decorator);\r\n }\r\n\r\n var modifiers: Modifier[] | null = null;\r\n\r\n if (tn.skip(Token.PUBLIC)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PUBLIC, tn.range()), modifiers);\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PRIVATE, tn.range()), modifiers);\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.PROTECTED, tn.range()), modifiers);\r\n }\r\n\r\n if (tn.skip(Token.STATIC)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.STATIC, tn.range()), modifiers);\r\n } else if (tn.skip(Token.ABSTRACT)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.ABSTRACT, tn.range()), modifiers);\r\n }\r\n\r\n if (tn.skip(Token.READONLY)) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.READONLY, tn.range()), modifiers);\r\n }\r\n\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n tn.mark();\r\n\r\n var isGetter = false;\r\n var isSetter = false;\r\n\r\n if (isGetter = tn.skip(Token.GET)) {\r\n if (tn.peek(true, true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.GET, tn.range()), modifiers);\r\n } else {\r\n tn.reset();\r\n isGetter = false;\r\n }\r\n\r\n } else if (isSetter = tn.skip(Token.SET)) { // can't be both\r\n if (tn.peek(true, true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n modifiers = addModifier(Node.createModifier(ModifierKind.SET, tn.range()), modifiers);\r\n } else {\r\n tn.reset();\r\n isSetter = false;\r\n }\r\n }\r\n\r\n var isConstructor = tn.skip(Token.CONSTRUCTOR);\r\n if (isConstructor || tn.skip(Token.IDENTIFIER)) {\r\n\r\n var identifier = isConstructor\r\n ? Node.createConstructorExpression(tn.range())\r\n : Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n\r\n var typeParameters: TypeParameter[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n if (isGetter && parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n identifier.range\r\n );\r\n }\r\n\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n identifier.range\r\n );\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n }\r\n\r\n var returnType: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n if (identifier.kind == NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n );\r\n } else if (isSetter) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n tn.range()\r\n );\r\n }\r\n returnType = this.parseType(tn, identifier.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType) return null;\r\n } else if (!isSetter && identifier.kind != NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n var statements: Statement[] | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (parentIsDeclare) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n } else if (!parentIsDeclare) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n var retMethod = Node.createMethodDeclaration(\r\n identifier,\r\n typeParameters,\r\n parameters,\r\n returnType,\r\n statements,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retMethod;\r\n\r\n } else if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Constructor_implementation_is_missing,\r\n identifier.range\r\n );\r\n\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n identifier.range\r\n );\r\n\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n } else {\r\n var modifier: Modifier | null;\r\n\r\n if (modifier = getModifier(ModifierKind.ABSTRACT, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"abstract\"\r\n ); // recoverable\r\n }\r\n\r\n if (modifier = getModifier(ModifierKind.GET, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"get\"\r\n ); // recoverable\r\n }\r\n\r\n if (modifier = getModifier(ModifierKind.SET, modifiers)) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n modifier.range, \"set\"\r\n ); // recoverable\r\n }\r\n\r\n var type: TypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer) return null;\r\n }\r\n var retField = Node.createFieldDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retField;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseNamespace(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null,\r\n decorators: Decorator[] | null\r\n ): NamespaceDeclaration | null {\r\n\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var member = this.parseTopLevelStatement(tn, true);\r\n if (!member) return null;\r\n members.push(member);\r\n }\r\n var ret = Node.createNamespaceDeclaration(\r\n identifier,\r\n members,\r\n modifiers,\r\n decorators,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExport(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null\r\n ): ExportStatement | null {\r\n\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n var startPos = modifiers && modifiers.length ? modifiers[0].range.start : tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseExportMember(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n var path: StringLiteralExpression | null = null;\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n var ret = Node.createExportStatement(members, path, modifiers, tn.range(startPos, tn.pos));\r\n if (ret.normalizedPath && !this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportMember(\r\n tn: Tokenizer\r\n ): ExportMember | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createExportMember(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImport(\r\n tn: Tokenizer\r\n ): ImportStatement | null {\r\n\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var members: ImportDeclaration[] | null = null;\r\n var namespaceName: IdentifierExpression | null = null;\r\n var skipFrom = false;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n members = new Array();\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n var member = this.parseImportDeclaration(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"as\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n skipFrom = true;\r\n }\r\n\r\n if (skipFrom || tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n var path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n var ret: ImportStatement;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n } else {\r\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n if (!this.seenlog.has(ret.normalizedPath)) {\r\n this.backlog.push(ret.normalizedPath);\r\n this.seenlog.add(ret.normalizedPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImportDeclaration(\r\n tn: Tokenizer\r\n ): ImportDeclaration | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createImportDeclaration(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportImport(\r\n tn: Tokenizer,\r\n startRange: Range\r\n ): ExportImportStatement | null {\r\n\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var ret = Node.createExportImportStatement(identifier, asIdentifier, Range.join(startRange, tn.range()));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseStatement(\r\n tn: Tokenizer,\r\n topLevel: bool = false\r\n ): Statement | null {\r\n\r\n // at previous token\r\n\r\n tn.mark();\r\n var token = tn.next();\r\n switch (token) {\r\n\r\n case Token.BREAK:\r\n return this.parseBreak(tn);\r\n\r\n case Token.CONST:\r\n return this.parseVariable(tn, [\r\n Node.createModifier(ModifierKind.CONST, tn.range())\r\n ], null);\r\n\r\n case Token.CONTINUE:\r\n return this.parseContinue(tn);\r\n\r\n case Token.DO:\r\n return this.parseDoStatement(tn);\r\n\r\n case Token.FOR:\r\n return this.parseForStatement(tn);\r\n\r\n case Token.IF:\r\n return this.parseIfStatement(tn);\r\n\r\n case Token.LET:\r\n return this.parseVariable(tn, [\r\n Node.createModifier(ModifierKind.LET, tn.range())\r\n ], null);\r\n\r\n case Token.VAR:\r\n return this.parseVariable(tn, null, null);\r\n\r\n case Token.OPENBRACE:\r\n return this.parseBlockStatement(tn, topLevel);\r\n\r\n case Token.RETURN:\r\n if (topLevel) {\r\n this.error(\r\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return this.parseReturn(tn);\r\n\r\n case Token.SEMICOLON:\r\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n\r\n case Token.SWITCH:\r\n return this.parseSwitchStatement(tn);\r\n\r\n case Token.THROW:\r\n return this.parseThrowStatement(tn);\r\n\r\n case Token.TRY:\r\n return this.parseTryStatement(tn);\r\n\r\n case Token.TYPE:\r\n return this.parseTypeDeclaration(tn, null);\r\n\r\n case Token.WHILE:\r\n return this.parseWhileStatement(tn);\r\n\r\n default:\r\n tn.reset();\r\n return this.parseExpressionStatement(tn);\r\n }\r\n }\r\n\r\n parseBlockStatement(\r\n tn: Tokenizer,\r\n topLevel: bool\r\n ): BlockStatement | null {\r\n\r\n // at '{': Statement* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var statement = this.parseStatement(tn, topLevel);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseBreak(\r\n tn: Tokenizer\r\n ): BreakStatement | null {\r\n\r\n // at 'break': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseContinue(\r\n tn: Tokenizer\r\n ): ContinueStatement | null {\r\n\r\n // at 'continue': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(true);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseDoStatement(\r\n tn: Tokenizer\r\n ): DoStatement | null {\r\n\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n if (tn.skip(Token.WHILE)) {\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"while\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExpressionStatement(\r\n tn: Tokenizer\r\n ): ExpressionStatement | null {\r\n\r\n // at previous token\r\n\r\n var expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n\r\n var ret = Node.createExpressionStatement(expr);\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseForStatement(\r\n tn: Tokenizer\r\n ): ForStatement | null {\r\n\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n var startPos = tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n\r\n var initializer: Statement | null = null;\r\n\r\n if (tn.skip(Token.LET) || tn.skip(Token.CONST) || tn.skip(Token.VAR)) {\r\n initializer = this.parseVariable(tn, null, null);\r\n\r\n } else if (!tn.skip(Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n var condition: ExpressionStatement | null = null;\r\n if (!tn.skip(Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n var incrementor: Expression | null = null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor) return null;\r\n\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n return Node.createForStatement(\r\n initializer,\r\n condition\r\n ? condition.expression\r\n : null,\r\n incrementor,\r\n statement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseIfStatement(\r\n tn: Tokenizer\r\n ): IfStatement | null {\r\n\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n var elseStatement: Statement | null = null;\r\n if (tn.skip(Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement) return null;\r\n }\r\n return Node.createIfStatement(\r\n condition,\r\n statement,\r\n elseStatement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchStatement(\r\n tn: Tokenizer\r\n ): SwitchStatement | null {\r\n\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var cases = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n var case_ = this.parseSwitchCase(tn);\r\n if (!case_) return null;\r\n cases.push(case_);\r\n }\r\n var ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchCase(\r\n tn: Tokenizer\r\n ): SwitchCase | null {\r\n\r\n var startPos = tn.tokenPos;\r\n var statements: Statement[],\r\n statement: Statement | null;\r\n\r\n // 'case' Expression ':' Statement*\r\n\r\n if (tn.skip(Token.CASE)) {\r\n var label = this.parseExpression(tn);\r\n if (!label) return null;\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n\r\n // 'default' ':' Statement*\r\n\r\n } else if (tn.skip(Token.DEFAULT)) {\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._case_or_default_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseThrowStatement(\r\n tn: Tokenizer\r\n ): ThrowStatement | null {\r\n\r\n // at 'throw': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTryStatement(\r\n tn: Tokenizer\r\n ): TryStatement | null {\r\n\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var stmt: Statement | null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n statements.push(stmt);\r\n }\r\n var catchVariable: IdentifierExpression | null = null;\r\n var catchStatements: Statement[] | null = null;\r\n var finallyStatements: Statement[] | null = null;\r\n if (tn.skip(Token.CATCH)) {\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.IDENTIFIER)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(Token.FINALLY)) {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"catch\"\r\n );\r\n return null;\r\n }\r\n var ret = Node.createTryStatement(\r\n statements,\r\n catchVariable,\r\n catchStatements,\r\n finallyStatements,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseTypeDeclaration(\r\n tn: Tokenizer,\r\n modifiers: Modifier[] | null = null,\r\n decorators: Decorator[] | null = null\r\n ): TypeDeclaration | null {\r\n\r\n // at 'type': Identifier '=' Type ';'?\r\n\r\n var startPos = decorators && decorators.length ? decorators[0].range.start\r\n : modifiers && modifiers.length ? modifiers[0].range.start\r\n : tn.tokenPos;\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n var type = this.parseType(tn);\r\n if (!type) return null;\r\n var ret = Node.createTypeDeclaration(name, type, modifiers, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseWhileStatement(\r\n tn: Tokenizer\r\n ): WhileStatement | null {\r\n\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n var ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n parseExpressionStart(\r\n tn: Tokenizer\r\n ): Expression | null {\r\n\r\n var token = tn.next(true);\r\n var startPos = tn.tokenPos;\r\n var expr: Expression | null = null;\r\n\r\n if (token == Token.NULL) {\r\n return Node.createNullExpression(tn.range());\r\n }\r\n if (token == Token.TRUE) {\r\n return Node.createTrueExpression(tn.range());\r\n }\r\n if (token == Token.FALSE) {\r\n return Node.createFalseExpression(tn.range());\r\n }\r\n\r\n var p = determinePrecedenceStart(token);\r\n if (p != Precedence.INVALID) {\r\n var operand: Expression | null;\r\n\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n // NewExpression\r\n if (token == Token.NEW) {\r\n operand = this.parseExpression(tn, Precedence.CALL);\r\n if (!operand) return null;\r\n if (operand.kind == NodeKind.CALL) {\r\n return Node.createNewExpression(\r\n (operand).expression,\r\n (operand).typeArguments,\r\n (operand).arguments,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n } else {\r\n operand = this.parseExpression(tn, p);\r\n if (!operand) return null;\r\n }\r\n\r\n // UnaryPrefixExpression\r\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n if (\r\n operand.kind != NodeKind.IDENTIFIER &&\r\n operand.kind != NodeKind.ELEMENTACCESS &&\r\n operand.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n operand.range\r\n );\r\n }\r\n }\r\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n\r\n switch (token) {\r\n\r\n // ParenthesizedExpression\r\n case Token.OPENPAREN:\r\n expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n\r\n // ArrayLiteralExpression\r\n case Token.OPENBRACKET:\r\n var elementExpressions = new Array();\r\n\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n do {\r\n if (tn.peek() == Token.COMMA) {\r\n expr = null; // omitted\r\n } else {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (tn.peek() == Token.CLOSEBRACKET) break;\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n\r\n // AssertionExpression (unary prefix)\r\n case Token.LESSTHAN:\r\n var toType = this.parseType(tn);\r\n if (!toType) return null;\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, Precedence.CALL);\r\n if (!expr) return null;\r\n return Node.createAssertionExpression(\r\n AssertionKind.PREFIX,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n case Token.IDENTIFIER:\r\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n\r\n case Token.THIS:\r\n return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.CONSTRUCTOR:\r\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.SUPER:\r\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n\r\n case Token.STRINGLITERAL:\r\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n\r\n case Token.INTEGERLITERAL:\r\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n\r\n case Token.FLOATLITERAL:\r\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case Token.SLASH:\r\n var regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(Token.SLASH)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"/\"\r\n );\r\n return null;\r\n }\r\n return Node.createRegexpLiteralExpression(\r\n regexpPattern,\r\n tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n default:\r\n this.error(\r\n DiagnosticCode.Expression_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n tryParseTypeArgumentsBeforeArguments(\r\n tn: Tokenizer\r\n ): TypeNode[] | null {\r\n\r\n // at '<': Type (',' Type)* '>' '('\r\n\r\n tn.mark();\r\n if (!tn.skip(Token.LESSTHAN)) return null;\r\n var typeArguments = new Array();\r\n do {\r\n var type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset();\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset();\r\n return null;\r\n }\r\n\r\n parseArguments(\r\n tn: Tokenizer\r\n ): Expression[] | null {\r\n\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n var args = new Array();\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n do {\r\n var expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n args.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n return args;\r\n }\r\n\r\n parseExpression(\r\n tn: Tokenizer,\r\n precedence: Precedence = 0\r\n ): Expression | null {\r\n\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr) return null;\r\n var startPos = expr.range.start;\r\n\r\n // CallExpression\r\n var typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn); // skips '(' on success\r\n // there might be better ways to distinguish a LESSTHAN from a CALL with type arguments\r\n if (typeArguments || tn.skip(Token.OPENPAREN)) {\r\n var args = this.parseArguments(tn);\r\n if (!args) return null;\r\n expr = Node.createCallExpression(expr, typeArguments, args, tn.range(startPos, tn.pos));\r\n }\r\n\r\n var token: Token;\r\n var next: Expression | null = null;\r\n var nextPrecedence: Precedence;\r\n while (\r\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n ) { // precedence climbing\r\n tn.next();\r\n\r\n switch (token) {\r\n\r\n // AssertionExpression\r\n case Token.AS:\r\n var toType = this.parseType(tn);\r\n if (!toType) return null;\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.AS,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // ElementAccessExpression\r\n case Token.OPENBRACKET:\r\n next = this.parseExpression(tn);\r\n if (!next) return null;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n expr = Node.createElementAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // UnaryPostfixExpression\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n if (\r\n expr.kind != NodeKind.IDENTIFIER &&\r\n expr.kind != NodeKind.ELEMENTACCESS &&\r\n expr.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n expr.range\r\n );\r\n }\r\n expr = Node.createUnaryPostfixExpression(\r\n token,\r\n expr,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // TernaryExpression\r\n case Token.QUESTION:\r\n var ifThen = this.parseExpression(tn);\r\n if (!ifThen) return null;\r\n if (!tn.skip(Token.COLON)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n var ifElse = this.parseExpression(tn);\r\n if (!ifElse) return null;\r\n expr = Node.createTernaryExpression(\r\n expr,\r\n ifThen,\r\n ifElse,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n\r\n // CommaExpression\r\n case Token.COMMA:\r\n var commaExprs: Expression[] = [ expr ];\r\n do {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n\r\n default:\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n\r\n // PropertyAccessExpression\r\n if (token == Token.DOT) {\r\n if (next.kind == NodeKind.IDENTIFIER) {\r\n expr = Node.createPropertyAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else if (next.kind == NodeKind.CALL) { // join\r\n var propertyCall = next;\r\n if (propertyCall.expression.kind == NodeKind.IDENTIFIER) {\r\n propertyCall.expression = Node.createPropertyAccessExpression(\r\n expr,\r\n propertyCall.expression,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n propertyCall.expression.range\r\n );\r\n return null;\r\n }\r\n expr = propertyCall;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n next.range\r\n );\r\n return null;\r\n }\r\n\r\n // BinaryExpression\r\n } else {\r\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n COMMA,\r\n SPREAD,\r\n YIELD,\r\n ASSIGNMENT,\r\n CONDITIONAL,\r\n LOGICAL_OR,\r\n LOGICAL_AND,\r\n BITWISE_OR,\r\n BITWISE_XOR,\r\n BITWISE_AND,\r\n EQUALITY,\r\n RELATIONAL,\r\n SHIFT,\r\n ADDITIVE,\r\n MULTIPLICATIVE,\r\n EXPONENTIATED,\r\n UNARY_PREFIX,\r\n UNARY_POSTFIX,\r\n CALL,\r\n MEMBERACCESS,\r\n GROUPING,\r\n INVALID = -1\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): i32 {\r\n switch (kind) {\r\n\r\n case Token.DOT_DOT_DOT:\r\n return Precedence.SPREAD;\r\n\r\n case Token.YIELD:\r\n return Precedence.YIELD;\r\n\r\n case Token.EXCLAMATION:\r\n case Token.TILDE:\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n case Token.TYPEOF:\r\n case Token.VOID:\r\n case Token.DELETE:\r\n return Precedence.UNARY_PREFIX;\r\n\r\n case Token.NEW:\r\n return Precedence.MEMBERACCESS;\r\n\r\n default:\r\n return Precedence.INVALID;\r\n }\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): i32 {\r\n switch (kind) {\r\n\r\n case Token.COMMA:\r\n return Precedence.COMMA;\r\n\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n return Precedence.ASSIGNMENT;\r\n\r\n case Token.QUESTION:\r\n return Precedence.CONDITIONAL;\r\n\r\n case Token.BAR_BAR:\r\n return Precedence.LOGICAL_OR;\r\n\r\n case Token.AMPERSAND_AMPERSAND:\r\n return Precedence.LOGICAL_AND;\r\n\r\n case Token.BAR:\r\n return Precedence.BITWISE_OR;\r\n\r\n case Token.CARET:\r\n return Precedence.BITWISE_XOR;\r\n\r\n case Token.AMPERSAND:\r\n return Precedence.BITWISE_AND;\r\n\r\n case Token.EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS:\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n return Precedence.EQUALITY;\r\n\r\n case Token.AS:\r\n case Token.IN:\r\n case Token.INSTANCEOF:\r\n case Token.LESSTHAN:\r\n case Token.GREATERTHAN:\r\n case Token.LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_EQUALS:\r\n return Precedence.RELATIONAL;\r\n\r\n case Token.LESSTHAN_LESSTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:\r\n return Precedence.SHIFT;\r\n\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n return Precedence.ADDITIVE;\r\n\r\n case Token.ASTERISK:\r\n case Token.SLASH:\r\n case Token.PERCENT:\r\n return Precedence.MULTIPLICATIVE;\r\n\r\n case Token.ASTERISK_ASTERISK:\r\n return Precedence.EXPONENTIATED;\r\n\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n return Precedence.UNARY_POSTFIX;\r\n\r\n case Token.DOT:\r\n case Token.NEW:\r\n case Token.OPENBRACKET:\r\n return Precedence.MEMBERACCESS;\r\n\r\n default:\r\n return Precedence.INVALID;\r\n }\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n switch (kind) {\r\n\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n case Token.QUESTION:\r\n case Token.ASTERISK_ASTERISK:\r\n return true;\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/parser.ts"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 113e13be..3d92a255 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,14 @@ "scripts": { "build": "webpack", "clean": "node scripts/clean", - "lint": "tslint -c tslint.json --project src --formatters-dir lib/tslint --format as", - "test:config": "npm run test:config:portable --scripts-prepend-node-path && npm run test:config:src --scripts-prepend-node-path", - "test:config:portable": "tsc --noEmit -p std/portable --diagnostics --listFiles", - "test:config:src": "tsc --noEmit -p src --diagnostics --listFiles", + "lint": "npm run lint:compiler && npm run lint:library", + "lint:compiler": "tslint -c tslint.json --project src --formatters-dir lib/tslint --format as", + "lint:library": "tslint -c tslint.json --project std/assembly --formatters-dir lib/tslint --format as", + "test:config": "tsc --noEmit -p src --diagnostics --listFiles", "test:parser": "node tests/parser", "test:compiler": "node tests/compiler", - "test": "npm run test:config --scripts-prepend-node-path && npm run test:parser --scripts-prepend-node-path && npm run test:compiler --scripts-prepend-node-path" + "test": "npm run test:config --scripts-prepend-node-path && npm run test:parser --scripts-prepend-node-path && npm run test:compiler --scripts-prepend-node-path", + "all": "npm run lint && npm run clean && npm test && npm run build && npm test" }, "files": [ "bin/", diff --git a/std/assembly.d.ts b/std/assembly.d.ts index 70ee4ff2..fca3f5cb 100644 --- a/std/assembly.d.ts +++ b/std/assembly.d.ts @@ -155,7 +155,7 @@ declare function sqrt(value: T): T; /** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */ declare function trunc(value: T): T; /** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */ -declare function load(ptr: usize, constantOffset?: usize): any; +declare function load(ptr: usize, constantOffset?: usize): T; /** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */ declare function store(ptr: usize, value: any, constantOffset?: usize): void; /** Returns the current memory size in units of pages. One page is 64kb. */ @@ -292,10 +292,10 @@ declare class Set { // Internal decorators /** Annotates an element as a program global. */ -declare function global(target: Function): any; +declare function global(target: Function, propertyKey: string, descriptor: any): void; /** Annotates a method as an operator overload. */ -declare function operator(token: string): any; +declare function operator(token: string): (target: any, propertyKey: string, descriptor: any) => void; /** Annotates a class as being unmanaged with limited capabilities. */ declare function unmanaged(target: Function): any; diff --git a/std/assembly/allocator/tlsf.ts b/std/assembly/allocator/tlsf.ts index 42bbfab1..415ff4e7 100644 --- a/std/assembly/allocator/tlsf.ts +++ b/std/assembly/allocator/tlsf.ts @@ -17,7 +17,6 @@ const SL_SIZE: usize = 1 << SL_BITS; const SB_BITS: usize = (SL_BITS + AL_BITS); const SB_SIZE: usize = 1 << SB_BITS; -const SB_MASK: usize = SB_SIZE - 1; const FL_BITS: u32 = (sizeof() == sizeof() ? 30 // ^= up to 1GB per block @@ -267,10 +266,8 @@ class Root { // link previous and next free block var prev = block.prev; var next = block.next; - if (prev) - prev.next = next; - if (next) - next.prev = prev; + if (prev) prev.next = next; + if (next) next.prev = prev; // update head if we are removing it if (block == this.getHead(fl, sl)) { @@ -282,8 +279,7 @@ class Root { this.setSLMap(fl, slMap &= ~(1 << sl)); // clear first level map if second level is empty now - if (!slMap) - this.flMap &= ~(1 << fl); + if (!slMap) this.flMap &= ~(1 << fl); } } } @@ -320,10 +316,10 @@ class Root { slMap = assert(this.getSLMap(fl)); // can't be zero if fl points here head = this.getHead(fl, ffs(slMap)); } - } else + } else { head = this.getHead(fl, ffs(slMap)); - - return head; + } + return head; } /** Links a free left with its right block in memory. */ @@ -386,13 +382,15 @@ class Root { tailInfo = changetype(tailRef).info; } - } else + } else { assert(start >= changetype(this) + Root.SIZE); // starts after root + } // check if size is large enough for a free block and the tail block var size = end - start; - if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) + if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) { return false; + } // left size is total minus its own and the zero-length tail's header var leftSize = size - 2 * Block.INFO; @@ -443,8 +441,9 @@ export function allocate_memory(size: usize): usize { root.flMap = 0; for (var fl: usize = 0; fl < FL_BITS; ++fl) { root.setSLMap(fl, 0); - for (var sl: u32 = 0; sl < SL_SIZE; ++sl) + for (var sl: u32 = 0; sl < SL_SIZE; ++sl) { root.setHead(fl, sl, null); + } } root.addMemory(rootOffset + Root.SIZE, current_memory() << 16); } @@ -461,9 +460,11 @@ export function allocate_memory(size: usize): usize { var pagesBefore = current_memory(); var pagesNeeded = ((size + 0xffff) & ~0xffff) >>> 16; var pagesWanted = max(pagesBefore, pagesNeeded); // double memory - if (grow_memory(pagesWanted) < 0) - if (grow_memory(pagesNeeded) < 0) + if (grow_memory(pagesWanted) < 0) { + if (grow_memory(pagesNeeded) < 0) { unreachable(); // out of memory + } + } var pagesAfter = current_memory(); root.addMemory(pagesBefore << 16, pagesAfter << 16); block = assert(root.search(size)); // must be found now diff --git a/std/assembly/array.ts b/std/assembly/array.ts index 8ac36e55..17d2806d 100644 --- a/std/assembly/array.ts +++ b/std/assembly/array.ts @@ -16,9 +16,12 @@ export class Array { } constructor(capacity: i32 = 0) { - if (capacity < 0) + if (capacity < 0) { throw new RangeError("Invalid array length"); - this.__memory = capacity ? allocate_memory(capacity * sizeof()) : 0; + } + this.__memory = capacity + ? allocate_memory(capacity * sizeof()) + : 0; this.__capacity = this.__length = capacity; } @@ -27,72 +30,92 @@ export class Array { } set length(length: i32) { - if (length < 0) + if (length < 0) { throw new RangeError("Invalid array length"); - if (length > this.__capacity) + } + if (length > this.__capacity) { this.__grow(max(length, this.__capacity << 1)); + } this.__length = length; } @operator("[]") private __get(index: i32): T { - if (index >= this.__capacity) + if (index >= this.__capacity) { throw new Error("Index out of bounds"); // return changetype(0) ? + } return load(this.__memory + index * sizeof()); } @operator("[]=") private __set(index: i32, value: T): void { - if (index < 0) + if (index < 0) { throw new Error("Index out of bounds"); - if (index >= this.__capacity) + } + if (index >= this.__capacity) { this.__grow(max(index + 1, this.__capacity << 1)); + } store(this.__memory + index * sizeof(), value); } indexOf(searchElement: T, fromIndex: i32 = 0): i32 { - if (fromIndex < 0) + if (fromIndex < 0) { fromIndex = this.__length + fromIndex; + } while (fromIndex < this.__length) { - if (load(this.__memory + fromIndex * sizeof()) == searchElement) + if (load(this.__memory + fromIndex * sizeof()) == searchElement) { return fromIndex; + } ++fromIndex; } return -1; } lastIndexOf(searchElement: T, fromIndex: i32 = 0): i32 { - if (fromIndex < 0) + if (fromIndex < 0) { fromIndex = this.__length + fromIndex; - else if (fromIndex >= this.__length) + } else if (fromIndex >= this.__length) { fromIndex = this.__length - 1; + } while (fromIndex >= 0) { - if (load(this.__memory + fromIndex * sizeof()) == searchElement) + if (load(this.__memory + fromIndex * sizeof()) == searchElement) { return fromIndex; + } --fromIndex; } return -1; } push(element: T): i32 { - if (this.__length == this.__capacity) + if (this.__length == this.__capacity) { this.__grow(this.__capacity ? this.__capacity << 1 : 1); + } store(this.__memory + this.__length * sizeof(), element); return ++this.__length; } pop(): T { - if (this.__length < 1) + if (this.__length < 1) { throw new RangeError("Array is empty"); // return changetype(0) ? + } return load(this.__memory + --this.__length * sizeof()); } shift(): T { - if (this.__length < 1) + if (this.__length < 1) { throw new RangeError("Array is empty"); // return changetype(0) ? + } var element = load(this.__memory); - move_memory(this.__memory, this.__memory + sizeof(), (this.__capacity - 1) * sizeof()); - set_memory(this.__memory + (this.__capacity - 1) * sizeof(), 0, sizeof()); + move_memory( + this.__memory, + this.__memory + sizeof(), + (this.__capacity - 1) * sizeof() + ); + set_memory( + this.__memory + (this.__capacity - 1) * sizeof(), + 0, + sizeof() + ); --this.__length; return element; } @@ -105,13 +128,22 @@ export class Array { assert(newCapacity > this.__capacity); var newMemory = allocate_memory(newCapacity * sizeof()); if (this.__memory) { - move_memory(newMemory + sizeof(), this.__memory, oldCapacity * sizeof()); + move_memory( + newMemory + sizeof(), + this.__memory, + oldCapacity * sizeof() + ); free_memory(this.__memory); } this.__memory = newMemory; this.__capacity = newCapacity; - } else - move_memory(this.__memory + sizeof(), this.__memory, oldCapacity * sizeof()); + } else { + move_memory( + this.__memory + sizeof(), + this.__memory, + oldCapacity * sizeof() + ); + } store(this.__memory, element); return ++this.__length; } @@ -119,37 +151,53 @@ export class Array { slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array { if (begin < 0) { begin = this.__length + begin; - if (begin < 0) + if (begin < 0) { begin = 0; - } else if (begin > this.__length) + } + } else if (begin > this.__length) { begin = this.__length; - if (end < 0) + } + if (end < 0) { end = this.__length + end; - else if (end > this.__length) + } else if (end > this.__length) { end = this.__length; - if (end < begin) + } + if (end < begin) { end = begin; + } var capacity = end - begin; assert(capacity >= 0); var sliced = new Array(capacity); - if (capacity) - move_memory(sliced.__memory, this.__memory + begin * sizeof(), capacity * sizeof()); + if (capacity) { + move_memory( + sliced.__memory, + this.__memory + begin * sizeof(), + capacity * sizeof() + ); + } return sliced; } splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): void { - if (deleteCount < 1) + if (deleteCount < 1) { return; + } if (start < 0) { start = this.__length + start; - if (start < 0) + if (start < 0) { start = 0; - else if (start >= this.__length) + } else if (start >= this.__length) { return; - } else if (start >= this.__length) + } + } else if (start >= this.__length) { return; + } deleteCount = min(deleteCount, this.__length - start); - move_memory(this.__memory + start * sizeof(), this.__memory + (start + deleteCount) * sizeof(), deleteCount * sizeof()); + move_memory( + this.__memory + start * sizeof(), + this.__memory + (start + deleteCount) * sizeof(), + deleteCount * sizeof() + ); this.__length -= deleteCount; } @@ -170,15 +218,17 @@ export class CArray { @operator("[]") private __get(index: i32): T { - if (index < 0) + if (index < 0) { throw new RangeError("Index out of range"); + } return load(changetype(this) + index * sizeof()); } @operator("[]=") private __set(index: i32, value: T): void { - if (index < 0) + if (index < 0) { throw new RangeError("Index out of range"); + } store(changetype(this) + index * sizeof(), value); } } diff --git a/std/assembly/builtins.ts b/std/assembly/builtins.ts index 1df888c9..f350fcd8 100644 --- a/std/assembly/builtins.ts +++ b/std/assembly/builtins.ts @@ -89,7 +89,12 @@ export declare function changetype(value: void): T; export declare function assert(isTrueish: T, message?: string): T; @builtin -export declare function abort(message?: string | null, fileName?: string | null, lineNumber?: u32, columnNumber?: u32): void; +export declare function abort( + message?: string | null, + fileName?: string | null, + lineNumber?: u32, + columnNumber?: u32 +): void; @builtin declare function i8(value: void): i8; @@ -126,8 +131,12 @@ export { i64 }; @builtin declare function isize(value: void): isize; namespace isize { - export const MIN_VALUE: isize = sizeof() == sizeof() ? -2147483648 : -9223372036854775808; - export const MAX_VALUE: isize = sizeof() == sizeof() ? 2147483647 : 9223372036854775807; + export const MIN_VALUE: isize = sizeof() == sizeof() + ? -2147483648 + : -9223372036854775808; + export const MAX_VALUE: isize = sizeof() == sizeof() + ? 2147483647 + : 9223372036854775807; } export { isize }; @@ -167,7 +176,9 @@ export { u64 }; declare function usize(value: void): usize; namespace usize { export const MIN_VALUE: usize = 0; - export const MAX_VALUE: usize = sizeof() == sizeof() ? 4294967295 : 18446744073709551615; + export const MAX_VALUE: usize = sizeof() == sizeof() + ? 4294967295 + : 18446744073709551615; } export { usize }; diff --git a/std/assembly/map.ts b/std/assembly/map.ts index 1506b00a..d81cc8e0 100644 --- a/std/assembly/map.ts +++ b/std/assembly/map.ts @@ -11,17 +11,21 @@ export class Map { get(key: K): V | null { var keys = this.__keys; - for (var i = 0, k = keys.length; i < k; ++i) - if (keys[i] == key) + for (var i = 0, k = keys.length; i < k; ++i) { + if (keys[i] == key) { return this.__values[i]; + } + } return null; } has(key: K): bool { var keys = this.__keys; - for (var i = 0, k = keys.length; i < k; ++i) - if (keys[i] == key) + for (var i = 0, k = keys.length; i < k; ++i) { + if (keys[i] == key) { return true; + } + } return false; } diff --git a/std/assembly/memory.ts b/std/assembly/memory.ts index b51297dd..2219f7b1 100644 --- a/std/assembly/memory.ts +++ b/std/assembly/memory.ts @@ -145,8 +145,7 @@ export function move_memory(dest: usize, src: usize, n: usize): void { // based on musl's implementation of memmove // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands - if (dest == src) - return; + if (dest == src) return; if (src + n <= dest || dest + n <= src) { copy_memory(dest, src, n); return; @@ -154,8 +153,7 @@ export function move_memory(dest: usize, src: usize, n: usize): void { if (dest < src) { if ((src & 7) == (dest & 7)) { while (dest & 7) { - if (!n) - return; + if (!n) return; --n; store(dest++, load(src++)); } @@ -173,8 +171,7 @@ export function move_memory(dest: usize, src: usize, n: usize): void { } else { if ((src & 7) == (dest & 7)) { while ((dest + n) & 7) { - if (!n) - return; + if (!n) return; store(dest + --n, load(src + n)); } while (n >= 8) { @@ -193,23 +190,19 @@ export function set_memory(dest: usize, c: u8, n: usize): void { // becomes obsolete once https://github.com/WebAssembly/bulk-memory-operations lands // fill head and tail with minimal branching - if (!n) - return; + if (!n) return; store(dest, c); store(dest + n - 1, c); - if (n <= 2) - return; + if (n <= 2) return; store(dest + 1, c); store(dest + 2, c); store(dest + n - 2, c); store(dest + n - 3, c); - if (n <= 6) - return; + if (n <= 6) return; store(dest + 3, c); store(dest + n - 4, c); - if (n <= 8) - return; + if (n <= 8) return; // advance pointer to align it at 4-byte boundary var k: usize = -dest & 3; @@ -222,14 +215,12 @@ export function set_memory(dest: usize, c: u8, n: usize): void { // fill head/tail up to 28 bytes each in preparation store(dest, c32); store(dest + n - 4, c32); - if (n <= 8) - return; + if (n <= 8) return; store(dest + 4, c32); store(dest + 8, c32); store(dest + n - 12, c32); store(dest + n - 8, c32); - if (n <= 24) - return; + if (n <= 24) return; store(dest + 12, c32); store(dest + 16, c32); store(dest + 20, c32); @@ -259,8 +250,7 @@ export function set_memory(dest: usize, c: u8, n: usize): void { export function compare_memory(vl: usize, vr: usize, n: usize): i32 { // based on musl's implementation of memcmp // provided because there's no proposed alternative - if (vl == vr) - return 0; + if (vl == vr) return 0; while (n && load(vl) == load(vr)) { n--; vl++; diff --git a/std/assembly/set.ts b/std/assembly/set.ts index 464c0208..83f5fbab 100644 --- a/std/assembly/set.ts +++ b/std/assembly/set.ts @@ -21,9 +21,11 @@ export class Set { has(value: T): bool { assert(this != null); - for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) - if (load(this.__memory + index * sizeof()) == value) + for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) { + if (load(this.__memory + index * sizeof()) == value) { return true; + } + } return false; } @@ -48,13 +50,19 @@ export class Set { delete(value: T): bool { assert(this != null); - for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) + for (var index: usize = 0, limit: usize = this.__size; index < limit; ++index) { if (load(this.__memory + index * sizeof()) == value) { - if (index + 1 < this.__size) - move_memory(this.__memory + index * sizeof(), this.__memory + (index + 1) * sizeof(), this.__size - index - 1); + if (index + 1 < this.__size) { + move_memory( + this.__memory + index * sizeof(), + this.__memory + (index + 1) * sizeof(), + this.__size - index - 1 + ); + } --this.__size; return true; } + } return false; } diff --git a/std/assembly/string.ts b/std/assembly/string.ts index dfd8befa..ba33d3c8 100644 --- a/std/assembly/string.ts +++ b/std/assembly/string.ts @@ -19,8 +19,9 @@ export class String { charAt(pos: i32): String { assert(this != null); - if (pos >= this.length) + if (pos >= this.length) { return EMPTY; + } var out = allocate(1); store( @@ -36,10 +37,9 @@ export class String { charCodeAt(pos: i32): i32 { assert(this != null); - - if (pos >= this.length) + if (pos >= this.length) { return -1; // (NaN) - + } return load( changetype(this) + (pos << 1), HEAD @@ -48,43 +48,45 @@ export class String { codePointAt(pos: i32): i32 { assert(this != null); - - if (pos >= this.length) + if (pos >= this.length) { return -1; // (undefined) + } var first = load( changetype(this) + (pos << 1), HEAD ); - if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) + if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) { return first; + } var second = load( changetype(this) + ((pos + 1) << 1), HEAD ); - if (second < 0xDC00 || second > 0xDFFF) + if (second < 0xDC00 || second > 0xDFFF) { return first; + } return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000; } @operator("+") private static __concat(left: String, right: String): String { - if (left == null) + if (left == null) { left = changetype("null"); + } return left.concat(right); } concat(other: String): String { assert(this != null); - - if (other == null) + if (other == null) { other = changetype("null"); - + } var thisLen: isize = this.length; var otherLen: isize = other.length; var outLen: usize = thisLen + otherLen; - if (outLen == 0) + if (outLen == 0) { return EMPTY; - + } var out = allocate(outLen); move_memory( changetype(out) + HEAD, @@ -101,16 +103,15 @@ export class String { endsWith(searchString: String, endPosition: i32 = 0x7fffffff): bool { assert(this != null); - - if (searchString == null) + if (searchString == null) { return false; - + } var end: isize = min(max(endPosition, 0), this.length); var searchLength: isize = searchString.length; var start: isize = end - searchLength; - if (start < 0) + if (start < 0) { return false; - + } return !compare_memory( changetype(this) + HEAD + (start << 1), changetype(searchString) + HEAD, @@ -120,15 +121,15 @@ export class String { @operator("==") private static __eq(left: String, right: String): bool { - if (left == null) + if (left == null) { return right == null; - else if (right == null) + } else if (right == null) { return false; - + } var leftLength = left.length; - if (leftLength != right.length) + if (leftLength != right.length) { return false; - + } return !compare_memory( changetype(left) + HEAD, changetype(right) + HEAD, @@ -142,39 +143,39 @@ export class String { indexOf(searchString: String, position: i32 = 0): i32 { assert(this != null); - - if (searchString == null) + if (searchString == null) { searchString = changetype("null"); - + } var pos: isize = position; var len: isize = this.length; var start: isize = min(max(pos, 0), len); var searchLen: isize = searchString.length; // TODO: two-way, multiple char codes - for (var k: usize = start; k + searchLen <= len; ++k) + for (var k: usize = start; k + searchLen <= len; ++k) { if (!compare_memory( changetype(this) + HEAD + (k << 1), changetype(searchString) + HEAD, searchLen << 1) - ) + ) { return k; + } + } return -1; } startsWith(searchString: String, position: i32 = 0): bool { assert(this != null); - - if (searchString == null) + if (searchString == null) { searchString = changetype("null"); - + } var pos: isize = position; var len: isize = this.length; - var start: isize = min(max(position, 0), len); + var start: isize = min(max(pos, 0), len); var searchLength: isize = searchString.length; - if (searchLength + start > len) + if (searchLength + start > len) { return false; - + } return !compare_memory( changetype(this) + HEAD + (start << 1), changetype(searchString) + HEAD, @@ -184,17 +185,16 @@ export class String { substr(start: i32, length: i32 = i32.MAX_VALUE): String { assert(this != null); - var intStart: isize = start; var end: isize = length; var size: isize = this.length; - if (intStart < 0) + if (intStart < 0) { intStart = max(size + intStart, 0); - + } var resultLength: isize = min(max(end, 0), size - intStart); - if (resultLength <= 0) + if (resultLength <= 0) { return EMPTY; - + } var out = allocate(resultLength); move_memory( changetype(out) + HEAD, @@ -206,19 +206,18 @@ export class String { substring(start: i32, end: i32 = i32.MAX_VALUE): String { assert(this != null); - var len = this.length; var finalStart = min(max(start, 0), len); var finalEnd = min(max(end, 0), len); var from = min(finalStart, finalEnd); var to = max(finalStart, finalEnd); len = to - from; - if (!len) + if (!len) { return EMPTY; - - if (!from && to == this.length) + } + if (!from && to == this.length) { return this; - + } var out = allocate(len); move_memory( changetype(out) + HEAD, @@ -230,21 +229,30 @@ export class String { trim(): String { assert(this != null); - var length: usize = this.length; - while (length && isWhiteSpaceOrLineTerminator(load(changetype(this) + (length << 1), HEAD))) + while ( + length && + isWhiteSpaceOrLineTerminator( + load(changetype(this) + (length << 1), HEAD) + ) + ) { --length; - + } var start: usize = 0; - while (start < length && isWhiteSpaceOrLineTerminator(load(changetype(this) + (start << 1), HEAD))) + while ( + start < length && + isWhiteSpaceOrLineTerminator( + load(changetype(this) + (start << 1), HEAD) + ) + ) { ++start, --length; - - if (!length) + } + if (!length) { return EMPTY; - - if (!start && length == this.length) + } + if (!start && length == this.length) { return this; - + } var out = allocate(length); move_memory( changetype(out) + HEAD, @@ -256,19 +264,23 @@ export class String { trimLeft(): String { assert(this != null); - var start: isize = 0; var len: isize = this.length; - while (start < len && isWhiteSpaceOrLineTerminator(load(changetype(this) + (start << 1), HEAD))) + while ( + start < len && + isWhiteSpaceOrLineTerminator( + load(changetype(this) + (start << 1), HEAD) + ) + ) { ++start; - - if (!start) + } + if (!start) { return this; - + } var outLen = len - start; - if (!outLen) + if (!outLen) { return EMPTY; - + } var out = allocate(outLen); move_memory( changetype(out) + HEAD, @@ -280,17 +292,21 @@ export class String { trimRight(): String { assert(this != null); - var len: isize = this.length; - while (len > 0 && isWhiteSpaceOrLineTerminator(load(changetype(this) + (len << 1), HEAD))) + while ( + len > 0 && + isWhiteSpaceOrLineTerminator( + load(changetype(this) + (len << 1), HEAD) + ) + ) { --len; - - if (len <= 0) + } + if (len <= 0) { return EMPTY; - - if (len == this.length) + } + if (len == this.length) { return this; - + } var out = allocate(len); move_memory( changetype(out) + HEAD, @@ -303,19 +319,16 @@ export class String { function isWhiteSpaceOrLineTerminator(c: u16): bool { switch (c) { - case 10: // case 13: // case 8232: // case 8233: // - case 9: // case 11: // case 12: // case 32: // case 160: // case 65279: // - return true; default: return false; @@ -364,25 +377,29 @@ export function parseI64(str: String, radix: i32 = 0): i64 { function parse(str: String, radix: i32 = 0): T { var len: i32 = str.length; - if (!len) + if (!len) { return NaN; + } var ptr = changetype(str) /* + HEAD -> offset */; var code = load(ptr, HEAD); // determine sign var sign: T; if (code == CharCode.MINUS) { - if (!--len) + if (!--len) { return NaN; + } code = load(ptr += 2, HEAD); sign = -1; } else if (code == CharCode.PLUS) { - if (!--len) + if (!--len) { return NaN; + } code = load(ptr += 2, HEAD); sign = 1; - } else + } else { sign = 1; + } // determine radix if (!radix) { @@ -411,23 +428,26 @@ function parse(str: String, radix: i32 = 0): T { radix = 10; } } else radix = 10; - } else if (radix < 2 || radix > 36) + } else if (radix < 2 || radix > 36) { return NaN; + } // calculate value var num: T = 0; while (len--) { code = load(ptr, HEAD); - if (code >= CharCode._0 && code <= CharCode._9) + if (code >= CharCode._0 && code <= CharCode._9) { code -= CharCode._0; - else if (code >= CharCode.A && code <= CharCode.Z) + } else if (code >= CharCode.A && code <= CharCode.Z) { code -= CharCode.A - 10; - else if (code >= CharCode.a && code <= CharCode.z) + } else if (code >= CharCode.a && code <= CharCode.z) { code -= CharCode.a - 10; - else + } else { break; - if (code >= radix) + } + if (code >= radix) { break; + } num = (num * radix) + code; ptr += 2; } @@ -436,25 +456,29 @@ function parse(str: String, radix: i32 = 0): T { export function parseFloat(str: String): f64 { var len: i32 = str.length; - if (!len) + if (!len) { return NaN; + } var ptr = changetype(str) /* + HEAD -> offset */; var code = load(ptr, HEAD); // determine sign var sign: f64; if (code == CharCode.MINUS) { - if (!--len) + if (!--len) { return NaN; + } code = load(ptr += 2, HEAD); sign = -1; } else if (code == CharCode.PLUS) { - if (!--len) + if (!--len) { return NaN; + } code = load(ptr += 2, HEAD); sign = 1; - } else + } else { sign = 1; + } // calculate value var num: f64 = 0; @@ -465,11 +489,13 @@ export function parseFloat(str: String): f64 { var fac: f64 = 0.1; // precision :( while (len--) { code = load(ptr, HEAD); - if (code == CharCode.E || code == CharCode.e) + if (code == CharCode.E || code == CharCode.e) { assert(false); // TODO + } code -= CharCode._0; - if (code > 9) + if (code > 9) { break; + } num += code * fac; fac *= 0.1; ptr += 2; @@ -477,8 +503,9 @@ export function parseFloat(str: String): f64 { break; } code -= CharCode._0; - if (code >= 10) + if (code >= 10) { break; + } num = (num * 10) + code; ptr += 2; } diff --git a/std/portable.js b/std/portable.js index 4b9a57a9..5e626f34 100644 --- a/std/portable.js +++ b/std/portable.js @@ -144,6 +144,7 @@ globalScope["parseI32"] = function parseI32(str, radix) { String["fromCharCodes"] = function fromCharCodes(arr) { return String.fromCharCode.apply(String, arr); }; + String["fromCodePoints"] = function fromCodePoints(arr) { return String.fromCodePoint.apply(String, arr); }; diff --git a/std/portable.json b/std/portable.json index 290418b5..af297a63 100644 --- a/std/portable.json +++ b/std/portable.json @@ -15,6 +15,6 @@ "files": [ "./portable.d.ts", "./portable.js", - "./portable/heap.js" + "./portable/memory.js" ] } diff --git a/std/portable/heap.js b/std/portable/memory.js similarity index 70% rename from std/portable/heap.js rename to std/portable/memory.js index 3e578055..40b3bc82 100644 --- a/std/portable/heap.js +++ b/std/portable/memory.js @@ -3,8 +3,7 @@ var globalScope = typeof window !== "undefined" && window || typeof global !== " var HEAP = new Uint8Array(0); var HEAP_OFFSET = 0; -globalScope["allocate_memory"] = -function allocate_memory(size) { +globalScope["allocate_memory"] = function allocate_memory(size) { if (!(size >>>= 0)) return 0; if (HEAP_OFFSET + size > HEAP.length) { @@ -18,25 +17,21 @@ function allocate_memory(size) { return ptr; }; -globalScope["free_memory"] = -function free_memory(ptr) { +globalScope["free_memory"] = function free_memory(ptr) { // TODO }; -globalScope["move_memory"] = -function move_memory(dest, src, n) { +globalScope["move_memory"] = function move_memory(dest, src, n) { HEAP.copyWithin(dest, src, src + n); }; -globalScope["store"] = -function store(ptr, val, off) { +globalScope["store"] = function store(ptr, val, off) { if (typeof off === "number") ptr += off; HEAP[ptr] = val; }; -globalScope["load"] = -function load(ptr) { +globalScope["load"] = function load(ptr) { if (typeof off === "number") ptr += off; return HEAP[ptr]; diff --git a/std/portable/tsconfig.json b/std/portable/tsconfig.json deleted file mode 100644 index 502aa57d..00000000 --- a/std/portable/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../portable.json", - "compilerOptions": { - "diagnostics": true - }, - "include": [ - "./**/*.ts" - ] -} diff --git a/tests/compiler/binary.optimized.wat b/tests/compiler/binary.optimized.wat index 17505639..36d9f7cf 100644 --- a/tests/compiler/binary.optimized.wat +++ b/tests/compiler/binary.optimized.wat @@ -69,12 +69,6 @@ (i32.const 1) ) ) - (set_global $binary/i - (i32.mul - (get_global $binary/i) - (i32.const 1) - ) - ) (set_global $binary/i (i32.div_s (get_global $binary/i) @@ -135,12 +129,6 @@ (i32.const 1) ) ) - (set_global $binary/i - (i32.mul - (get_global $binary/i) - (i32.const 1) - ) - ) (set_global $binary/i (i32.rem_s (get_global $binary/i) diff --git a/tests/compiler/memcpy.optimized.wat b/tests/compiler/memcpy.optimized.wat index 8460046b..7f8b52a0 100644 --- a/tests/compiler/memcpy.optimized.wat +++ b/tests/compiler/memcpy.optimized.wat @@ -18,13 +18,13 @@ ) (loop $continue|0 (if - (if (result i32) - (get_local $2) - (i32.rem_u + (select + (i32.and (get_local $1) - (i32.const 4) + (i32.const 3) ) (get_local $2) + (get_local $2) ) (block (set_local $0 @@ -63,9 +63,9 @@ ) (if (i32.eqz - (i32.rem_u + (i32.and (get_local $0) - (i32.const 4) + (i32.const 3) ) ) (block @@ -269,9 +269,9 @@ (block $tablify|0 (br_table $case0|2 $case1|2 $case2|2 $tablify|0 (i32.sub - (i32.rem_u + (i32.and (get_local $0) - (i32.const 4) + (i32.const 3) ) (i32.const 1) ) diff --git a/tests/compiler/memmove.optimized.wat b/tests/compiler/memmove.optimized.wat index 1bd04165..0121ba67 100644 --- a/tests/compiler/memmove.optimized.wat +++ b/tests/compiler/memmove.optimized.wat @@ -31,21 +31,21 @@ (block (if (i32.eq - (i32.rem_u + (i32.and (get_local $1) - (i32.const 8) + (i32.const 7) ) - (i32.rem_u + (i32.and (get_local $0) - (i32.const 8) + (i32.const 7) ) ) (block (loop $continue|0 (if - (i32.rem_u + (i32.and (get_local $0) - (i32.const 8) + (i32.const 7) ) (block (if @@ -169,24 +169,24 @@ (block (if (i32.eq - (i32.rem_u + (i32.and (get_local $1) - (i32.const 8) + (i32.const 7) ) - (i32.rem_u + (i32.and (get_local $0) - (i32.const 8) + (i32.const 7) ) ) (block (loop $continue|3 (if - (i32.rem_u + (i32.and (i32.add (get_local $0) (get_local $2) ) - (i32.const 8) + (i32.const 7) ) (block (if diff --git a/tests/compiler/showcase.optimized.wat b/tests/compiler/showcase.optimized.wat index 5872b568..64fd88b8 100644 --- a/tests/compiler/showcase.optimized.wat +++ b/tests/compiler/showcase.optimized.wat @@ -92,13 +92,13 @@ ) (loop $continue|0 (if - (if (result i32) - (get_local $2) - (i32.rem_u + (select + (i32.and (get_local $1) - (i32.const 4) + (i32.const 3) ) (get_local $2) + (get_local $2) ) (block (set_local $0 @@ -137,9 +137,9 @@ ) (if (i32.eqz - (i32.rem_u + (i32.and (get_local $0) - (i32.const 4) + (i32.const 3) ) ) (block @@ -343,9 +343,9 @@ (block $tablify|0 (br_table $case0|2 $case1|2 $case2|2 $tablify|0 (i32.sub - (i32.rem_u + (i32.and (get_local $0) - (i32.const 4) + (i32.const 3) ) (i32.const 1) ) @@ -2858,12 +2858,6 @@ (i32.const 1) ) ) - (set_global $binary/i - (i32.mul - (get_global $binary/i) - (i32.const 1) - ) - ) (set_global $binary/i (i32.div_s (get_global $binary/i) @@ -2924,12 +2918,6 @@ (i32.const 1) ) ) - (set_global $binary/i - (i32.mul - (get_global $binary/i) - (i32.const 1) - ) - ) (set_global $binary/i (i32.rem_s (get_global $binary/i) diff --git a/tests/compiler/std/array.optimized.wat b/tests/compiler/std/array.optimized.wat index cba3c4c0..d37cdbc6 100644 --- a/tests/compiler/std/array.optimized.wat +++ b/tests/compiler/std/array.optimized.wat @@ -1994,9 +1994,9 @@ ) (set_local $2 (call "$(lib)/allocator/arena/allocate_memory" - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2010,11 +2010,11 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.load offset=4 (get_local $0) ) - (i32.const 4) + (i32.const 2) ) ) (call "$(lib)/allocator/arena/free_memory" @@ -2065,11 +2065,11 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.load offset=8 (get_local $0) ) - (i32.const 4) + (i32.const 2) ) ) (get_local $1) @@ -2102,9 +2102,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2137,9 +2137,9 @@ ) ) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2181,7 +2181,7 @@ (call $abort (i32.const 0) (i32.const 32) - (i32.const 105) + (i32.const 128) (i32.const 6) ) (unreachable) @@ -2189,9 +2189,9 @@ ) (set_local $4 (call "$(lib)/allocator/arena/allocate_memory" - (i32.mul + (i32.shl (get_local $3) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2208,9 +2208,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) (call "$(lib)/allocator/arena/free_memory" @@ -2239,9 +2239,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2625,14 +2625,14 @@ ) (i32.const 4) ) - (i32.mul + (i32.shl (i32.sub (i32.load offset=4 (get_local $0) ) (i32.const 1) ) - (i32.const 4) + (i32.const 2) ) ) (call "$(lib)/memory/set_memory" @@ -2640,14 +2640,14 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.sub (i32.load offset=4 (get_local $0) ) (i32.const 1) ) - (i32.const 4) + (i32.const 2) ) ) (i32.const 0) @@ -2689,9 +2689,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2701,9 +2701,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) (i32.load @@ -2711,9 +2711,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2723,9 +2723,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) (get_local $3) @@ -2779,9 +2779,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2856,16 +2856,16 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) (i32.add (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.add (get_local $1) (tee_local $2 @@ -2886,12 +2886,12 @@ ) ) ) - (i32.const 4) + (i32.const 2) ) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) (i32.store offset=8 diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index d3854a8a..6e7f5f7f 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -2479,7 +2479,7 @@ (call $abort (i32.const 0) (i32.const 32) - (i32.const 105) + (i32.const 128) (i32.const 6) ) (unreachable) diff --git a/tests/compiler/std/carray.optimized.wat b/tests/compiler/std/carray.optimized.wat index bf9337ec..de1d94eb 100644 --- a/tests/compiler/std/carray.optimized.wat +++ b/tests/compiler/std/carray.optimized.wat @@ -21,9 +21,9 @@ (i32.load (i32.add (get_local $0) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) ) @@ -39,9 +39,9 @@ (i32.store (i32.add (get_local $0) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) (get_local $2) diff --git a/tests/compiler/std/polyfills.optimized.wat b/tests/compiler/std/polyfills.optimized.wat index 8c118c32..4677fbc6 100644 --- a/tests/compiler/std/polyfills.optimized.wat +++ b/tests/compiler/std/polyfills.optimized.wat @@ -50,25 +50,19 @@ ) (return (i32.or - (i32.or - (i32.and - (i32.shl - (get_local $0) - (i32.const 8) - ) - (i32.const 65280) - ) - (i32.and - (i32.shr_u - (get_local $0) - (i32.const 8) - ) - (i32.const 255) + (i32.and + (i32.shl + (get_local $0) + (i32.const 8) ) + (i32.const 65280) ) (i32.and - (get_local $0) - (i32.const 0) + (i32.shr_u + (get_local $0) + (i32.const 8) + ) + (i32.const 255) ) ) ) @@ -159,34 +153,28 @@ (i32.shr_s (i32.shl (i32.or - (i32.or - (i32.shr_s - (i32.shl - (i32.and - (i32.shr_s - (i32.shl - (get_local $0) - (i32.const 24) - ) - (i32.const 16) + (i32.shr_s + (i32.shl + (i32.and + (i32.shr_s + (i32.shl + (get_local $0) + (i32.const 24) ) - (i32.const -256) + (i32.const 16) ) - (i32.const 16) + (i32.const -256) ) (i32.const 16) ) - (i32.and - (i32.shr_s - (get_local $0) - (i32.const 8) - ) - (i32.const 255) - ) + (i32.const 16) ) (i32.and - (get_local $0) - (i32.const 0) + (i32.shr_s + (get_local $0) + (i32.const 8) + ) + (i32.const 255) ) ) (i32.const 16) diff --git a/tests/compiler/std/set.optimized.wat b/tests/compiler/std/set.optimized.wat index e42eca77..419b93ff 100644 --- a/tests/compiler/std/set.optimized.wat +++ b/tests/compiler/std/set.optimized.wat @@ -1981,7 +1981,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 31) + (i32.const 33) (i32.const 4) ) (unreachable) @@ -1999,7 +1999,7 @@ (block (set_local $2 (call "$(lib)/allocator/arena/allocate_memory" - (i32.mul + (i32.shl (tee_local $3 (select (tee_local $2 @@ -2019,7 +2019,7 @@ ) ) ) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2033,11 +2033,11 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.load offset=4 (get_local $0) ) - (i32.const 4) + (i32.const 2) ) ) (call "$(lib)/allocator/arena/free_memory" @@ -2062,11 +2062,11 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.load offset=8 (get_local $0) ) - (i32.const 4) + (i32.const 2) ) ) (get_local $1) @@ -2118,9 +2118,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2153,7 +2153,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 49) + (i32.const 51) (i32.const 4) ) (unreachable) @@ -2178,9 +2178,9 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) ) @@ -2202,21 +2202,21 @@ (i32.load (get_local $0) ) - (i32.mul + (i32.shl (get_local $2) - (i32.const 4) + (i32.const 2) ) ) (i32.add (i32.load (get_local $0) ) - (i32.mul + (i32.shl (i32.add (get_local $2) (i32.const 1) ) - (i32.const 4) + (i32.const 2) ) ) (i32.sub @@ -2265,7 +2265,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 62) + (i32.const 70) (i32.const 4) ) (unreachable) diff --git a/tests/compiler/std/set.untouched.wat b/tests/compiler/std/set.untouched.wat index 67fbbcef..47f61ecb 100644 --- a/tests/compiler/std/set.untouched.wat +++ b/tests/compiler/std/set.untouched.wat @@ -2267,7 +2267,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 31) + (i32.const 33) (i32.const 4) ) (unreachable) @@ -2409,23 +2409,25 @@ (get_local $3) ) (block - (if - (i32.eq - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (get_local $2) - (i32.const 4) + (block + (if + (i32.eq + (i32.load + (i32.add + (i32.load + (get_local $0) + ) + (i32.mul + (get_local $2) + (i32.const 4) + ) ) ) + (get_local $1) + ) + (return + (i32.const 1) ) - (get_local $1) - ) - (return - (i32.const 1) ) ) (set_local $2 @@ -2457,7 +2459,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 49) + (i32.const 51) (i32.const 4) ) (unreachable) @@ -2481,33 +2483,10 @@ (get_local $3) ) (block - (if - (i32.eq - (i32.load - (i32.add - (i32.load - (get_local $0) - ) - (i32.mul - (get_local $2) - (i32.const 4) - ) - ) - ) - (get_local $1) - ) - (block - (if - (i32.lt_u - (i32.add - (get_local $2) - (i32.const 1) - ) - (i32.load offset=8 - (get_local $0) - ) - ) - (call "$(lib)/memory/move_memory" + (block + (if + (i32.eq + (i32.load (i32.add (i32.load (get_local $0) @@ -2517,41 +2496,66 @@ (i32.const 4) ) ) - (i32.add - (i32.load + ) + (get_local $1) + ) + (block + (if + (i32.lt_u + (i32.add + (get_local $2) + (i32.const 1) + ) + (i32.load offset=8 (get_local $0) ) - (i32.mul - (i32.add - (get_local $2) - (i32.const 1) - ) - (i32.const 4) - ) ) - (i32.sub - (i32.sub - (i32.load offset=8 + (call "$(lib)/memory/move_memory" + (i32.add + (i32.load (get_local $0) ) - (get_local $2) + (i32.mul + (get_local $2) + (i32.const 4) + ) + ) + (i32.add + (i32.load + (get_local $0) + ) + (i32.mul + (i32.add + (get_local $2) + (i32.const 1) + ) + (i32.const 4) + ) + ) + (i32.sub + (i32.sub + (i32.load offset=8 + (get_local $0) + ) + (get_local $2) + ) + (i32.const 1) + ) + ) + ) + (i32.store offset=8 + (get_local $0) + (i32.sub + (i32.load offset=8 + (get_local $0) ) (i32.const 1) ) ) - ) - (i32.store offset=8 - (get_local $0) - (i32.sub - (i32.load offset=8 - (get_local $0) - ) + (return (i32.const 1) ) ) - (return - (i32.const 1) - ) ) ) (set_local $2 @@ -2581,7 +2585,7 @@ (call $abort (i32.const 0) (i32.const 28) - (i32.const 62) + (i32.const 70) (i32.const 4) ) (unreachable) diff --git a/tests/compiler/std/string.optimized.wat b/tests/compiler/std/string.optimized.wat index b4ecc2c0..57b171d3 100644 --- a/tests/compiler/std/string.optimized.wat +++ b/tests/compiler/std/string.optimized.wat @@ -41,7 +41,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 38) + (i32.const 39) (i32.const 4) ) (unreachable) @@ -140,7 +140,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 166) + (i32.const 168) (i32.const 4) ) (unreachable) @@ -227,7 +227,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 103) + (i32.const 105) (i32.const 4) ) (unreachable) @@ -314,7 +314,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 144) + (i32.const 145) (i32.const 4) ) (unreachable) @@ -957,7 +957,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 469) + (i32.const 493) (i32.const 10) ) (unreachable) diff --git a/tests/compiler/std/string.untouched.wat b/tests/compiler/std/string.untouched.wat index 91414efb..c18b56d3 100644 --- a/tests/compiler/std/string.untouched.wat +++ b/tests/compiler/std/string.untouched.wat @@ -71,7 +71,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 38) + (i32.const 39) (i32.const 4) ) (unreachable) @@ -187,7 +187,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 166) + (i32.const 168) (i32.const 4) ) (unreachable) @@ -215,7 +215,7 @@ (tee_local $5 (select (tee_local $5 - (get_local $2) + (get_local $3) ) (tee_local $6 (i32.const 0) @@ -294,7 +294,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 103) + (i32.const 105) (i32.const 4) ) (unreachable) @@ -400,7 +400,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 144) + (i32.const 145) (i32.const 4) ) (unreachable) @@ -467,31 +467,33 @@ (get_local $4) ) (block - (if - (i32.eqz - (call "$(lib)/memory/compare_memory" - (i32.add + (block + (if + (i32.eqz + (call "$(lib)/memory/compare_memory" (i32.add - (get_local $0) + (i32.add + (get_local $0) + (i32.const 4) + ) + (i32.shl + (get_local $9) + (i32.const 1) + ) + ) + (i32.add + (get_local $1) (i32.const 4) ) (i32.shl - (get_local $9) + (get_local $8) (i32.const 1) ) ) - (i32.add - (get_local $1) - (i32.const 4) - ) - (i32.shl - (get_local $8) - (i32.const 1) - ) ) - ) - (return - (get_local $9) + (return + (get_local $9) + ) ) ) (set_local $9 @@ -1142,7 +1144,7 @@ (call $abort (i32.const 0) (i32.const 72) - (i32.const 469) + (i32.const 493) (i32.const 10) ) (unreachable) diff --git a/tests/compiler/tlsf.optimized.wat b/tests/compiler/tlsf.optimized.wat index 4b727238..cfac8cdb 100644 --- a/tests/compiler/tlsf.optimized.wat +++ b/tests/compiler/tlsf.optimized.wat @@ -81,9 +81,9 @@ (get_local $0) (i32.const 20) ) - (i32.mul + (i32.shl (get_local $1) - (i32.const 4) + (i32.const 2) ) ) (get_local $2) @@ -126,15 +126,15 @@ (get_local $0) (i32.const 112) ) - (i32.mul + (i32.shl (i32.add - (i32.mul + (i32.shl (get_local $1) - (i32.const 32) + (i32.const 5) ) (get_local $2) ) - (i32.const 4) + (i32.const 2) ) ) (get_local $3) diff --git a/tslint.json b/tslint.json index f87e976c..c899ed11 100644 --- a/tslint.json +++ b/tslint.json @@ -45,7 +45,7 @@ "no-trailing-whitespace": true, "no-unbound-method": true, "no-unsafe-any": true, - "no-unused-variable": true, + "no-unused-variable": [true, {"ignore-pattern": "^_"}], "no-void-expression": true, "object-literal-shorthand": [ true, "never" ], "prefer-method-signature": true,