xbintsc 0.5.23 → 0.5.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +11 -2
- package/README.md +47 -16
- package/README.zh-CN.md +21 -2
- package/dist/scripts/support-matrix.d.ts +18 -0
- package/dist/scripts/support-matrix.js +141 -0
- package/dist/scripts/support-matrix.js.map +1 -0
- package/dist/src/ast/common.d.ts +2 -2
- package/dist/src/ast/declarations.d.ts +7 -1
- package/dist/src/ast/expressions.d.ts +5 -0
- package/dist/src/ast/kinds.d.ts +2 -0
- package/dist/src/ast/kinds.js +2 -0
- package/dist/src/ast/kinds.js.map +1 -1
- package/dist/src/binder/binder.d.ts +2 -1
- package/dist/src/binder/binder.js +2 -0
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/declarations.d.ts +9 -0
- package/dist/src/binder/declarations.js +64 -0
- package/dist/src/binder/declarations.js.map +1 -1
- package/dist/src/binder/references.js +99 -4
- package/dist/src/binder/references.js.map +1 -1
- package/dist/src/binder/types.d.ts +32 -0
- package/dist/src/binder/types.js.map +1 -1
- package/dist/src/canonical.d.ts +29 -0
- package/dist/src/canonical.js +35 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/checker/assignability.d.ts +13 -0
- package/dist/src/checker/assignability.js +146 -0
- package/dist/src/checker/assignability.js.map +1 -0
- package/dist/src/checker/calls.d.ts +13 -0
- package/dist/src/checker/calls.js +127 -0
- package/dist/src/checker/calls.js.map +1 -0
- package/dist/src/checker/checker.d.ts +26 -0
- package/dist/src/checker/checker.js +31 -0
- package/dist/src/checker/checker.js.map +1 -0
- package/dist/src/checker/declarations.d.ts +9 -0
- package/dist/src/checker/declarations.js +15 -0
- package/dist/src/checker/declarations.js.map +1 -0
- package/dist/src/checker/flow.d.ts +21 -0
- package/dist/src/checker/flow.js +241 -0
- package/dist/src/checker/flow.js.map +1 -0
- package/dist/src/checker/globals.d.ts +9 -0
- package/dist/src/checker/globals.js +29 -0
- package/dist/src/checker/globals.js.map +1 -0
- package/dist/src/checker/source.d.ts +38 -0
- package/dist/src/checker/source.js +48 -0
- package/dist/src/checker/source.js.map +1 -0
- package/dist/src/checker/type-infer.d.ts +18 -0
- package/dist/src/checker/type-infer.js +173 -0
- package/dist/src/checker/type-infer.js.map +1 -0
- package/dist/src/checker/type-model.d.ts +73 -0
- package/dist/src/checker/type-model.js +151 -0
- package/dist/src/checker/type-model.js.map +1 -0
- package/dist/src/checker/type-system.d.ts +58 -0
- package/dist/src/checker/type-system.js +569 -0
- package/dist/src/checker/type-system.js.map +1 -0
- package/dist/src/checker/typecheck-types.d.ts +22 -0
- package/dist/src/checker/typecheck-types.js +109 -0
- package/dist/src/checker/typecheck-types.js.map +1 -0
- package/dist/src/checker/typecheck.d.ts +62 -0
- package/dist/src/checker/typecheck.js +574 -0
- package/dist/src/checker/typecheck.js.map +1 -0
- package/dist/src/checker/undefined.d.ts +14 -0
- package/dist/src/checker/undefined.js +32 -0
- package/dist/src/checker/undefined.js.map +1 -0
- package/dist/src/checker/walk.d.ts +10 -0
- package/dist/src/checker/walk.js +15 -0
- package/dist/src/checker/walk.js.map +1 -0
- package/dist/src/cli/help.d.ts +7 -0
- package/dist/src/cli/help.js +64 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hints.js +2 -1
- package/dist/src/cli/hints.js.map +1 -1
- package/dist/src/cli/main.js +12 -48
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.js +8 -8
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/invocation.js +9 -4
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
- package/dist/src/codegen/generator/calls/super.d.ts +9 -1
- package/dist/src/codegen/generator/calls/super.js +56 -5
- package/dist/src/codegen/generator/calls/super.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +13 -2
- package/dist/src/codegen/generator/context.js +25 -19
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/debug.js +2 -1
- package/dist/src/codegen/generator/debug.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.d.ts +4 -1
- package/dist/src/codegen/generator/expressions/primary.js +68 -8
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/generator.js +11 -1
- package/dist/src/codegen/generator/generator.js.map +1 -1
- package/dist/src/codegen/generator/module.d.ts +3 -0
- package/dist/src/codegen/generator/module.js +116 -26
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.d.ts +11 -1
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/variables.js +26 -7
- package/dist/src/codegen/generator/statements/variables.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +2 -0
- package/dist/src/codegen/generator/tables.js +4 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/build-key.d.ts +2 -0
- package/dist/src/driver/build-key.js +1 -0
- package/dist/src/driver/build-key.js.map +1 -1
- package/dist/src/driver/bundler/graph.js +5 -1
- package/dist/src/driver/bundler/graph.js.map +1 -1
- package/dist/src/driver/bundler/merge.js +16 -1
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/bundler/types.d.ts +12 -0
- package/dist/src/driver/compiler.d.ts +1 -1
- package/dist/src/driver/compiler.js +3 -0
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/fingerprint.js +2 -1
- package/dist/src/driver/fingerprint.js.map +1 -1
- package/dist/src/driver/frontend.d.ts +8 -6
- package/dist/src/driver/frontend.js +4 -0
- package/dist/src/driver/frontend.js.map +1 -1
- package/dist/src/driver/options.d.ts +6 -0
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/src/extensions/gui/css.d.ts +26 -0
- package/dist/src/extensions/gui/css.js +100 -0
- package/dist/src/extensions/gui/css.js.map +1 -0
- package/dist/src/extensions/gui/html.js +28 -7
- package/dist/src/extensions/gui/html.js.map +1 -1
- package/dist/src/extensions/gui/index.js +79 -2
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/gui/three.d.ts +16 -0
- package/dist/src/extensions/gui/three.js +22 -0
- package/dist/src/extensions/gui/three.js.map +1 -0
- package/dist/src/extensions/media/index.d.ts +6 -5
- package/dist/src/extensions/media/index.js +12 -14
- package/dist/src/extensions/media/index.js.map +1 -1
- package/dist/src/extensions/registry.d.ts +38 -0
- package/dist/src/extensions/registry.js +10 -0
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +7 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/expressions.js +14 -1
- package/dist/src/parser/expressions.js.map +1 -1
- package/dist/src/parser/literals.js +6 -2
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/tests/binder/binder.test.js +29 -0
- package/dist/tests/binder/binder.test.js.map +1 -1
- package/dist/tests/canonical.test.d.ts +1 -0
- package/dist/tests/canonical.test.js +19 -0
- package/dist/tests/canonical.test.js.map +1 -0
- package/dist/tests/checker/checker.test.d.ts +1 -0
- package/dist/tests/checker/checker.test.js +245 -0
- package/dist/tests/checker/checker.test.js.map +1 -0
- package/dist/tests/cli/check.test.js +20 -0
- package/dist/tests/cli/check.test.js.map +1 -1
- package/dist/tests/conformance/matrix.test.d.ts +6 -0
- package/dist/tests/conformance/matrix.test.js +23 -0
- package/dist/tests/conformance/matrix.test.js.map +1 -0
- package/dist/tests/conformance/test262/manifest.d.ts +115 -0
- package/dist/tests/conformance/test262/manifest.js +257 -0
- package/dist/tests/conformance/test262/manifest.js.map +1 -0
- package/dist/tests/conformance/test262.test.d.ts +11 -0
- package/dist/tests/conformance/test262.test.js +74 -0
- package/dist/tests/conformance/test262.test.js.map +1 -0
- package/dist/tests/docs/structure.test.js +9 -11
- package/dist/tests/docs/structure.test.js.map +1 -1
- package/dist/tests/e2e/child-process.test.js +3 -2
- package/dist/tests/e2e/child-process.test.js.map +1 -1
- package/dist/tests/e2e/compile-builtins.test.js +45 -0
- package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
- package/dist/tests/e2e/compile-objects-classes.test.js +77 -0
- package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
- package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
- package/dist/tests/e2e/differential-syntax.test.js +95 -0
- package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
- package/dist/tests/e2e/differential-values.test.js +15 -0
- package/dist/tests/e2e/differential-values.test.js.map +1 -1
- package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
- package/dist/tests/e2e/gui-browser.test.js +163 -0
- package/dist/tests/e2e/gui-browser.test.js.map +1 -0
- package/dist/tests/e2e/gui-effects.test.d.ts +6 -0
- package/dist/tests/e2e/gui-effects.test.js +262 -0
- package/dist/tests/e2e/gui-effects.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-browser.test.js +2 -2
- package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-canvas.test.js +5 -4
- package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-svg.test.js +4 -3
- package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-webgl.test.d.ts +10 -0
- package/dist/tests/e2e/gui-example-webgl.test.js +75 -0
- package/dist/tests/e2e/gui-example-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-webgl2.test.d.ts +8 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js +72 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js.map +1 -0
- package/dist/tests/e2e/gui-example.test.js +4 -3
- package/dist/tests/e2e/gui-example.test.js.map +1 -1
- package/dist/tests/e2e/gui-helpers.js +4 -3
- package/dist/tests/e2e/gui-helpers.js.map +1 -1
- package/dist/tests/e2e/gui-layout.test.js +48 -0
- package/dist/tests/e2e/gui-layout.test.js.map +1 -1
- package/dist/tests/e2e/gui-media.test.js +10 -8
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/gui-webgl.test.d.ts +11 -0
- package/dist/tests/e2e/gui-webgl.test.js +179 -0
- package/dist/tests/e2e/gui-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-webgl2.test.d.ts +10 -0
- package/dist/tests/e2e/gui-webgl2.test.js +238 -0
- package/dist/tests/e2e/gui-webgl2.test.js.map +1 -0
- package/dist/tests/e2e/harness.d.ts +9 -0
- package/dist/tests/e2e/harness.js +14 -2
- package/dist/tests/e2e/harness.js.map +1 -1
- package/dist/tests/e2e/native-extensions.test.js +2 -1
- package/dist/tests/e2e/native-extensions.test.js.map +1 -1
- package/dist/tests/e2e/property-descriptors.test.js +20 -0
- package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
- package/dist/tests/e2e/unicode-output.test.js +5 -3
- package/dist/tests/e2e/unicode-output.test.js.map +1 -1
- package/dist/tests/e2e/weak-collections.test.js +16 -2
- package/dist/tests/e2e/weak-collections.test.js.map +1 -1
- package/dist/tests/extensions/gui.test.js +41 -0
- package/dist/tests/extensions/gui.test.js.map +1 -1
- package/dist/tests/extensions/media.test.js +7 -3
- package/dist/tests/extensions/media.test.js.map +1 -1
- package/dist/tests/helpers.d.ts +1 -0
- package/dist/tests/helpers.js +1 -0
- package/dist/tests/helpers.js.map +1 -1
- package/dist/tests/parser/declarations.test.js +20 -0
- package/dist/tests/parser/declarations.test.js.map +1 -1
- package/dist/tests/parser/expressions.test.js +36 -0
- package/dist/tests/parser/expressions.test.js.map +1 -1
- package/dist/tests/platform.d.ts +32 -0
- package/dist/tests/platform.js +40 -0
- package/dist/tests/platform.js.map +1 -0
- package/dist/tests/platform.test.d.ts +12 -0
- package/dist/tests/platform.test.js +51 -0
- package/dist/tests/platform.test.js.map +1 -0
- package/dist/tests/version.test.js +4 -4
- package/dist/tests/version.test.js.map +1 -1
- package/doc/ai/README.md +10 -4
- package/doc/ai/build-recipe.md +1 -0
- package/doc/ai/cli.md +17 -5
- package/doc/ai/contributing.md +59 -2
- package/doc/ai/extensions.md +38 -7
- package/doc/ai/language-support.md +25 -16
- package/doc/ai/troubleshooting.md +12 -8
- package/doc/ai/zh-CN/README.md +9 -4
- package/doc/ai/zh-CN/build-recipe.md +1 -0
- package/doc/ai/zh-CN/cli.md +13 -3
- package/doc/ai/zh-CN/contributing.md +49 -3
- package/doc/ai/zh-CN/extensions.md +33 -6
- package/doc/ai/zh-CN/language-support.md +23 -14
- package/doc/ai/zh-CN/troubleshooting.md +10 -6
- package/doc/gui/api.md +47 -1
- package/doc/gui/build.md +72 -16
- package/doc/gui/canvas.md +11 -3
- package/doc/gui/dom.md +33 -18
- package/doc/gui/known-issues.md +58 -15
- package/doc/gui/layout.md +18 -0
- package/doc/gui/media.md +17 -13
- package/doc/gui/rendering.md +50 -3
- package/doc/gui/runtime.md +18 -0
- package/doc/gui/webgl.md +256 -0
- package/doc/gui-scripts.md +7 -0
- package/doc/gui.md +108 -17
- package/doc/implemented/binder.md +2 -0
- package/doc/implemented/checker.md +117 -0
- package/doc/implemented/cli.md +13 -1
- package/doc/implemented/codegen.md +3 -2
- package/doc/implemented/driver.md +2 -2
- package/doc/implemented/operators.md +2 -1
- package/doc/implemented/parser.md +3 -2
- package/doc/implemented/pipeline.md +8 -1
- package/doc/implemented/stdlib.md +2 -1
- package/doc/implemented/tests.md +3 -1
- package/doc/implemented.md +2 -0
- package/doc/npm-package.md +419 -0
- package/doc/requirements.md +22 -10
- package/doc/support-matrix.md +83 -0
- package/doc/unimplemented/classes.md +3 -0
- package/doc/unimplemented/deviations.md +3 -2
- package/doc/unimplemented/toolchain.md +1 -1
- package/doc/unimplemented/types.md +24 -8
- package/doc/unimplemented.md +1 -1
- package/doc/zh-CN/gui/api.md +43 -1
- package/doc/zh-CN/gui/build.md +64 -15
- package/doc/zh-CN/gui/canvas.md +9 -2
- package/doc/zh-CN/gui/dom.md +20 -7
- package/doc/zh-CN/gui/known-issues.md +46 -13
- package/doc/zh-CN/gui/layout.md +14 -0
- package/doc/zh-CN/gui/media.md +15 -11
- package/doc/zh-CN/gui/rendering.md +41 -4
- package/doc/zh-CN/gui/runtime.md +16 -0
- package/doc/zh-CN/gui/webgl.md +115 -0
- package/doc/zh-CN/gui-scripts.md +5 -0
- package/doc/zh-CN/gui.md +89 -14
- package/doc/zh-CN/implemented/binder.md +2 -0
- package/doc/zh-CN/implemented/checker.md +99 -0
- package/doc/zh-CN/implemented/cli.md +12 -1
- package/doc/zh-CN/implemented/codegen.md +3 -2
- package/doc/zh-CN/implemented/driver.md +2 -2
- package/doc/zh-CN/implemented/operators.md +1 -1
- package/doc/zh-CN/implemented/parser.md +3 -2
- package/doc/zh-CN/implemented/pipeline.md +3 -1
- package/doc/zh-CN/implemented/stdlib.md +2 -1
- package/doc/zh-CN/implemented/tests.md +3 -1
- package/doc/zh-CN/implemented.md +2 -0
- package/doc/zh-CN/npm-package.md +394 -0
- package/doc/zh-CN/post/announce.md +47 -47
- package/doc/zh-CN/requirements.md +16 -7
- package/doc/zh-CN/support-matrix.md +82 -0
- package/doc/zh-CN/unimplemented/classes.md +3 -0
- package/doc/zh-CN/unimplemented/deviations.md +3 -2
- package/doc/zh-CN/unimplemented/toolchain.md +1 -1
- package/doc/zh-CN/unimplemented/types.md +16 -6
- package/doc/zh-CN/unimplemented.md +1 -1
- package/llms.txt +6 -1
- package/package.json +2 -1
- package/runtime/ext_gui/audio.cpp +316 -0
- package/runtime/ext_gui/browser.cpp +573 -0
- package/runtime/ext_gui/browser_escape.cpp +85 -0
- package/runtime/ext_gui/browser_loop.cpp +83 -0
- package/runtime/ext_gui/canvas.cpp +12 -21
- package/runtime/ext_gui/canvas_internal.h +10 -0
- package/runtime/ext_gui/canvas_raster.cpp +79 -1
- package/runtime/ext_gui/clip_values.cpp +246 -0
- package/runtime/ext_gui/css.cpp +94 -0
- package/runtime/ext_gui/css.h +22 -1
- package/runtime/ext_gui/css_match.cpp +3 -0
- package/runtime/ext_gui/css_selector.cpp +9 -0
- package/runtime/ext_gui/css_sheet.cpp +89 -45
- package/runtime/ext_gui/document.cpp +4 -1
- package/runtime/ext_gui/document.h +2 -0
- package/runtime/ext_gui/dom.h +16 -0
- package/runtime/ext_gui/dom_api.cpp +37 -0
- package/runtime/ext_gui/dom_api_canvas.cpp +17 -80
- package/runtime/ext_gui/dom_api_canvas_extra.cpp +130 -1
- package/runtime/ext_gui/dom_api_canvas_pending.cpp +41 -0
- package/runtime/ext_gui/dom_api_document.cpp +96 -5
- package/runtime/ext_gui/dom_api_events.cpp +20 -0
- package/runtime/ext_gui/dom_api_internal.h +278 -0
- package/runtime/ext_gui/dom_api_proto.cpp +6 -0
- package/runtime/ext_gui/dom_api_webgl.cpp +376 -0
- package/runtime/ext_gui/dom_api_webgl2.cpp +434 -0
- package/runtime/ext_gui/dom_api_webgl2_draw.cpp +269 -0
- package/runtime/ext_gui/dom_api_webgl_buffer.cpp +212 -0
- package/runtime/ext_gui/dom_api_webgl_rt.h +30 -0
- package/runtime/ext_gui/dom_api_webgl_shader.cpp +443 -0
- package/runtime/ext_gui/dom_api_webgl_state.cpp +444 -0
- package/runtime/ext_gui/dom_api_webgl_texture.cpp +445 -0
- package/runtime/ext_gui/effect_values.cpp +312 -0
- package/runtime/ext_gui/gradient_values.cpp +476 -0
- package/runtime/ext_gui/grid_values.cpp +230 -0
- package/runtime/ext_gui/gui.cpp +90 -23
- package/runtime/ext_gui/gui_canvas.cpp +50 -2
- package/runtime/ext_gui/gui_engine.h +71 -0
- package/runtime/ext_gui/gui_events.cpp +4 -1
- package/runtime/ext_gui/gui_media.cpp +1 -1
- package/runtime/ext_gui/gui_webgl.cpp +83 -0
- package/runtime/ext_gui/layout.cpp +21 -0
- package/runtime/ext_gui/layout_flow.cpp +81 -4
- package/runtime/ext_gui/layout_flow_internal.h +31 -0
- package/runtime/ext_gui/layout_grid.cpp +374 -0
- package/runtime/ext_gui/media.h +1 -1
- package/runtime/ext_gui/media_api.h +2 -2
- package/runtime/ext_gui/media_query.cpp +211 -0
- package/runtime/ext_gui/paint.cpp +111 -77
- package/runtime/ext_gui/paint.h +33 -3
- package/runtime/ext_gui/paint_background.cpp +229 -0
- package/runtime/ext_gui/paint_clip.cpp +268 -0
- package/runtime/ext_gui/paint_effects.cpp +324 -0
- package/runtime/ext_gui/paint_internal.h +85 -0
- package/runtime/ext_gui/renderer.cpp +8 -31
- package/runtime/ext_gui/renderer_clip.cpp +196 -0
- package/runtime/ext_gui/renderer_image.cpp +13 -8
- package/runtime/ext_gui/renderer_internal.h +15 -8
- package/runtime/ext_gui/renderer_text.cpp +6 -31
- package/runtime/ext_gui/style.cpp +343 -20
- package/runtime/ext_gui/style.h +144 -3
- package/runtime/ext_gui/style_print.cpp +134 -1
- package/runtime/ext_gui/style_values.cpp +152 -126
- package/runtime/ext_gui/style_values_internal.h +35 -0
- package/runtime/ext_gui/webgl.h +466 -0
- package/runtime/ext_gui/webgl2_constants.h +274 -0
- package/runtime/ext_gui/webgl_buffer.cpp +565 -0
- package/runtime/ext_gui/webgl_constants.h +317 -0
- package/runtime/ext_gui/webgl_context.cpp +466 -0
- package/runtime/ext_gui/webgl_draw.cpp +495 -0
- package/runtime/ext_gui/webgl_glsl.h +125 -0
- package/runtime/ext_gui/webgl_glsl_compile.cpp +431 -0
- package/runtime/ext_gui/webgl_glsl_rewrite.cpp +349 -0
- package/runtime/ext_gui/webgl_glsl_scan.cpp +581 -0
- package/runtime/ext_gui/webgl_msl.cpp +62 -0
- package/runtime/ext_gui/webgl_msl.h +33 -0
- package/runtime/ext_gui/webgl_pipeline.cpp +274 -0
- package/runtime/ext_gui/webgl_program_internal.h +18 -0
- package/runtime/ext_gui/webgl_shader.cpp +582 -0
- package/runtime/ext_gui/webgl_texture.cpp +293 -0
- package/runtime/ext_gui/webgl_uniform.cpp +167 -0
- package/runtime/ext_gui/webgl_webgl2.cpp +224 -0
- package/runtime/ext_gui/window.cpp +9 -0
- package/runtime/ext_media/media.cpp +1 -1
- package/runtime/ext_media/media_bridge.c +9 -3
- package/runtime/ext_node/path/path.c +7 -7
- package/runtime/ext_node/url/url.c +4 -2
- package/runtime/rt.h +15 -0
- package/runtime/rt_internal.h +1 -0
- package/runtime/xt_constructors.c +2 -1
- package/runtime/xt_containers/access.inc +8 -0
- package/runtime/xt_containers/objects.inc +22 -2
- package/runtime/xt_io/exception.inc +4 -2
- package/runtime/xt_regex/api.inc +2 -0
- package/runtime/xt_regex/matcher.inc +16 -3
- package/runtime/xt_regex/parser.inc +8 -2
- package/runtime/xt_regex/types.inc +3 -0
- package/runtime/xt_stdlib/math.inc +62 -0
- package/runtime/xt_stdlib2/date.inc +7 -1
- package/runtime/xt_stdlib2/objects.inc +14 -0
- package/runtime/xt_stdlib2/regexp-match.inc +60 -21
- package/runtime/xt_stdlib2/regexp.inc +1 -0
- package/runtime/xt_typed_array.c +1 -1
- package/scripts/build-gui.ts +90 -3
- package/scripts/build-media.ts +323 -58
- package/scripts/setup-vs-toolchain.ps1 +152 -0
- package/scripts/support-matrix.ts +167 -0
- package/src/ast/common.ts +2 -0
- package/src/ast/declarations.ts +12 -1
- package/src/ast/expressions.ts +6 -0
- package/src/ast/kinds.ts +2 -0
- package/src/binder/binder.ts +3 -0
- package/src/binder/declarations.ts +70 -0
- package/src/binder/references.ts +97 -4
- package/src/binder/types.ts +30 -0
- package/src/canonical.ts +37 -0
- package/src/checker/assignability.ts +134 -0
- package/src/checker/calls.ts +135 -0
- package/src/checker/checker.ts +47 -0
- package/src/checker/declarations.ts +26 -0
- package/src/checker/flow.ts +236 -0
- package/src/checker/globals.ts +40 -0
- package/src/checker/source.ts +53 -0
- package/src/checker/type-infer.ts +185 -0
- package/src/checker/type-model.ts +212 -0
- package/src/checker/type-system.ts +578 -0
- package/src/checker/typecheck-types.ts +112 -0
- package/src/checker/typecheck.ts +586 -0
- package/src/checker/undefined.ts +43 -0
- package/src/checker/walk.ts +16 -0
- package/src/cli/help.ts +65 -0
- package/src/cli/hints.ts +2 -1
- package/src/cli/main.ts +12 -49
- package/src/codegen/generator/calls/access.ts +8 -8
- package/src/codegen/generator/calls/invocation.ts +8 -5
- package/src/codegen/generator/calls/super.ts +67 -5
- package/src/codegen/generator/context.ts +31 -19
- package/src/codegen/generator/debug.ts +2 -1
- package/src/codegen/generator/expressions/primary.ts +84 -13
- package/src/codegen/generator/generator.ts +11 -1
- package/src/codegen/generator/module.ts +115 -24
- package/src/codegen/generator/state.ts +11 -1
- package/src/codegen/generator/statements/variables.ts +26 -6
- package/src/codegen/generator/tables.ts +5 -0
- package/src/driver/build-key.ts +3 -0
- package/src/driver/bundler/graph.ts +6 -2
- package/src/driver/bundler/merge.ts +14 -1
- package/src/driver/bundler/types.ts +13 -0
- package/src/driver/compiler.ts +4 -1
- package/src/driver/fingerprint.ts +2 -1
- package/src/driver/frontend.ts +13 -2
- package/src/driver/options.ts +6 -0
- package/src/driver/version.ts +1 -1
- package/src/extensions/gui/css.ts +113 -0
- package/src/extensions/gui/html.ts +31 -11
- package/src/extensions/gui/index.ts +81 -2
- package/src/extensions/gui/three.ts +25 -0
- package/src/extensions/media/index.ts +13 -16
- package/src/extensions/registry.ts +48 -0
- package/src/index.ts +1 -0
- package/src/parser/declarations/classes.ts +7 -0
- package/src/parser/expressions.ts +13 -1
- package/src/parser/literals.ts +6 -2
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call arity: `f(1)` where `f` declares two required parameters.
|
|
3
|
+
*
|
|
4
|
+
* Only calls whose callee the checker can resolve without inference are
|
|
5
|
+
* checked: a direct identifier bound to a function declaration, or to a
|
|
6
|
+
* `const` initialised with a function expression / arrow. Methods, imports,
|
|
7
|
+
* first-class re-exports and reassigned bindings are left alone — guessing
|
|
8
|
+
* there is how a checker produces false positives.
|
|
9
|
+
*/
|
|
10
|
+
import { SyntaxKind, } from "../ast/nodes.js";
|
|
11
|
+
import { SymbolKind } from "../binder/binder.js";
|
|
12
|
+
import { DiagnosticCode } from "../diagnostics/diagnostic.js";
|
|
13
|
+
import { ASSIGNMENT_OPERATORS } from "../codegen/generator/tables.js";
|
|
14
|
+
import { fileNameOf, isUntypedNode } from "./source.js";
|
|
15
|
+
import { walk } from "./walk.js";
|
|
16
|
+
function arityOf(fn) {
|
|
17
|
+
const parameters = fn.node.parameters;
|
|
18
|
+
if (!parameters)
|
|
19
|
+
return undefined;
|
|
20
|
+
let required = 0;
|
|
21
|
+
let max = 0;
|
|
22
|
+
for (const parameter of parameters) {
|
|
23
|
+
if (parameter.dotDotDotToken)
|
|
24
|
+
return { required, max: Number.POSITIVE_INFINITY };
|
|
25
|
+
max++;
|
|
26
|
+
// A `this:` parameter is a type-only declaration: it is erased and never
|
|
27
|
+
// occupies an argument slot.
|
|
28
|
+
if (parameter.name.kind === SyntaxKind.Identifier && parameter.name.text === "this") {
|
|
29
|
+
max--;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (!parameter.questionToken && !parameter.initializer)
|
|
33
|
+
required = max;
|
|
34
|
+
}
|
|
35
|
+
return { required, max };
|
|
36
|
+
}
|
|
37
|
+
/** Symbols written after their declaration (so their signature can change). */
|
|
38
|
+
function collectAssignedSymbols(sourceFile, binding) {
|
|
39
|
+
const assigned = new Set();
|
|
40
|
+
walk(sourceFile, (node) => {
|
|
41
|
+
if (node.kind !== SyntaxKind.BinaryExpression)
|
|
42
|
+
return;
|
|
43
|
+
const binary = node;
|
|
44
|
+
if (!ASSIGNMENT_OPERATORS.has(binary.operator))
|
|
45
|
+
return;
|
|
46
|
+
if (binary.left.kind !== SyntaxKind.Identifier)
|
|
47
|
+
return;
|
|
48
|
+
const symbol = binding.symbolOfIdentifier.get(binary.left);
|
|
49
|
+
if (symbol)
|
|
50
|
+
assigned.add(symbol.id);
|
|
51
|
+
});
|
|
52
|
+
return assigned;
|
|
53
|
+
}
|
|
54
|
+
function resolveCallee(binding, assigned, callee) {
|
|
55
|
+
if (callee.kind !== SyntaxKind.Identifier)
|
|
56
|
+
return undefined;
|
|
57
|
+
const symbol = binding.symbolOfIdentifier.get(callee);
|
|
58
|
+
if (!symbol || symbol.declarations.length !== 1 || assigned.has(symbol.id))
|
|
59
|
+
return undefined;
|
|
60
|
+
if (symbol.kind === SymbolKind.Function) {
|
|
61
|
+
return binding.functionOfNode.get(symbol.declarations[0]);
|
|
62
|
+
}
|
|
63
|
+
if (symbol.kind === SymbolKind.Const) {
|
|
64
|
+
const declaration = symbol.declarations[0];
|
|
65
|
+
if (declaration.kind !== SyntaxKind.VariableDeclaration)
|
|
66
|
+
return undefined;
|
|
67
|
+
const initializer = declaration.initializer;
|
|
68
|
+
if (!initializer)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (initializer.kind !== SyntaxKind.ArrowFunction && initializer.kind !== SyntaxKind.FunctionExpression) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return binding.functionOfNode.get(initializer);
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
function plural(count) {
|
|
78
|
+
return count === 1 ? "argument" : "arguments";
|
|
79
|
+
}
|
|
80
|
+
function expected(arity) {
|
|
81
|
+
if (arity.max === Number.POSITIVE_INFINITY)
|
|
82
|
+
return `at least ${arity.required} ${plural(arity.required)}`;
|
|
83
|
+
if (arity.required === arity.max)
|
|
84
|
+
return `${arity.required} ${plural(arity.required)}`;
|
|
85
|
+
return `${arity.required}-${arity.max} ${plural(arity.max)}`;
|
|
86
|
+
}
|
|
87
|
+
export function checkCallArity(sourceFile, binding, diagnostics) {
|
|
88
|
+
const assigned = collectAssignedSymbols(sourceFile, binding);
|
|
89
|
+
/* `function f() { return arguments.length; }` is a declared-zero-parameter
|
|
90
|
+
* function that legitimately accepts any number of arguments; its parameter
|
|
91
|
+
* list is not the whole signature. */
|
|
92
|
+
const argumentsUsers = new Map();
|
|
93
|
+
const usesArguments = (fn) => {
|
|
94
|
+
const cached = argumentsUsers.get(fn.id);
|
|
95
|
+
if (cached !== undefined)
|
|
96
|
+
return cached;
|
|
97
|
+
let found = false;
|
|
98
|
+
walk(fn.node, (node) => {
|
|
99
|
+
if (node.kind === SyntaxKind.Identifier && node.text === "arguments")
|
|
100
|
+
found = true;
|
|
101
|
+
});
|
|
102
|
+
argumentsUsers.set(fn.id, found);
|
|
103
|
+
return found;
|
|
104
|
+
};
|
|
105
|
+
walk(sourceFile, (node) => {
|
|
106
|
+
if (node.kind !== SyntaxKind.CallExpression)
|
|
107
|
+
return;
|
|
108
|
+
if (isUntypedNode(sourceFile, node))
|
|
109
|
+
return;
|
|
110
|
+
const call = node;
|
|
111
|
+
if (call.optional)
|
|
112
|
+
return;
|
|
113
|
+
if (call.arguments.some((argument) => argument.kind === SyntaxKind.SpreadElement))
|
|
114
|
+
return;
|
|
115
|
+
const fn = resolveCallee(binding, assigned, call.expression);
|
|
116
|
+
if (!fn || fn.isModule || usesArguments(fn))
|
|
117
|
+
return;
|
|
118
|
+
const arity = arityOf(fn);
|
|
119
|
+
if (!arity)
|
|
120
|
+
return;
|
|
121
|
+
const argc = call.arguments.length;
|
|
122
|
+
if (argc >= arity.required && argc <= arity.max)
|
|
123
|
+
return;
|
|
124
|
+
diagnostics.error(DiagnosticCode.ArgumentCountMismatch, `Expected ${expected(arity)}, but got ${argc}.`, call, fileNameOf(sourceFile, call));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../src/checker/calls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opt-out semantic checker (`--check` / `--no-check`).
|
|
3
|
+
*
|
|
4
|
+
* It runs after binding and before code generation. The first three passes are
|
|
5
|
+
* inference-free:
|
|
6
|
+
*
|
|
7
|
+
* 1. identifier references with no declaration and no runtime global,
|
|
8
|
+
* 2. same-scope declarations that cannot merge (`let x` twice, ...),
|
|
9
|
+
* 3. calls whose argument count cannot match a locally-visible signature.
|
|
10
|
+
*
|
|
11
|
+
* The fourth pass uses a deliberately small structural type model to check
|
|
12
|
+
* assignability, property existence and simple flow narrowing. It understands
|
|
13
|
+
* annotations, interfaces, classes, arrays, functions, unions and simple
|
|
14
|
+
* generics; anything else is `any`, so unsupported syntax can hide a bug but
|
|
15
|
+
* never reject working code.
|
|
16
|
+
*/
|
|
17
|
+
import type { SourceFileNode } from "../ast/nodes.js";
|
|
18
|
+
import type { BindResult } from "../binder/binder.js";
|
|
19
|
+
import type { DiagnosticBag } from "../diagnostics/diagnostic.js";
|
|
20
|
+
export interface CheckOptions {
|
|
21
|
+
/** Globals supplied by the registered extensions (`print`, `__registerScript`, ...). */
|
|
22
|
+
readonly builtins?: Readonly<Record<string, unknown>>;
|
|
23
|
+
/** Global values supplied by the registered extensions (`window`, `document`). */
|
|
24
|
+
readonly globalValues?: Readonly<Record<string, unknown>>;
|
|
25
|
+
}
|
|
26
|
+
export declare function checkProgram(sourceFile: SourceFileNode, binding: BindResult, diagnostics: DiagnosticBag, options?: CheckOptions): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opt-out semantic checker (`--check` / `--no-check`).
|
|
3
|
+
*
|
|
4
|
+
* It runs after binding and before code generation. The first three passes are
|
|
5
|
+
* inference-free:
|
|
6
|
+
*
|
|
7
|
+
* 1. identifier references with no declaration and no runtime global,
|
|
8
|
+
* 2. same-scope declarations that cannot merge (`let x` twice, ...),
|
|
9
|
+
* 3. calls whose argument count cannot match a locally-visible signature.
|
|
10
|
+
*
|
|
11
|
+
* The fourth pass uses a deliberately small structural type model to check
|
|
12
|
+
* assignability, property existence and simple flow narrowing. It understands
|
|
13
|
+
* annotations, interfaces, classes, arrays, functions, unions and simple
|
|
14
|
+
* generics; anything else is `any`, so unsupported syntax can hide a bug but
|
|
15
|
+
* never reject working code.
|
|
16
|
+
*/
|
|
17
|
+
import { checkCallArity } from "./calls.js";
|
|
18
|
+
import { reportDeclarationConflicts } from "./declarations.js";
|
|
19
|
+
import { checkTypes } from "./typecheck.js";
|
|
20
|
+
import { checkUnresolvedNames } from "./undefined.js";
|
|
21
|
+
export function checkProgram(sourceFile, binding, diagnostics, options = {}) {
|
|
22
|
+
const builtinNames = new Set([
|
|
23
|
+
...Object.keys(options.builtins ?? {}),
|
|
24
|
+
...Object.keys(options.globalValues ?? {}),
|
|
25
|
+
]);
|
|
26
|
+
checkUnresolvedNames(sourceFile, binding, diagnostics, builtinNames);
|
|
27
|
+
reportDeclarationConflicts(sourceFile, binding, diagnostics);
|
|
28
|
+
checkCallArity(sourceFile, binding, diagnostics);
|
|
29
|
+
checkTypes(sourceFile, binding, diagnostics);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/checker/checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAStD,MAAM,UAAU,YAAY,CAC1B,UAA0B,EAC1B,OAAmB,EACnB,WAA0B,EAC1B,UAAwB,EAAE;IAE1B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS;QACnC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,0BAA0B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjD,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redeclarations: the binder records same-scope declarations that cannot merge
|
|
3
|
+
* (`let x` twice, `function f` followed by `const f`, ...). This pass turns
|
|
4
|
+
* those facts into diagnostics.
|
|
5
|
+
*/
|
|
6
|
+
import type { SourceFileNode } from "../ast/nodes.js";
|
|
7
|
+
import type { BindResult } from "../binder/binder.js";
|
|
8
|
+
import { type DiagnosticBag } from "../diagnostics/diagnostic.js";
|
|
9
|
+
export declare function reportDeclarationConflicts(sourceFile: SourceFileNode, binding: BindResult, diagnostics: DiagnosticBag): void;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redeclarations: the binder records same-scope declarations that cannot merge
|
|
3
|
+
* (`let x` twice, `function f` followed by `const f`, ...). This pass turns
|
|
4
|
+
* those facts into diagnostics.
|
|
5
|
+
*/
|
|
6
|
+
import { DiagnosticCode } from "../diagnostics/diagnostic.js";
|
|
7
|
+
import { fileNameOf, isDependencyNode } from "./source.js";
|
|
8
|
+
export function reportDeclarationConflicts(sourceFile, binding, diagnostics) {
|
|
9
|
+
for (const conflict of binding.conflicts) {
|
|
10
|
+
if (isDependencyNode(sourceFile, conflict.node))
|
|
11
|
+
continue;
|
|
12
|
+
diagnostics.error(DiagnosticCode.DuplicateIdentifier, `Duplicate identifier '${conflict.name}'.`, conflict.node, fileNameOf(sourceFile, conflict.node));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../../src/checker/declarations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAsB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,UAAU,0BAA0B,CACxC,UAA0B,EAC1B,OAAmB,EACnB,WAA0B;IAE1B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1D,WAAW,CAAC,KAAK,CACf,cAAc,CAAC,mBAAmB,EAClC,yBAAyB,QAAQ,CAAC,IAAI,IAAI,EAC1C,QAAQ,CAAC,IAAI,EACb,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CACtC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight control-flow narrowing.
|
|
3
|
+
*
|
|
4
|
+
* Only the predicates whose refinement is unambiguous are handled:
|
|
5
|
+
* `typeof x === "..."`, comparisons with `null`/`undefined`, `instanceof`,
|
|
6
|
+
* truthiness and the `&&` / `||` / `??` forms that combine them. Everything
|
|
7
|
+
* else leaves the flow untouched, so a missed narrowing can only hide an
|
|
8
|
+
* error, never invent one.
|
|
9
|
+
*/
|
|
10
|
+
import { type Expression } from "../ast/nodes.js";
|
|
11
|
+
import { type Type } from "./type-model.js";
|
|
12
|
+
import type { TypeResolver } from "./type-system.js";
|
|
13
|
+
export declare class Flow {
|
|
14
|
+
readonly parent?: Flow | undefined;
|
|
15
|
+
readonly overrides: ReadonlyMap<number, Type>;
|
|
16
|
+
constructor(parent?: Flow | undefined, overrides?: ReadonlyMap<number, Type>);
|
|
17
|
+
typeOf(symbolId: number): Type | undefined;
|
|
18
|
+
with(overrides: ReadonlyMap<number, Type>): Flow;
|
|
19
|
+
}
|
|
20
|
+
export declare function withoutNullish(type: Type): Type;
|
|
21
|
+
export declare function narrow(condition: Expression, truthy: boolean, flow: Flow, resolver: TypeResolver): Flow;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight control-flow narrowing.
|
|
3
|
+
*
|
|
4
|
+
* Only the predicates whose refinement is unambiguous are handled:
|
|
5
|
+
* `typeof x === "..."`, comparisons with `null`/`undefined`, `instanceof`,
|
|
6
|
+
* truthiness and the `&&` / `||` / `??` forms that combine them. Everything
|
|
7
|
+
* else leaves the flow untouched, so a missed narrowing can only hide an
|
|
8
|
+
* error, never invent one.
|
|
9
|
+
*/
|
|
10
|
+
import { SyntaxKind, } from "../ast/nodes.js";
|
|
11
|
+
import { primitive, unionMembers, unwrap } from "./type-model.js";
|
|
12
|
+
export class Flow {
|
|
13
|
+
parent;
|
|
14
|
+
overrides;
|
|
15
|
+
constructor(parent, overrides = new Map()) {
|
|
16
|
+
this.parent = parent;
|
|
17
|
+
this.overrides = overrides;
|
|
18
|
+
}
|
|
19
|
+
typeOf(symbolId) {
|
|
20
|
+
return this.overrides.get(symbolId) ?? this.parent?.typeOf(symbolId);
|
|
21
|
+
}
|
|
22
|
+
with(overrides) {
|
|
23
|
+
return new Flow(this, overrides);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function merge(...maps) {
|
|
27
|
+
const result = new Map();
|
|
28
|
+
for (const map of maps)
|
|
29
|
+
for (const [key, value] of map)
|
|
30
|
+
result.set(key, value);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
function symbolIdOf(expression, resolver) {
|
|
34
|
+
const unwrapped = unwrap(expression);
|
|
35
|
+
if (unwrapped.kind !== SyntaxKind.Identifier)
|
|
36
|
+
return undefined;
|
|
37
|
+
return resolver.binding.symbolOfIdentifier.get(unwrapped)?.id;
|
|
38
|
+
}
|
|
39
|
+
function nullishKind(expression) {
|
|
40
|
+
const unwrapped = unwrap(expression);
|
|
41
|
+
if (unwrapped.kind === SyntaxKind.NullKeyword)
|
|
42
|
+
return "null";
|
|
43
|
+
if (unwrapped.kind === SyntaxKind.UndefinedKeyword)
|
|
44
|
+
return "undefined";
|
|
45
|
+
if (unwrapped.kind === SyntaxKind.Identifier && unwrapped.text === "undefined")
|
|
46
|
+
return "undefined";
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function literalType(expression) {
|
|
50
|
+
const unwrapped = unwrap(expression);
|
|
51
|
+
switch (unwrapped.kind) {
|
|
52
|
+
case SyntaxKind.StringLiteral:
|
|
53
|
+
case SyntaxKind.NoSubstitutionTemplateLiteral:
|
|
54
|
+
return { kind: "literal", value: unwrapped.value, primitive: "string" };
|
|
55
|
+
case SyntaxKind.NumericLiteral:
|
|
56
|
+
return { kind: "literal", value: unwrapped.value, primitive: "number" };
|
|
57
|
+
case SyntaxKind.TrueKeyword:
|
|
58
|
+
return { kind: "literal", value: true, primitive: "boolean" };
|
|
59
|
+
case SyntaxKind.FalseKeyword:
|
|
60
|
+
return { kind: "literal", value: false, primitive: "boolean" };
|
|
61
|
+
default:
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const TYPEOF_NAMES = {
|
|
66
|
+
string: "string",
|
|
67
|
+
number: "number",
|
|
68
|
+
boolean: "boolean",
|
|
69
|
+
bigint: "bigint",
|
|
70
|
+
symbol: "symbol",
|
|
71
|
+
undefined: "undefined",
|
|
72
|
+
};
|
|
73
|
+
function filterType(type, predicate) {
|
|
74
|
+
const kept = unionMembers(type).filter(predicate);
|
|
75
|
+
if (kept.length === 0)
|
|
76
|
+
return undefined;
|
|
77
|
+
if (kept.length === 1)
|
|
78
|
+
return kept[0];
|
|
79
|
+
return { kind: "union", members: kept };
|
|
80
|
+
}
|
|
81
|
+
export function withoutNullish(type) {
|
|
82
|
+
return filterType(type, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined"))) ?? type;
|
|
83
|
+
}
|
|
84
|
+
function refine(type, predicate) {
|
|
85
|
+
return filterType(type, predicate);
|
|
86
|
+
}
|
|
87
|
+
function positiveRefinement(expression, flow, resolver) {
|
|
88
|
+
const result = new Map();
|
|
89
|
+
const unwrapped = unwrap(expression);
|
|
90
|
+
if (unwrapped.kind === SyntaxKind.Identifier) {
|
|
91
|
+
const id = symbolIdOf(unwrapped, resolver);
|
|
92
|
+
if (id !== undefined) {
|
|
93
|
+
const type = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
|
|
94
|
+
if (type)
|
|
95
|
+
result.set(id, withoutNullish(type));
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
if (unwrapped.kind === SyntaxKind.PrefixUnaryExpression) {
|
|
100
|
+
const unary = unwrapped;
|
|
101
|
+
if (unary.operator === "!")
|
|
102
|
+
return negativeRefinement(unary.operand, flow, resolver);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
if (unwrapped.kind !== SyntaxKind.BinaryExpression)
|
|
106
|
+
return result;
|
|
107
|
+
const binary = unwrapped;
|
|
108
|
+
const operator = binary.operator;
|
|
109
|
+
if (operator === "&&")
|
|
110
|
+
return merge(positiveRefinement(binary.left, flow, resolver), positiveRefinement(binary.right, flow, resolver));
|
|
111
|
+
if (operator === "||") {
|
|
112
|
+
// `a || b` is truthy when either side is; no single refinement to apply.
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
if (operator === "??")
|
|
116
|
+
return positiveRefinement(binary.left, flow, resolver);
|
|
117
|
+
const equality = operator === "===" || operator === "==";
|
|
118
|
+
const inequality = operator === "!==" || operator === "!=";
|
|
119
|
+
if (equality || inequality) {
|
|
120
|
+
const leftNullish = nullishKind(binary.left);
|
|
121
|
+
const rightNullish = nullishKind(binary.right);
|
|
122
|
+
const nullish = leftNullish ?? rightNullish;
|
|
123
|
+
const other = leftNullish ? binary.right : binary.left;
|
|
124
|
+
const id = symbolIdOf(other, resolver);
|
|
125
|
+
if (id !== undefined && nullish) {
|
|
126
|
+
if (equality) {
|
|
127
|
+
const target = nullish === "nullish" ? [primitive("null"), primitive("undefined")] : [primitive(nullish)];
|
|
128
|
+
for (const type of target)
|
|
129
|
+
result.set(id, type);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const base = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
|
|
133
|
+
if (base) {
|
|
134
|
+
const narrowed = refine(base, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined")));
|
|
135
|
+
if (narrowed)
|
|
136
|
+
result.set(id, narrowed);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
// `typeof x === "string"` and friends.
|
|
142
|
+
const typeofSide = unwrap(binary.left).kind === SyntaxKind.TypeOfExpression ? binary.left : unwrap(binary.right).kind === SyntaxKind.TypeOfExpression ? binary.right : undefined;
|
|
143
|
+
const literalSide = literalType(typeofSide === binary.left ? binary.right : binary.left);
|
|
144
|
+
if (typeofSide && literalSide?.kind === "literal" && typeof literalSide.value === "string") {
|
|
145
|
+
const name = TYPEOF_NAMES[literalSide.value];
|
|
146
|
+
const operand = unwrap(typeofSide).expression;
|
|
147
|
+
const operandId = symbolIdOf(operand, resolver);
|
|
148
|
+
if (name && operandId !== undefined) {
|
|
149
|
+
const base = flow.typeOf(operandId) ?? resolver.typeOfSymbolId(operandId);
|
|
150
|
+
if (base) {
|
|
151
|
+
const narrowed = refine(base, (member) => matchesTypeof(member, name));
|
|
152
|
+
if (narrowed)
|
|
153
|
+
result.set(operandId, narrowed);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
// `x === "literal"` narrows to that literal.
|
|
159
|
+
const leftLiteral = literalType(binary.left);
|
|
160
|
+
const rightLiteral = literalType(binary.right);
|
|
161
|
+
if (leftLiteral && !rightLiteral) {
|
|
162
|
+
const id = symbolIdOf(binary.right, resolver);
|
|
163
|
+
if (id !== undefined)
|
|
164
|
+
result.set(id, leftLiteral);
|
|
165
|
+
}
|
|
166
|
+
else if (rightLiteral && !leftLiteral) {
|
|
167
|
+
const id = symbolIdOf(binary.left, resolver);
|
|
168
|
+
if (id !== undefined)
|
|
169
|
+
result.set(id, rightLiteral);
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
if (operator === "instanceof") {
|
|
174
|
+
const id = symbolIdOf(binary.left, resolver);
|
|
175
|
+
if (id === undefined)
|
|
176
|
+
return result;
|
|
177
|
+
const instance = resolver.classInstanceFromIdentifier(binary.right);
|
|
178
|
+
if (instance)
|
|
179
|
+
result.set(id, instance);
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
function negativeRefinement(expression, flow, resolver) {
|
|
184
|
+
const result = new Map();
|
|
185
|
+
const unwrapped = unwrap(expression);
|
|
186
|
+
if (unwrapped.kind === SyntaxKind.PrefixUnaryExpression) {
|
|
187
|
+
const unary = unwrapped;
|
|
188
|
+
if (unary.operator === "!")
|
|
189
|
+
return positiveRefinement(unary.operand, flow, resolver);
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
if (unwrapped.kind !== SyntaxKind.BinaryExpression)
|
|
193
|
+
return result;
|
|
194
|
+
const binary = unwrapped;
|
|
195
|
+
if (binary.operator === "&&") {
|
|
196
|
+
// `!(a && b)` does not refine either side on its own.
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
if (binary.operator === "||") {
|
|
200
|
+
return merge(negativeRefinement(binary.left, flow, resolver), negativeRefinement(binary.right, flow, resolver));
|
|
201
|
+
}
|
|
202
|
+
const equality = binary.operator === "===" || binary.operator === "==";
|
|
203
|
+
const inequality = binary.operator === "!==" || binary.operator === "!=";
|
|
204
|
+
if (!equality && !inequality)
|
|
205
|
+
return result;
|
|
206
|
+
const leftNullish = nullishKind(binary.left);
|
|
207
|
+
const rightNullish = nullishKind(binary.right);
|
|
208
|
+
const nullish = leftNullish ?? rightNullish;
|
|
209
|
+
const other = leftNullish ? binary.right : binary.left;
|
|
210
|
+
const id = symbolIdOf(other, resolver);
|
|
211
|
+
if (id === undefined || !nullish)
|
|
212
|
+
return result;
|
|
213
|
+
if (equality) {
|
|
214
|
+
// `!(x === null)` means x is non-null.
|
|
215
|
+
const base = flow.typeOf(id) ?? resolver.typeOfSymbolId(id);
|
|
216
|
+
if (!base)
|
|
217
|
+
return result;
|
|
218
|
+
const narrowed = refine(base, (member) => !(member.kind === "primitive" && (member.name === "null" || member.name === "undefined")));
|
|
219
|
+
if (narrowed)
|
|
220
|
+
result.set(id, narrowed);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
// `!(x !== null)` means x is null (or nullish for `!= null`).
|
|
224
|
+
const target = nullish === "nullish" ? [primitive("null"), primitive("undefined")] : [primitive(nullish)];
|
|
225
|
+
for (const type of target)
|
|
226
|
+
result.set(id, type);
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
function matchesTypeof(type, name) {
|
|
231
|
+
if (type.kind === "literal")
|
|
232
|
+
return type.primitive === name;
|
|
233
|
+
if (type.kind !== "primitive")
|
|
234
|
+
return false;
|
|
235
|
+
return type.name === name;
|
|
236
|
+
}
|
|
237
|
+
export function narrow(condition, truthy, flow, resolver) {
|
|
238
|
+
const overrides = truthy ? positiveRefinement(condition, flow, resolver) : negativeRefinement(condition, flow, resolver);
|
|
239
|
+
return overrides.size > 0 ? flow.with(overrides) : flow;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/checker/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Names the compiler resolves without a user declaration.
|
|
3
|
+
*
|
|
4
|
+
* The tables are the same ones code generation uses, so "known global" and
|
|
5
|
+
* "codegen can lower it" cannot drift apart: a name added to a table becomes
|
|
6
|
+
* legal in the checker in the same commit.
|
|
7
|
+
*/
|
|
8
|
+
/** True when `name` is a runtime global (or an extension-provided builtin). */
|
|
9
|
+
export declare function isKnownGlobalName(name: string, extensionBuiltins?: ReadonlySet<string>): boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Names the compiler resolves without a user declaration.
|
|
3
|
+
*
|
|
4
|
+
* The tables are the same ones code generation uses, so "known global" and
|
|
5
|
+
* "codegen can lower it" cannot drift apart: a name added to a table becomes
|
|
6
|
+
* legal in the checker in the same commit.
|
|
7
|
+
*/
|
|
8
|
+
import { BUILTIN_FUNCTION_VALUES, CTOR_FUNCTIONS, ERROR_CONSTRUCTORS, FIRST_CLASS_CONSTRUCTORS, GLOBAL_FUNCTIONS, NAMESPACE_PROPERTIES, NAMESPACE_STATICS, TYPED_ARRAYS, } from "../codegen/generator/tables.js";
|
|
9
|
+
const KNOWN_GLOBALS = new Set([
|
|
10
|
+
...Object.keys(GLOBAL_FUNCTIONS),
|
|
11
|
+
...Object.keys(BUILTIN_FUNCTION_VALUES),
|
|
12
|
+
...Object.keys(ERROR_CONSTRUCTORS),
|
|
13
|
+
...Object.keys(CTOR_FUNCTIONS),
|
|
14
|
+
...Object.keys(TYPED_ARRAYS),
|
|
15
|
+
...Object.keys(NAMESPACE_STATICS),
|
|
16
|
+
...Object.keys(NAMESPACE_PROPERTIES),
|
|
17
|
+
...FIRST_CLASS_CONSTRUCTORS,
|
|
18
|
+
// Handled directly in `emitIdentifier` rather than through a table.
|
|
19
|
+
"console",
|
|
20
|
+
"undefined",
|
|
21
|
+
"NaN",
|
|
22
|
+
"Infinity",
|
|
23
|
+
"arguments",
|
|
24
|
+
]);
|
|
25
|
+
/** True when `name` is a runtime global (or an extension-provided builtin). */
|
|
26
|
+
export function isKnownGlobalName(name, extensionBuiltins) {
|
|
27
|
+
return KNOWN_GLOBALS.has(name) || (extensionBuiltins?.has(name) ?? false);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=globals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../../../src/checker/globals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAS;IACzD,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAChC,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC;IACvC,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAClC,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;IAC9B,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;IAC5B,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACjC,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;IACpC,GAAG,wBAAwB;IAC3B,oEAAoE;IACpE,SAAS;IACT,WAAW;IACX,KAAK;IACL,UAAU;IACV,WAAW;CACZ,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,iBAAuC;IACrF,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small source-location helpers shared by the checker.
|
|
3
|
+
*/
|
|
4
|
+
import type { Node, SourceFileNode } from "../ast/nodes.js";
|
|
5
|
+
/**
|
|
6
|
+
* The file a node came from. Bundling merges every module into one
|
|
7
|
+
* `SourceFile` while keeping module-local offsets, so the origin map is what
|
|
8
|
+
* keeps a diagnostic pointing at the file the user actually wrote.
|
|
9
|
+
*/
|
|
10
|
+
export declare function fileNameOf(sourceFile: SourceFileNode, node: Node): string;
|
|
11
|
+
/**
|
|
12
|
+
* True when a node came from a bundled package under `node_modules`.
|
|
13
|
+
*
|
|
14
|
+
* The checker is a gate for the code the user wrote, not for dependency
|
|
15
|
+
* internals: a package may legitimately use `globalThis`, call a function
|
|
16
|
+
* through a pattern the arity heuristic cannot see, or rely on its own
|
|
17
|
+
* transpiler's output. Reporting those would make enabling the checker break
|
|
18
|
+
* otherwise working builds.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isDependencyNode(sourceFile: SourceFileNode, node: Node): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* True when a node came from a plain JavaScript file (`.js`, `.mjs`, `.cjs`,
|
|
23
|
+
* `.jsx`).
|
|
24
|
+
*
|
|
25
|
+
* A JavaScript program is untyped by definition: TypeScript only infers and
|
|
26
|
+
* reports on such files with `checkJs`, and xbintsc honours the same boundary.
|
|
27
|
+
* Inferring types from unannotated JavaScript rejects valid code — a flag
|
|
28
|
+
* assigned `false` then `true` narrows to `false`, a method installed on a
|
|
29
|
+
* state object after its literal (`Game.foo = …`) is not a property of the
|
|
30
|
+
* literal, a closure variable initialized to `null` is "not callable", a call
|
|
31
|
+
* that relies on default parameters looks like an arity error. Names are still
|
|
32
|
+
* resolved (that is what code generation needs), and redeclarations are still
|
|
33
|
+
* reported, but no type, arity or property diagnostic is produced.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isPlainJavaScriptNode(sourceFile: SourceFileNode, node: Node): boolean;
|
|
36
|
+
/** True when a node is exempt from type checking: plain JavaScript or a
|
|
37
|
+
* bundled dependency (see {@link isDependencyNode}). */
|
|
38
|
+
export declare function isUntypedNode(sourceFile: SourceFileNode, node: Node): boolean;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small source-location helpers shared by the checker.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The file a node came from. Bundling merges every module into one
|
|
6
|
+
* `SourceFile` while keeping module-local offsets, so the origin map is what
|
|
7
|
+
* keeps a diagnostic pointing at the file the user actually wrote.
|
|
8
|
+
*/
|
|
9
|
+
export function fileNameOf(sourceFile, node) {
|
|
10
|
+
return sourceFile.origins?.get(node) ?? sourceFile.fileName;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* True when a node came from a bundled package under `node_modules`.
|
|
14
|
+
*
|
|
15
|
+
* The checker is a gate for the code the user wrote, not for dependency
|
|
16
|
+
* internals: a package may legitimately use `globalThis`, call a function
|
|
17
|
+
* through a pattern the arity heuristic cannot see, or rely on its own
|
|
18
|
+
* transpiler's output. Reporting those would make enabling the checker break
|
|
19
|
+
* otherwise working builds.
|
|
20
|
+
*/
|
|
21
|
+
export function isDependencyNode(sourceFile, node) {
|
|
22
|
+
const origin = sourceFile.origins?.get(node);
|
|
23
|
+
return origin !== undefined && /(^|[\\/])node_modules[\\/]/.test(origin);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* True when a node came from a plain JavaScript file (`.js`, `.mjs`, `.cjs`,
|
|
27
|
+
* `.jsx`).
|
|
28
|
+
*
|
|
29
|
+
* A JavaScript program is untyped by definition: TypeScript only infers and
|
|
30
|
+
* reports on such files with `checkJs`, and xbintsc honours the same boundary.
|
|
31
|
+
* Inferring types from unannotated JavaScript rejects valid code — a flag
|
|
32
|
+
* assigned `false` then `true` narrows to `false`, a method installed on a
|
|
33
|
+
* state object after its literal (`Game.foo = …`) is not a property of the
|
|
34
|
+
* literal, a closure variable initialized to `null` is "not callable", a call
|
|
35
|
+
* that relies on default parameters looks like an arity error. Names are still
|
|
36
|
+
* resolved (that is what code generation needs), and redeclarations are still
|
|
37
|
+
* reported, but no type, arity or property diagnostic is produced.
|
|
38
|
+
*/
|
|
39
|
+
export function isPlainJavaScriptNode(sourceFile, node) {
|
|
40
|
+
const origin = sourceFile.origins?.get(node) ?? sourceFile.fileName;
|
|
41
|
+
return /\.(js|mjs|cjs|jsx)$/i.test(origin);
|
|
42
|
+
}
|
|
43
|
+
/** True when a node is exempt from type checking: plain JavaScript or a
|
|
44
|
+
* bundled dependency (see {@link isDependencyNode}). */
|
|
45
|
+
export function isUntypedNode(sourceFile, node) {
|
|
46
|
+
return isDependencyNode(sourceFile, node) || isPlainJavaScriptNode(sourceFile, node);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/checker/source.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,UAA0B,EAAE,IAAU;IAC/D,OAAO,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA0B,EAAE,IAAU;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,MAAM,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE,IAAU;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;IACpE,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;wDACwD;AACxD,MAAM,UAAU,aAAa,CAAC,UAA0B,EAAE,IAAU;IAClE,OAAO,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC"}
|