@soundscript/soundscript 0.1.12 → 0.1.15
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/package.json +15 -6
- package/project-transform/index.js +2 -0
- package/project-transform/index.ts +8 -0
- package/project-transform/src/annotation_syntax.js +948 -0
- package/project-transform/src/annotation_syntax.ts +1217 -0
- package/project-transform/src/build_package.js +475 -0
- package/project-transform/src/build_package.ts +683 -0
- package/project-transform/src/bundled/portable-web-globals.d.ts +153 -0
- package/project-transform/src/bundled/runtime_externs.js +220 -0
- package/project-transform/src/bundled/runtime_externs.ts +237 -0
- package/project-transform/src/bundled/sound-libs/lib.decorators.d.ts +385 -0
- package/project-transform/src/bundled/sound-libs/lib.decorators.legacy.d.ts +22 -0
- package/project-transform/src/bundled/sound-libs/lib.dom.asynciterable.d.ts +42 -0
- package/project-transform/src/bundled/sound-libs/lib.dom.d.ts +39440 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.collection.d.ts +149 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.core.d.ts +657 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.d.ts +28 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.generator.d.ts +77 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.iterable.d.ts +616 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.promise.d.ts +80 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.proxy.d.ts +128 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.reflect.d.ts +144 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.d.ts +46 -0
- package/project-transform/src/bundled/sound-libs/lib.es2015.symbol.wellknown.d.ts +170 -0
- package/project-transform/src/bundled/sound-libs/lib.es2016.array.include.d.ts +116 -0
- package/project-transform/src/bundled/sound-libs/lib.es2016.d.ts +21 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.arraybuffer.d.ts +21 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.d.ts +26 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.date.d.ts +31 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.object.d.ts +49 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.string.d.ts +45 -0
- package/project-transform/src/bundled/sound-libs/lib.es2017.typedarrays.d.ts +53 -0
- package/project-transform/src/bundled/sound-libs/lib.es2018.asyncgenerator.d.ts +77 -0
- package/project-transform/src/bundled/sound-libs/lib.es2018.asynciterable.d.ts +57 -0
- package/project-transform/src/bundled/sound-libs/lib.es2018.d.ts +24 -0
- package/project-transform/src/bundled/sound-libs/lib.es2018.promise.d.ts +30 -0
- package/project-transform/src/bundled/sound-libs/lib.es2018.regexp.d.ts +37 -0
- package/project-transform/src/bundled/sound-libs/lib.es2019.array.d.ts +79 -0
- package/project-transform/src/bundled/sound-libs/lib.es2019.d.ts +24 -0
- package/project-transform/src/bundled/sound-libs/lib.es2019.object.d.ts +47 -0
- package/project-transform/src/bundled/sound-libs/lib.es2019.string.d.ts +37 -0
- package/project-transform/src/bundled/sound-libs/lib.es2019.symbol.d.ts +24 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.bigint.d.ts +765 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.d.ts +27 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.date.d.ts +42 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.number.d.ts +28 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.promise.d.ts +49 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.string.d.ts +44 -0
- package/project-transform/src/bundled/sound-libs/lib.es2020.symbol.wellknown.d.ts +41 -0
- package/project-transform/src/bundled/sound-libs/lib.es2021.d.ts +23 -0
- package/project-transform/src/bundled/sound-libs/lib.es2021.promise.d.ts +48 -0
- package/project-transform/src/bundled/sound-libs/lib.es2021.string.d.ts +33 -0
- package/project-transform/src/bundled/sound-libs/lib.es2021.weakref.d.ts +78 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.array.d.ts +121 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.d.ts +25 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.error.d.ts +75 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.object.d.ts +26 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.regexp.d.ts +39 -0
- package/project-transform/src/bundled/sound-libs/lib.es2022.string.d.ts +25 -0
- package/project-transform/src/bundled/sound-libs/lib.es2023.array.d.ts +924 -0
- package/project-transform/src/bundled/sound-libs/lib.es2023.collection.d.ts +21 -0
- package/project-transform/src/bundled/sound-libs/lib.es2023.d.ts +22 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.arraybuffer.d.ts +65 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.collection.d.ts +29 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.d.ts +26 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.object.d.ts +33 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.promise.d.ts +35 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.regexp.d.ts +25 -0
- package/project-transform/src/bundled/sound-libs/lib.es2024.string.d.ts +29 -0
- package/project-transform/src/bundled/sound-libs/lib.es5.d.ts +4924 -0
- package/project-transform/src/bundled/sound_stdlib.js +142 -0
- package/project-transform/src/bundled/sound_stdlib.ts +180 -0
- package/project-transform/src/checker/analyze_project.js +1361 -0
- package/project-transform/src/checker/analyze_project.ts +2246 -0
- package/project-transform/src/checker/diagnostics.js +112 -0
- package/project-transform/src/checker/diagnostics.ts +222 -0
- package/project-transform/src/checker/engine/context.js +235 -0
- package/project-transform/src/checker/engine/context.ts +340 -0
- package/project-transform/src/checker/engine/diagnostic_codes.js +72 -0
- package/project-transform/src/checker/engine/diagnostic_codes.ts +95 -0
- package/project-transform/src/checker/engine/facts.js +35 -0
- package/project-transform/src/checker/engine/facts.ts +48 -0
- package/project-transform/src/checker/engine/types.js +1 -0
- package/project-transform/src/checker/engine/types.ts +485 -0
- package/project-transform/src/checker/proof_escape_hatch_diagnostics.js +104 -0
- package/project-transform/src/checker/proof_escape_hatch_diagnostics.ts +173 -0
- package/project-transform/src/checker/rules/async_surface.js +231 -0
- package/project-transform/src/checker/rules/async_surface.ts +335 -0
- package/project-transform/src/checker/rules/class_lifecycle.js +798 -0
- package/project-transform/src/checker/rules/class_lifecycle.ts +1276 -0
- package/project-transform/src/checker/rules/directive_validation.js +571 -0
- package/project-transform/src/checker/rules/directive_validation.ts +938 -0
- package/project-transform/src/checker/rules/directives.js +23 -0
- package/project-transform/src/checker/rules/directives.ts +25 -0
- package/project-transform/src/checker/rules/flow.js +202 -0
- package/project-transform/src/checker/rules/flow.ts +333 -0
- package/project-transform/src/checker/rules/flow_facts.js +601 -0
- package/project-transform/src/checker/rules/flow_facts.ts +978 -0
- package/project-transform/src/checker/rules/flow_invalidation.js +1119 -0
- package/project-transform/src/checker/rules/flow_invalidation.ts +2150 -0
- package/project-transform/src/checker/rules/flow_shared.js +2822 -0
- package/project-transform/src/checker/rules/flow_shared.ts +4383 -0
- package/project-transform/src/checker/rules/foreign_boundary.js +120 -0
- package/project-transform/src/checker/rules/foreign_boundary.ts +196 -0
- package/project-transform/src/checker/rules/foreign_projection.js +279 -0
- package/project-transform/src/checker/rules/foreign_projection.ts +425 -0
- package/project-transform/src/checker/rules/generated_helpers.js +13 -0
- package/project-transform/src/checker/rules/generated_helpers.ts +18 -0
- package/project-transform/src/checker/rules/index.js +35 -0
- package/project-transform/src/checker/rules/index.ts +49 -0
- package/project-transform/src/checker/rules/namespace_object.js +845 -0
- package/project-transform/src/checker/rules/namespace_object.ts +1224 -0
- package/project-transform/src/checker/rules/non_ordinary_recovery.js +1328 -0
- package/project-transform/src/checker/rules/non_ordinary_recovery.ts +2391 -0
- package/project-transform/src/checker/rules/null_prototype.js +3 -0
- package/project-transform/src/checker/rules/null_prototype.ts +6 -0
- package/project-transform/src/checker/rules/overloads.js +181 -0
- package/project-transform/src/checker/rules/overloads.ts +317 -0
- package/project-transform/src/checker/rules/predicate_verification.js +691 -0
- package/project-transform/src/checker/rules/predicate_verification.ts +1088 -0
- package/project-transform/src/checker/rules/prototype_hardening.js +237 -0
- package/project-transform/src/checker/rules/prototype_hardening.ts +343 -0
- package/project-transform/src/checker/rules/receiver_discipline.js +263 -0
- package/project-transform/src/checker/rules/receiver_discipline.ts +356 -0
- package/project-transform/src/checker/rules/relations.js +6861 -0
- package/project-transform/src/checker/rules/relations.ts +12158 -0
- package/project-transform/src/checker/rules/resolved_builtins.js +274 -0
- package/project-transform/src/checker/rules/resolved_builtins.ts +438 -0
- package/project-transform/src/checker/rules/trust.js +217 -0
- package/project-transform/src/checker/rules/trust.ts +301 -0
- package/project-transform/src/checker/rules/type_guards.js +173 -0
- package/project-transform/src/checker/rules/type_guards.ts +257 -0
- package/project-transform/src/checker/rules/universal.js +17 -0
- package/project-transform/src/checker/rules/universal.ts +22 -0
- package/project-transform/src/checker/rules/unsafe_value_origin.js +80 -0
- package/project-transform/src/checker/rules/unsafe_value_origin.ts +125 -0
- package/project-transform/src/checker/rules/unsound_imports.js +218 -0
- package/project-transform/src/checker/rules/unsound_imports.ts +301 -0
- package/project-transform/src/checker/rules/unsound_syntax.js +1695 -0
- package/project-transform/src/checker/rules/unsound_syntax.ts +2540 -0
- package/project-transform/src/checker/rules/value_types.js +206 -0
- package/project-transform/src/checker/rules/value_types.ts +407 -0
- package/project-transform/src/checker/timing.js +43 -0
- package/project-transform/src/checker/timing.ts +78 -0
- package/project-transform/src/checker/unsupported_feature_messages.js +337 -0
- package/project-transform/src/checker/unsupported_feature_messages.ts +531 -0
- package/project-transform/src/cli.js +892 -0
- package/project-transform/src/cli.ts +1476 -0
- package/project-transform/src/compiler/compile_project.js +319 -0
- package/project-transform/src/compiler/compile_project.ts +508 -0
- package/project-transform/src/compiler/errors.js +10 -0
- package/project-transform/src/compiler/errors.ts +29 -0
- package/project-transform/src/compiler/ir.js +1 -0
- package/project-transform/src/compiler/ir.ts +1526 -0
- package/project-transform/src/compiler/lower.js +30550 -0
- package/project-transform/src/compiler/lower.ts +43645 -0
- package/project-transform/src/compiler/lower_arrays.js +140 -0
- package/project-transform/src/compiler/lower_arrays.ts +190 -0
- package/project-transform/src/compiler/lower_strings.js +121 -0
- package/project-transform/src/compiler/lower_strings.ts +198 -0
- package/project-transform/src/compiler/lower_tagged.js +329 -0
- package/project-transform/src/compiler/lower_tagged.ts +427 -0
- package/project-transform/src/compiler/lower_views.js +171 -0
- package/project-transform/src/compiler/lower_views.ts +251 -0
- package/project-transform/src/compiler/object_keys.js +25 -0
- package/project-transform/src/compiler/object_keys.ts +35 -0
- package/project-transform/src/compiler/runtime_ir.js +30 -0
- package/project-transform/src/compiler/runtime_ir.ts +727 -0
- package/project-transform/src/compiler/tagged_boundary.js +18 -0
- package/project-transform/src/compiler/tagged_boundary.ts +37 -0
- package/project-transform/src/compiler/toolchain.js +170 -0
- package/project-transform/src/compiler/toolchain.ts +229 -0
- package/project-transform/src/compiler/unicode_case_data.js +2102 -0
- package/project-transform/src/compiler/unicode_case_data.ts +2112 -0
- package/project-transform/src/compiler/wasm_js_host_runtime.js +656 -0
- package/project-transform/src/compiler/wasm_js_host_runtime.ts +762 -0
- package/project-transform/src/compiler/wat_arrays.js +3132 -0
- package/project-transform/src/compiler/wat_arrays.ts +3768 -0
- package/project-transform/src/compiler/wat_emitter.js +17952 -0
- package/project-transform/src/compiler/wat_emitter.ts +22812 -0
- package/project-transform/src/compiler/wat_strings.js +129 -0
- package/project-transform/src/compiler/wat_strings.ts +187 -0
- package/project-transform/src/compiler/wat_tagged.js +548 -0
- package/project-transform/src/compiler/wat_tagged.ts +674 -0
- package/project-transform/src/compiler_generator_runner.js +153 -0
- package/project-transform/src/compiler_generator_runner.ts +171 -0
- package/project-transform/src/compiler_object_test_helpers.js +69 -0
- package/project-transform/src/compiler_object_test_helpers.ts +96 -0
- package/project-transform/src/compiler_promise_runner.js +2116 -0
- package/project-transform/src/compiler_promise_runner.ts +2184 -0
- package/project-transform/src/compiler_test_helpers.js +854 -0
- package/project-transform/src/compiler_test_helpers.ts +1087 -0
- package/project-transform/src/config.js +568 -0
- package/project-transform/src/config.ts +892 -0
- package/project-transform/src/diagnostic_metadata.js +67 -0
- package/project-transform/src/diagnostic_metadata.ts +99 -0
- package/project-transform/src/diagnostic_reference.js +1368 -0
- package/project-transform/src/diagnostic_reference.ts +1523 -0
- package/project-transform/src/editor_diagnostics_worker.js +176 -0
- package/project-transform/src/editor_diagnostics_worker.ts +250 -0
- package/project-transform/src/editor_projection.js +224 -0
- package/project-transform/src/editor_projection.ts +421 -0
- package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.js +47 -0
- package/project-transform/src/frontend/builtin_expanded_program_test_cleanup.ts +72 -0
- package/project-transform/src/frontend/builtin_macro_support.js +842 -0
- package/project-transform/src/frontend/builtin_macro_support.ts +1386 -0
- package/project-transform/src/frontend/builtin_macros.js +409 -0
- package/project-transform/src/frontend/builtin_macros.ts +542 -0
- package/project-transform/src/frontend/component_poc_runtime.js +279 -0
- package/project-transform/src/frontend/component_poc_runtime.ts +372 -0
- package/project-transform/src/frontend/css_macro.js +148 -0
- package/project-transform/src/frontend/css_macro.ts +222 -0
- package/project-transform/src/frontend/derive_macros.js +2072 -0
- package/project-transform/src/frontend/derive_macros.ts +3188 -0
- package/project-transform/src/frontend/embedded_fragment_support.js +106 -0
- package/project-transform/src/frontend/embedded_fragment_support.ts +172 -0
- package/project-transform/src/frontend/error_normalization.js +403 -0
- package/project-transform/src/frontend/error_normalization.ts +832 -0
- package/project-transform/src/frontend/error_stdlib_support.js +1 -0
- package/project-transform/src/frontend/error_stdlib_support.ts +6 -0
- package/project-transform/src/frontend/expand_project.js +169 -0
- package/project-transform/src/frontend/expand_project.ts +248 -0
- package/project-transform/src/frontend/format_soundscript.js +297 -0
- package/project-transform/src/frontend/format_soundscript.ts +582 -0
- package/project-transform/src/frontend/graphql_macro.js +174 -0
- package/project-transform/src/frontend/graphql_macro.ts +253 -0
- package/project-transform/src/frontend/hash_context.js +83 -0
- package/project-transform/src/frontend/hash_context.ts +113 -0
- package/project-transform/src/frontend/hkt_macro.js +448 -0
- package/project-transform/src/frontend/hkt_macro.ts +897 -0
- package/project-transform/src/frontend/import_binding_usage.js +190 -0
- package/project-transform/src/frontend/import_binding_usage.ts +277 -0
- package/project-transform/src/frontend/macro_advanced_backend_adapter.js +58 -0
- package/project-transform/src/frontend/macro_advanced_backend_adapter.ts +123 -0
- package/project-transform/src/frontend/macro_advanced_context.js +826 -0
- package/project-transform/src/frontend/macro_advanced_context.ts +1102 -0
- package/project-transform/src/frontend/macro_advanced_output.js +21 -0
- package/project-transform/src/frontend/macro_advanced_output.ts +41 -0
- package/project-transform/src/frontend/macro_api.js +353 -0
- package/project-transform/src/frontend/macro_api.ts +1722 -0
- package/project-transform/src/frontend/macro_api_internal.js +35 -0
- package/project-transform/src/frontend/macro_api_internal.ts +80 -0
- package/project-transform/src/frontend/macro_api_module_support.js +39 -0
- package/project-transform/src/frontend/macro_api_module_support.ts +65 -0
- package/project-transform/src/frontend/macro_backend_adapter.js +272 -0
- package/project-transform/src/frontend/macro_backend_adapter.ts +420 -0
- package/project-transform/src/frontend/macro_context.js +816 -0
- package/project-transform/src/frontend/macro_context.ts +1105 -0
- package/project-transform/src/frontend/macro_debug.js +99 -0
- package/project-transform/src/frontend/macro_debug.ts +157 -0
- package/project-transform/src/frontend/macro_definition_support.js +28 -0
- package/project-transform/src/frontend/macro_definition_support.ts +73 -0
- package/project-transform/src/frontend/macro_errors.js +40 -0
- package/project-transform/src/frontend/macro_errors.ts +70 -0
- package/project-transform/src/frontend/macro_expander.js +919 -0
- package/project-transform/src/frontend/macro_expander.ts +1611 -0
- package/project-transform/src/frontend/macro_factory_support.js +176 -0
- package/project-transform/src/frontend/macro_factory_support.ts +263 -0
- package/project-transform/src/frontend/macro_host_ast_internal.js +64 -0
- package/project-transform/src/frontend/macro_host_ast_internal.ts +109 -0
- package/project-transform/src/frontend/macro_index.js +27 -0
- package/project-transform/src/frontend/macro_index.ts +50 -0
- package/project-transform/src/frontend/macro_loader.js +281 -0
- package/project-transform/src/frontend/macro_loader.ts +506 -0
- package/project-transform/src/frontend/macro_operand_semantics.js +838 -0
- package/project-transform/src/frontend/macro_operand_semantics.ts +1489 -0
- package/project-transform/src/frontend/macro_output.js +54 -0
- package/project-transform/src/frontend/macro_output.ts +123 -0
- package/project-transform/src/frontend/macro_parser.js +611 -0
- package/project-transform/src/frontend/macro_parser.ts +832 -0
- package/project-transform/src/frontend/macro_resolver.js +69 -0
- package/project-transform/src/frontend/macro_resolver.ts +125 -0
- package/project-transform/src/frontend/macro_rewrite.js +285 -0
- package/project-transform/src/frontend/macro_rewrite.ts +442 -0
- package/project-transform/src/frontend/macro_runtime_support.js +232 -0
- package/project-transform/src/frontend/macro_runtime_support.ts +324 -0
- package/project-transform/src/frontend/macro_scanner.js +393 -0
- package/project-transform/src/frontend/macro_scanner.ts +455 -0
- package/project-transform/src/frontend/macro_semantic_backend_adapter.js +87 -0
- package/project-transform/src/frontend/macro_semantic_backend_adapter.ts +166 -0
- package/project-transform/src/frontend/macro_semantic_context.js +5 -0
- package/project-transform/src/frontend/macro_semantic_context.ts +12 -0
- package/project-transform/src/frontend/macro_semantic_output.js +24 -0
- package/project-transform/src/frontend/macro_semantic_output.ts +47 -0
- package/project-transform/src/frontend/macro_semantic_types.js +1 -0
- package/project-transform/src/frontend/macro_semantic_types.ts +98 -0
- package/project-transform/src/frontend/macro_semantics.js +1172 -0
- package/project-transform/src/frontend/macro_semantics.ts +1502 -0
- package/project-transform/src/frontend/macro_site_kind_support.js +164 -0
- package/project-transform/src/frontend/macro_site_kind_support.ts +255 -0
- package/project-transform/src/frontend/macro_syntax_internal.js +1950 -0
- package/project-transform/src/frontend/macro_syntax_internal.ts +3338 -0
- package/project-transform/src/frontend/macro_templates.js +57 -0
- package/project-transform/src/frontend/macro_templates.ts +143 -0
- package/project-transform/src/frontend/macro_test_helpers.js +82 -0
- package/project-transform/src/frontend/macro_test_helpers.ts +136 -0
- package/project-transform/src/frontend/macro_types.js +1 -0
- package/project-transform/src/frontend/macro_types.ts +103 -0
- package/project-transform/src/frontend/macro_vm.js +39 -0
- package/project-transform/src/frontend/macro_vm.ts +113 -0
- package/project-transform/src/frontend/match_macro.js +885 -0
- package/project-transform/src/frontend/match_macro.ts +1220 -0
- package/project-transform/src/frontend/numeric_normalization.js +824 -0
- package/project-transform/src/frontend/numeric_normalization.ts +1380 -0
- package/project-transform/src/frontend/numeric_prelude.js +278 -0
- package/project-transform/src/frontend/numeric_prelude.ts +370 -0
- package/project-transform/src/frontend/project_frontend.js +2396 -0
- package/project-transform/src/frontend/project_frontend.ts +3776 -0
- package/project-transform/src/frontend/project_macro_support.js +1401 -0
- package/project-transform/src/frontend/project_macro_support.ts +2137 -0
- package/project-transform/src/frontend/sql_macro.js +175 -0
- package/project-transform/src/frontend/sql_macro.ts +254 -0
- package/project-transform/src/frontend/sql_stdlib_support.js +1 -0
- package/project-transform/src/frontend/sql_stdlib_support.ts +6 -0
- package/project-transform/src/frontend/std_package_support.js +228 -0
- package/project-transform/src/frontend/std_package_support.ts +400 -0
- package/project-transform/src/frontend/value_normalization.js +306 -0
- package/project-transform/src/frontend/value_normalization.ts +599 -0
- package/project-transform/src/lsp/project_service.js +4771 -0
- package/project-transform/src/lsp/project_service.ts +7580 -0
- package/project-transform/src/lsp/protocol.js +9 -0
- package/project-transform/src/lsp/protocol.ts +38 -0
- package/project-transform/src/lsp/server.js +355 -0
- package/project-transform/src/lsp/server.ts +671 -0
- package/project-transform/src/lsp/session.js +49 -0
- package/project-transform/src/lsp/session.ts +48 -0
- package/project-transform/src/lsp/timing.js +43 -0
- package/project-transform/src/lsp/timing.ts +76 -0
- package/project-transform/src/lsp/transport.js +205 -0
- package/project-transform/src/lsp/transport.ts +253 -0
- package/project-transform/src/lsp_main.js +5 -0
- package/project-transform/src/lsp_main.ts +7 -0
- package/project-transform/src/macros.d.ts +1 -0
- package/project-transform/src/macros.js +1 -0
- package/project-transform/src/macros.ts +1 -0
- package/project-transform/src/main.js +24 -0
- package/project-transform/src/main.ts +28 -0
- package/project-transform/src/platform/host.js +264 -0
- package/project-transform/src/platform/host.ts +343 -0
- package/project-transform/src/platform/path.js +8 -0
- package/project-transform/src/platform/path.ts +20 -0
- package/project-transform/src/public_macro_api/macro_api.d.ts +1054 -0
- package/project-transform/src/public_macro_api/macro_semantic_types.d.ts +66 -0
- package/project-transform/src/public_macro_api/macro_types.d.ts +70 -0
- package/project-transform/src/run_program.js +14 -0
- package/project-transform/src/run_program.ts +33 -0
- package/project-transform/src/runtime/materialize.js +371 -0
- package/project-transform/src/runtime/materialize.ts +502 -0
- package/project-transform/src/runtime/on_demand.js +203 -0
- package/project-transform/src/runtime/on_demand.ts +305 -0
- package/project-transform/src/runtime/source_maps.js +205 -0
- package/project-transform/src/runtime/source_maps.ts +297 -0
- package/project-transform/src/runtime/transform.js +148 -0
- package/project-transform/src/runtime/transform.ts +295 -0
- package/project-transform/src/service/types.js +1 -0
- package/project-transform/src/service/types.ts +22 -0
- package/project-transform/src/soundscript_packages.js +477 -0
- package/project-transform/src/soundscript_packages.ts +754 -0
- package/project-transform/src/soundscript_runtime_specifiers.js +88 -0
- package/project-transform/src/soundscript_runtime_specifiers.ts +96 -0
- package/project-transform/src/stdlib/async.d.ts +81 -0
- package/project-transform/src/stdlib/async.js +213 -0
- package/project-transform/src/stdlib/async.ts +315 -0
- package/project-transform/src/stdlib/codec.d.ts +32 -0
- package/project-transform/src/stdlib/codec.js +30 -0
- package/project-transform/src/stdlib/codec.ts +76 -0
- package/project-transform/src/stdlib/compare.d.ts +28 -0
- package/project-transform/src/stdlib/compare.js +115 -0
- package/project-transform/src/stdlib/compare.ts +151 -0
- package/project-transform/src/stdlib/css.d.ts +16 -0
- package/project-transform/src/stdlib/css.js +9 -0
- package/project-transform/src/stdlib/css.ts +28 -0
- package/project-transform/src/stdlib/debug.d.ts +2 -0
- package/project-transform/src/stdlib/debug.js +9 -0
- package/project-transform/src/stdlib/debug.ts +10 -0
- package/project-transform/src/stdlib/decode.d.ts +86 -0
- package/project-transform/src/stdlib/decode.js +254 -0
- package/project-transform/src/stdlib/decode.ts +390 -0
- package/project-transform/src/stdlib/derive.d.ts +6 -0
- package/project-transform/src/stdlib/derive.js +7 -0
- package/project-transform/src/stdlib/derive.ts +7 -0
- package/project-transform/src/stdlib/encode.d.ts +100 -0
- package/project-transform/src/stdlib/encode.js +130 -0
- package/project-transform/src/stdlib/encode.ts +259 -0
- package/project-transform/src/stdlib/failures.d.ts +23 -0
- package/project-transform/src/stdlib/failures.js +41 -0
- package/project-transform/src/stdlib/failures.ts +64 -0
- package/project-transform/src/stdlib/fetch.d.ts +67 -0
- package/project-transform/src/stdlib/fetch.js +5 -0
- package/project-transform/src/stdlib/fetch.ts +11 -0
- package/project-transform/src/stdlib/graphql.d.ts +16 -0
- package/project-transform/src/stdlib/graphql.js +9 -0
- package/project-transform/src/stdlib/graphql.ts +28 -0
- package/project-transform/src/stdlib/hash.d.ts +34 -0
- package/project-transform/src/stdlib/hash.js +110 -0
- package/project-transform/src/stdlib/hash.ts +188 -0
- package/project-transform/src/stdlib/hkt.d.ts +40 -0
- package/project-transform/src/stdlib/hkt.js +3 -0
- package/project-transform/src/stdlib/hkt.ts +41 -0
- package/project-transform/src/stdlib/index.d.ts +9 -0
- package/project-transform/src/stdlib/index.js +15 -0
- package/project-transform/src/stdlib/index.ts +23 -0
- package/project-transform/src/stdlib/json.d.ts +125 -0
- package/project-transform/src/stdlib/json.js +764 -0
- package/project-transform/src/stdlib/json.ts +1034 -0
- package/project-transform/src/stdlib/match.d.ts +11 -0
- package/project-transform/src/stdlib/match.js +13 -0
- package/project-transform/src/stdlib/match.ts +26 -0
- package/project-transform/src/stdlib/numerics.d.ts +523 -0
- package/project-transform/src/stdlib/numerics.js +1356 -0
- package/project-transform/src/stdlib/numerics.ts +1937 -0
- package/project-transform/src/stdlib/random.d.ts +19 -0
- package/project-transform/src/stdlib/random.js +3 -0
- package/project-transform/src/stdlib/random.ts +5 -0
- package/project-transform/src/stdlib/result.d.ts +68 -0
- package/project-transform/src/stdlib/result.js +139 -0
- package/project-transform/src/stdlib/result.ts +248 -0
- package/project-transform/src/stdlib/sql.d.ts +22 -0
- package/project-transform/src/stdlib/sql.js +23 -0
- package/project-transform/src/stdlib/sql.ts +53 -0
- package/project-transform/src/stdlib/text.d.ts +24 -0
- package/project-transform/src/stdlib/text.js +3 -0
- package/project-transform/src/stdlib/text.ts +4 -0
- package/project-transform/src/stdlib/thunk.d.ts +2 -0
- package/project-transform/src/stdlib/thunk.js +9 -0
- package/project-transform/src/stdlib/thunk.ts +15 -0
- package/project-transform/src/stdlib/typeclasses.d.ts +57 -0
- package/project-transform/src/stdlib/typeclasses.js +78 -0
- package/project-transform/src/stdlib/typeclasses.ts +173 -0
- package/project-transform/src/stdlib/url.d.ts +37 -0
- package/project-transform/src/stdlib/url.js +3 -0
- package/project-transform/src/stdlib/url.ts +4 -0
- package/project-transform/src/stdlib/value.d.ts +9 -0
- package/project-transform/src/stdlib/value.js +104 -0
- package/project-transform/src/stdlib/value.ts +133 -0
- package/project-transform/src/test_installed_stdlib.js +147 -0
- package/project-transform/src/test_installed_stdlib.ts +245 -0
- package/project-transform/src/test_macro_package_fixture.js +50 -0
- package/project-transform/src/test_macro_package_fixture.ts +68 -0
- package/project-transform/src/value_deep_safe.js +191 -0
- package/project-transform/src/value_deep_safe.ts +273 -0
|
@@ -0,0 +1,838 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { expandPreparedProgramWithFileRegistries } from './macro_expander.js';
|
|
3
|
+
import { createPreparedProgram, mapProgramPositionToSource, mapSourcePositionToProgram, } from './project_frontend.js';
|
|
4
|
+
import { rewriteMacroSource } from './macro_rewrite.js';
|
|
5
|
+
import { createMacroSemantics } from './macro_semantics.js';
|
|
6
|
+
const COMPLETION_PLACEHOLDER_IDENTIFIER = '__sts_completion_target';
|
|
7
|
+
function isNestedMacroHoverTarget(value) {
|
|
8
|
+
return 'kind' in value;
|
|
9
|
+
}
|
|
10
|
+
function _getPrimaryExprSpan(invocation) {
|
|
11
|
+
if (getBlockSpan(invocation) || invocation.declarationSpan) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const expressionArguments = invocation.argumentSpans.filter((argument) => argument.kind === 'ExprArg');
|
|
15
|
+
if (expressionArguments.length !== 1 ||
|
|
16
|
+
expressionArguments.length !== invocation.argumentSpans.length) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return expressionArguments[0]?.span;
|
|
20
|
+
}
|
|
21
|
+
function getExprArgumentSpan(invocation, index) {
|
|
22
|
+
const argument = invocation.argumentSpans[index];
|
|
23
|
+
return argument?.kind === 'ExprArg' ? argument.span : undefined;
|
|
24
|
+
}
|
|
25
|
+
function _getExpressionArgumentSpan(invocation, expressionArgumentIndex) {
|
|
26
|
+
const expressionArguments = invocation.argumentSpans.filter((argument) => argument.kind === 'ExprArg');
|
|
27
|
+
return expressionArguments[expressionArgumentIndex]?.span;
|
|
28
|
+
}
|
|
29
|
+
function getBlockSpan(invocation) {
|
|
30
|
+
if (invocation.trailingBlockSpan) {
|
|
31
|
+
return invocation.trailingBlockSpan;
|
|
32
|
+
}
|
|
33
|
+
if (invocation.invocationKind === 'block') {
|
|
34
|
+
const [firstArgument] = invocation.argumentSpans;
|
|
35
|
+
if (firstArgument?.kind === 'BlockArg') {
|
|
36
|
+
return firstArgument.span;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
function containsPosition(span, position) {
|
|
42
|
+
return position >= span.start && position < span.end;
|
|
43
|
+
}
|
|
44
|
+
function isIdentifierPart(character) {
|
|
45
|
+
return character !== undefined && /[\p{ID_Continue}_$\u200C\u200D]/u.test(character);
|
|
46
|
+
}
|
|
47
|
+
function neutralizeMacroInvocation(invocation) {
|
|
48
|
+
return invocation.rewriteKind === 'expr' ? 'undefined' : '{}';
|
|
49
|
+
}
|
|
50
|
+
function replaceRange(text, start, end, replacement) {
|
|
51
|
+
return text.slice(0, start) + replacement + text.slice(end);
|
|
52
|
+
}
|
|
53
|
+
function createStageTwoPreparedFile(preparedFile) {
|
|
54
|
+
if (!preparedFile.postRewriteStage) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
diagnostics: preparedFile.diagnostics,
|
|
59
|
+
originalText: preparedFile.rewriteResult.rewrittenText,
|
|
60
|
+
rewriteResult: preparedFile.postRewriteStage,
|
|
61
|
+
rewrittenText: preparedFile.rewrittenText,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function mapProgramPositionToStageOne(preparedFile, position) {
|
|
65
|
+
const stageTwoPreparedFile = createStageTwoPreparedFile(preparedFile);
|
|
66
|
+
return stageTwoPreparedFile
|
|
67
|
+
? mapProgramPositionToSource(stageTwoPreparedFile, position).position
|
|
68
|
+
: position;
|
|
69
|
+
}
|
|
70
|
+
function mapStageOnePositionToProgram(preparedFile, position) {
|
|
71
|
+
const stageTwoPreparedFile = createStageTwoPreparedFile(preparedFile);
|
|
72
|
+
return stageTwoPreparedFile
|
|
73
|
+
? mapSourcePositionToProgram(stageTwoPreparedFile, position).position
|
|
74
|
+
: position;
|
|
75
|
+
}
|
|
76
|
+
function appendMappedText(output, mappings, text, sourceStart) {
|
|
77
|
+
if (text.length === 0) {
|
|
78
|
+
return output;
|
|
79
|
+
}
|
|
80
|
+
const generatedStart = output.length;
|
|
81
|
+
mappings.push({
|
|
82
|
+
generatedStart,
|
|
83
|
+
generatedEnd: generatedStart + text.length,
|
|
84
|
+
sourceStart,
|
|
85
|
+
sourceEnd: sourceStart + text.length,
|
|
86
|
+
});
|
|
87
|
+
return output + text;
|
|
88
|
+
}
|
|
89
|
+
function collectInvocationsInRegion(fileName, originalText, regionSpan) {
|
|
90
|
+
const rewriteResult = rewriteMacroSource(fileName, originalText, new Map(), getAlwaysAvailableBuiltinMacroSiteKinds());
|
|
91
|
+
if (rewriteResult.replacements.length === 0) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
return rewriteResult.replacements
|
|
95
|
+
.map((replacement) => rewriteResult.macrosById.get(replacement.id))
|
|
96
|
+
.filter((invocation) => invocation !== undefined &&
|
|
97
|
+
invocation.span.start >= regionSpan.start &&
|
|
98
|
+
invocation.span.start < regionSpan.end &&
|
|
99
|
+
invocation.span.end <= regionSpan.end)
|
|
100
|
+
.sort((left, right) => left.span.start - right.span.start || left.span.end - right.span.end);
|
|
101
|
+
}
|
|
102
|
+
function findContainingStatement(node) {
|
|
103
|
+
let current = node;
|
|
104
|
+
while (current && !ts.isSourceFile(current)) {
|
|
105
|
+
if (ts.isStatement(current)) {
|
|
106
|
+
let statement = current;
|
|
107
|
+
while (statement.parent && ts.isLabeledStatement(statement.parent)) {
|
|
108
|
+
statement = statement.parent;
|
|
109
|
+
}
|
|
110
|
+
return statement;
|
|
111
|
+
}
|
|
112
|
+
current = current.parent;
|
|
113
|
+
}
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
function isSentinelStatement(statement, name) {
|
|
117
|
+
return ts.isExpressionStatement(statement) &&
|
|
118
|
+
ts.isCallExpression(statement.expression) &&
|
|
119
|
+
ts.isIdentifier(statement.expression.expression) &&
|
|
120
|
+
statement.expression.expression.text === name &&
|
|
121
|
+
statement.expression.arguments.length === 0;
|
|
122
|
+
}
|
|
123
|
+
function findStatementRegionBetweenSentinels(node, beforeName, afterName) {
|
|
124
|
+
const statements = (() => {
|
|
125
|
+
if (ts.isSourceFile(node) || ts.isBlock(node) || ts.isModuleBlock(node)) {
|
|
126
|
+
return node.statements;
|
|
127
|
+
}
|
|
128
|
+
if (ts.isCaseClause(node) || ts.isDefaultClause(node)) {
|
|
129
|
+
return node.statements;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
})();
|
|
133
|
+
if (statements) {
|
|
134
|
+
const beforeIndex = statements.findIndex((statement) => isSentinelStatement(statement, beforeName));
|
|
135
|
+
const afterIndex = statements.findIndex((statement) => isSentinelStatement(statement, afterName));
|
|
136
|
+
if (beforeIndex >= 0 && afterIndex > beforeIndex) {
|
|
137
|
+
return statements.slice(beforeIndex + 1, afterIndex);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return ts.forEachChild(node, (child) => findStatementRegionBetweenSentinels(child, beforeName, afterName)) ?? null;
|
|
141
|
+
}
|
|
142
|
+
function findCaptureCallInStatement(statement, captureName) {
|
|
143
|
+
let found;
|
|
144
|
+
function visit(node) {
|
|
145
|
+
if (ts.isCallExpression(node) &&
|
|
146
|
+
ts.isIdentifier(node.expression) &&
|
|
147
|
+
node.expression.text === captureName) {
|
|
148
|
+
found = node;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
ts.forEachChild(node, visit);
|
|
152
|
+
}
|
|
153
|
+
visit(statement);
|
|
154
|
+
return found;
|
|
155
|
+
}
|
|
156
|
+
function printNode(sourceFile, node, hint) {
|
|
157
|
+
return ts.createPrinter({ removeComments: false }).printNode(hint, node, sourceFile);
|
|
158
|
+
}
|
|
159
|
+
function collectSyntheticNames(statements) {
|
|
160
|
+
const names = new Set();
|
|
161
|
+
function collectBindingName(name) {
|
|
162
|
+
if (ts.isIdentifier(name) && name.text.startsWith('__sts_')) {
|
|
163
|
+
names.add(name.text);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (ts.isObjectBindingPattern(name) || ts.isArrayBindingPattern(name)) {
|
|
167
|
+
for (const element of name.elements) {
|
|
168
|
+
if (ts.isBindingElement(element)) {
|
|
169
|
+
collectBindingName(element.name);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function visit(node) {
|
|
175
|
+
if (ts.isVariableDeclaration(node)) {
|
|
176
|
+
collectBindingName(node.name);
|
|
177
|
+
}
|
|
178
|
+
else if (ts.isLabeledStatement(node) && node.label.text.startsWith('__sts_')) {
|
|
179
|
+
names.add(node.label.text);
|
|
180
|
+
}
|
|
181
|
+
ts.forEachChild(node, visit);
|
|
182
|
+
}
|
|
183
|
+
for (const statement of statements) {
|
|
184
|
+
visit(statement);
|
|
185
|
+
}
|
|
186
|
+
return names;
|
|
187
|
+
}
|
|
188
|
+
function renameSyntheticNamesInNode(node, renameMap) {
|
|
189
|
+
if (renameMap.size === 0) {
|
|
190
|
+
return node;
|
|
191
|
+
}
|
|
192
|
+
const transformed = ts.transform(node, [
|
|
193
|
+
(context) => {
|
|
194
|
+
const visitor = (current) => {
|
|
195
|
+
if (ts.isIdentifier(current)) {
|
|
196
|
+
const renamed = renameMap.get(current.text);
|
|
197
|
+
if (renamed) {
|
|
198
|
+
return ts.factory.createIdentifier(renamed);
|
|
199
|
+
}
|
|
200
|
+
return current;
|
|
201
|
+
}
|
|
202
|
+
if (ts.isLabeledStatement(current)) {
|
|
203
|
+
const renamed = renameMap.get(current.label.text);
|
|
204
|
+
if (renamed) {
|
|
205
|
+
return ts.factory.updateLabeledStatement(current, ts.factory.createIdentifier(renamed), ts.visitNode(current.statement, visitor));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (ts.isBreakStatement(current) && current.label) {
|
|
209
|
+
const renamed = renameMap.get(current.label.text);
|
|
210
|
+
if (renamed) {
|
|
211
|
+
return ts.factory.updateBreakStatement(current, ts.factory.createIdentifier(renamed));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (ts.isContinueStatement(current) && current.label) {
|
|
215
|
+
const renamed = renameMap.get(current.label.text);
|
|
216
|
+
if (renamed) {
|
|
217
|
+
return ts.factory.updateContinueStatement(current, ts.factory.createIdentifier(renamed));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return ts.visitEachChild(current, visitor, context);
|
|
221
|
+
};
|
|
222
|
+
return (root) => ts.visitNode(root, visitor);
|
|
223
|
+
},
|
|
224
|
+
]);
|
|
225
|
+
try {
|
|
226
|
+
return transformed.transformed[0];
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
transformed.dispose();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function containsNestedAdvancedMacroCall(fileName, operandText, advancedRegistry) {
|
|
233
|
+
if (advancedRegistry.size === 0) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
const sourceFile = ts.createSourceFile(fileName, `const __sts_probe = ${operandText};`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
237
|
+
let found = false;
|
|
238
|
+
const visit = (node) => {
|
|
239
|
+
if (ts.isCallExpression(node) &&
|
|
240
|
+
ts.isIdentifier(node.expression) &&
|
|
241
|
+
/^[A-Z]/u.test(node.expression.text) &&
|
|
242
|
+
advancedRegistry.has(node.expression.text)) {
|
|
243
|
+
found = true;
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
ts.forEachChild(node, visit);
|
|
247
|
+
};
|
|
248
|
+
ts.forEachChild(sourceFile, visit);
|
|
249
|
+
return found;
|
|
250
|
+
}
|
|
251
|
+
function expandNestedOperandSource(preparedProgram, resolved, patchedText, nestedRegistries) {
|
|
252
|
+
const replacement = resolved.placeholder.replacement;
|
|
253
|
+
const rewrittenProgramFileName = preparedProgram.toProgramFileName(replacement.rewrittenSpan.fileName);
|
|
254
|
+
const nestedPreparedProgram = createPreparedProgram({
|
|
255
|
+
baseHost: preparedProgram.preparedHost.host,
|
|
256
|
+
fileOverrides: new Map([[replacement.rewrittenSpan.fileName, patchedText]]),
|
|
257
|
+
importedMacroSiteKindsBySpecifier: nestedRegistries.siteKindsBySpecifier ?? new Map(),
|
|
258
|
+
options: preparedProgram.options,
|
|
259
|
+
rootNames: preparedProgram.rootNames,
|
|
260
|
+
});
|
|
261
|
+
const expandedFiles = expandPreparedProgramWithFileRegistries(nestedPreparedProgram, new Map([[
|
|
262
|
+
rewrittenProgramFileName,
|
|
263
|
+
{
|
|
264
|
+
registry: nestedRegistries.rewrite,
|
|
265
|
+
advancedRegistry: nestedRegistries.advanced,
|
|
266
|
+
},
|
|
267
|
+
]]));
|
|
268
|
+
const expandedSourceFile = expandedFiles.get(rewrittenProgramFileName);
|
|
269
|
+
if (!expandedSourceFile) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const expandedText = printNode(expandedSourceFile, expandedSourceFile, ts.EmitHint.Unspecified);
|
|
273
|
+
const overrideHost = {
|
|
274
|
+
...nestedPreparedProgram.preparedHost.host,
|
|
275
|
+
getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
|
|
276
|
+
if (fileName === rewrittenProgramFileName) {
|
|
277
|
+
return ts.createSourceFile(fileName, expandedText, languageVersion, true);
|
|
278
|
+
}
|
|
279
|
+
return nestedPreparedProgram.preparedHost.host.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);
|
|
280
|
+
},
|
|
281
|
+
readFile(fileName) {
|
|
282
|
+
if (fileName === rewrittenProgramFileName) {
|
|
283
|
+
return expandedText;
|
|
284
|
+
}
|
|
285
|
+
return nestedPreparedProgram.preparedHost.host.readFile(fileName);
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
const finalProgram = ts.createProgram({
|
|
289
|
+
host: overrideHost,
|
|
290
|
+
options: nestedPreparedProgram.options,
|
|
291
|
+
rootNames: nestedPreparedProgram.rootNames.map((fileName) => nestedPreparedProgram.toProgramFileName(fileName)),
|
|
292
|
+
});
|
|
293
|
+
return finalProgram.getSourceFile(rewrittenProgramFileName) ?? null;
|
|
294
|
+
}
|
|
295
|
+
function materializeNestedOperandExpansionViaCapture(preparedProgram, resolved, operandText, nestedRegistries) {
|
|
296
|
+
const replacement = resolved.placeholder.replacement;
|
|
297
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
298
|
+
const sourceFile = resolved.callExpression.getSourceFile();
|
|
299
|
+
const containingStatement = findContainingStatement(resolved.callExpression);
|
|
300
|
+
if (!containingStatement) {
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
const captureName = '__sts_nested_capture';
|
|
304
|
+
const beforeName = '__sts_nested_before';
|
|
305
|
+
const afterName = '__sts_nested_after';
|
|
306
|
+
const statementStart = mapProgramPositionToStageOne(preparedFile, containingStatement.getStart(sourceFile));
|
|
307
|
+
const statementEnd = mapProgramPositionToStageOne(preparedFile, containingStatement.getEnd());
|
|
308
|
+
const replacementStart = replacement.rewrittenSpan.start;
|
|
309
|
+
const replacementEnd = replacement.rewrittenSpan.end;
|
|
310
|
+
const statementText = preparedFile.rewriteResult.rewrittenText.slice(statementStart, statementEnd);
|
|
311
|
+
const patchedStatementText = replaceRange(statementText, replacementStart - statementStart, replacementEnd - statementStart, `${captureName}(${operandText})`);
|
|
312
|
+
const patchedText = [
|
|
313
|
+
preparedFile.rewriteResult.rewrittenText.slice(0, statementStart),
|
|
314
|
+
`${beforeName}();\n${patchedStatementText}\n${afterName}();`,
|
|
315
|
+
preparedFile.rewriteResult.rewrittenText.slice(statementEnd),
|
|
316
|
+
].join('');
|
|
317
|
+
const finalSourceFile = expandNestedOperandSource(preparedProgram, resolved, patchedText, nestedRegistries);
|
|
318
|
+
if (!finalSourceFile) {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
const statementRegion = findStatementRegionBetweenSentinels(finalSourceFile, beforeName, afterName);
|
|
322
|
+
if (!statementRegion || statementRegion.length === 0) {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
const filteredRegion = statementRegion.filter((statement) => !isSentinelStatement(statement, beforeName) && !isSentinelStatement(statement, afterName));
|
|
326
|
+
if (filteredRegion.length === 0) {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
const statementIndex = filteredRegion.findIndex((statement) => findCaptureCallInStatement(statement, captureName) !== undefined);
|
|
330
|
+
if (statementIndex < 0) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
const captureCall = findCaptureCallInStatement(filteredRegion[statementIndex], captureName);
|
|
334
|
+
if (!captureCall || captureCall.arguments.length !== 1) {
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
const syntheticNames = collectSyntheticNames(filteredRegion);
|
|
338
|
+
const renameMap = new Map();
|
|
339
|
+
for (const syntheticName of syntheticNames) {
|
|
340
|
+
renameMap.set(syntheticName, `${syntheticName}__nested_${resolved.placeholder.id}`);
|
|
341
|
+
}
|
|
342
|
+
const renamedPreludeStatements = filteredRegion
|
|
343
|
+
.slice(0, statementIndex)
|
|
344
|
+
.map((statement) => renameSyntheticNamesInNode(statement, renameMap));
|
|
345
|
+
const renamedExpression = renameSyntheticNamesInNode(captureCall.arguments[0], renameMap);
|
|
346
|
+
return {
|
|
347
|
+
expressionText: printNode(finalSourceFile, renamedExpression, ts.EmitHint.Expression),
|
|
348
|
+
preludeTexts: renamedPreludeStatements.map((statement) => printNode(finalSourceFile, statement, ts.EmitHint.Unspecified)),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function materializeNestedOperandExpansionViaTempBinding(preparedProgram, resolved, operandText, nestedRegistries) {
|
|
352
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
353
|
+
const sourceFile = resolved.callExpression.getSourceFile();
|
|
354
|
+
const containingStatement = findContainingStatement(resolved.callExpression);
|
|
355
|
+
if (!containingStatement) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
const beforeName = '__sts_nested_before';
|
|
359
|
+
const afterName = '__sts_nested_after';
|
|
360
|
+
const resultName = '__sts_nested_result';
|
|
361
|
+
const statementStart = mapProgramPositionToStageOne(preparedFile, containingStatement.getStart(sourceFile));
|
|
362
|
+
const patchedText = [
|
|
363
|
+
preparedFile.rewriteResult.rewrittenText.slice(0, statementStart),
|
|
364
|
+
`${beforeName}();\nconst ${resultName} = ${operandText};\n${afterName}();\n`,
|
|
365
|
+
preparedFile.rewriteResult.rewrittenText.slice(statementStart),
|
|
366
|
+
].join('');
|
|
367
|
+
const finalSourceFile = expandNestedOperandSource(preparedProgram, resolved, patchedText, nestedRegistries);
|
|
368
|
+
if (!finalSourceFile) {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
const statementRegion = findStatementRegionBetweenSentinels(finalSourceFile, beforeName, afterName);
|
|
372
|
+
if (!statementRegion || statementRegion.length === 0) {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
const filteredRegion = statementRegion.filter((statement) => !isSentinelStatement(statement, beforeName) && !isSentinelStatement(statement, afterName));
|
|
376
|
+
if (filteredRegion.length === 0) {
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
const syntheticNames = collectSyntheticNames(filteredRegion);
|
|
380
|
+
const renameMap = new Map();
|
|
381
|
+
for (const syntheticName of syntheticNames) {
|
|
382
|
+
renameMap.set(syntheticName, `${syntheticName}__nested_${resolved.placeholder.id}`);
|
|
383
|
+
}
|
|
384
|
+
const renamedPreludeStatements = filteredRegion.map((statement) => renameSyntheticNamesInNode(statement, renameMap));
|
|
385
|
+
const renamedResultName = renameMap.get(resultName) ?? resultName;
|
|
386
|
+
return {
|
|
387
|
+
expressionText: renamedResultName,
|
|
388
|
+
preludeTexts: renamedPreludeStatements.map((statement) => printNode(finalSourceFile, statement, ts.EmitHint.Unspecified)),
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function materializeNestedOperandExpansion(preparedProgram, resolved, operandText, nestedRegistries) {
|
|
392
|
+
return containsNestedAdvancedMacroCall(resolved.placeholder.invocation.fileName, operandText, nestedRegistries.advanced)
|
|
393
|
+
? materializeNestedOperandExpansionViaTempBinding(preparedProgram, resolved, operandText, nestedRegistries)
|
|
394
|
+
: materializeNestedOperandExpansionViaCapture(preparedProgram, resolved, operandText, nestedRegistries);
|
|
395
|
+
}
|
|
396
|
+
function findExpressionAtSpan(sourceFile, start, end) {
|
|
397
|
+
let found;
|
|
398
|
+
function visit(node) {
|
|
399
|
+
if (ts.isExpression(node) &&
|
|
400
|
+
node.getStart(sourceFile) === start &&
|
|
401
|
+
node.getEnd() === end) {
|
|
402
|
+
found = node;
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
ts.forEachChild(node, visit);
|
|
406
|
+
}
|
|
407
|
+
visit(sourceFile);
|
|
408
|
+
return found;
|
|
409
|
+
}
|
|
410
|
+
function findDeepestNodeContainingPosition(node, position) {
|
|
411
|
+
if (position < node.getFullStart() || position >= node.getEnd()) {
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
const child = ts.forEachChild(node, (currentChild) => findDeepestNodeContainingPosition(currentChild, position));
|
|
415
|
+
return child ?? node;
|
|
416
|
+
}
|
|
417
|
+
function createPatchedMacroSource(preparedProgram, resolved, replacementText) {
|
|
418
|
+
const replacement = resolved.placeholder.replacement;
|
|
419
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
420
|
+
const rewrittenFileName = preparedProgram.toProgramFileName(replacement.rewrittenSpan.fileName);
|
|
421
|
+
const programReplacementStart = mapStageOnePositionToProgram(preparedFile, replacement.rewrittenSpan.start);
|
|
422
|
+
const programReplacementEnd = mapStageOnePositionToProgram(preparedFile, replacement.rewrittenSpan.end);
|
|
423
|
+
const patchedText = replaceRange(preparedFile.rewrittenText, programReplacementStart, programReplacementEnd, replacementText);
|
|
424
|
+
const overrideHost = {
|
|
425
|
+
...preparedProgram.preparedHost.host,
|
|
426
|
+
getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
|
|
427
|
+
if (fileName === rewrittenFileName) {
|
|
428
|
+
return ts.createSourceFile(fileName, patchedText, languageVersion, true);
|
|
429
|
+
}
|
|
430
|
+
return preparedProgram.preparedHost.host.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);
|
|
431
|
+
},
|
|
432
|
+
readFile(fileName) {
|
|
433
|
+
if (fileName === rewrittenFileName) {
|
|
434
|
+
return patchedText;
|
|
435
|
+
}
|
|
436
|
+
return preparedProgram.preparedHost.host.readFile(fileName);
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
const patchedProgram = ts.createProgram({
|
|
440
|
+
host: overrideHost,
|
|
441
|
+
options: preparedProgram.options,
|
|
442
|
+
rootNames: preparedProgram.rootNames.map((fileName) => preparedProgram.toProgramFileName(fileName)),
|
|
443
|
+
});
|
|
444
|
+
const patchedSourceFile = patchedProgram.getSourceFile(rewrittenFileName);
|
|
445
|
+
if (!patchedSourceFile) {
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
checker: patchedProgram.getTypeChecker(),
|
|
450
|
+
originalReplacementEnd: programReplacementEnd,
|
|
451
|
+
originalReplacementStart: programReplacementStart,
|
|
452
|
+
rewrittenStart: programReplacementStart,
|
|
453
|
+
semantics: createMacroSemantics(patchedProgram),
|
|
454
|
+
sourceFile: patchedSourceFile,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
export function materializeRegionForHover(fileName, originalText, regionSpan, sourcePosition) {
|
|
458
|
+
let cursor = regionSpan.start;
|
|
459
|
+
let output = '';
|
|
460
|
+
let hoverPosition;
|
|
461
|
+
const mappings = [];
|
|
462
|
+
for (const parsed of collectInvocationsInRegion(fileName, originalText, regionSpan)) {
|
|
463
|
+
if (parsed.span.start < cursor || parsed.span.start >= regionSpan.end) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
output = appendMappedText(output, mappings, originalText.slice(cursor, parsed.span.start), cursor);
|
|
467
|
+
if (hoverPosition === undefined && sourcePosition < parsed.span.start) {
|
|
468
|
+
hoverPosition = output.length - (parsed.span.start - sourcePosition);
|
|
469
|
+
}
|
|
470
|
+
if (!containsPosition(parsed.span, sourcePosition)) {
|
|
471
|
+
output += neutralizeMacroInvocation(parsed);
|
|
472
|
+
cursor = parsed.span.end;
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
if (containsPosition(parsed.nameSpan, sourcePosition) ||
|
|
476
|
+
containsPosition(parsed.hashSpan, sourcePosition)) {
|
|
477
|
+
return {
|
|
478
|
+
kind: 'macro',
|
|
479
|
+
invocation: parsed,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
const expressionArguments = parsed.argumentSpans.filter((argument) => argument.kind === 'ExprArg');
|
|
483
|
+
const hoveredExpressionArgument = expressionArguments.find((argument) => containsPosition(argument.span, sourcePosition));
|
|
484
|
+
if (hoveredExpressionArgument) {
|
|
485
|
+
const nested = materializeRegionForHover(fileName, originalText, hoveredExpressionArgument.span, sourcePosition);
|
|
486
|
+
if (isNestedMacroHoverTarget(nested)) {
|
|
487
|
+
return nested;
|
|
488
|
+
}
|
|
489
|
+
hoverPosition = output.length + nested.hoverPosition;
|
|
490
|
+
const generatedOffset = output.length;
|
|
491
|
+
mappings.push(...nested.mappings.map((mapping) => ({
|
|
492
|
+
generatedStart: mapping.generatedStart + generatedOffset,
|
|
493
|
+
generatedEnd: mapping.generatedEnd + generatedOffset,
|
|
494
|
+
sourceStart: mapping.sourceStart,
|
|
495
|
+
sourceEnd: mapping.sourceEnd,
|
|
496
|
+
})));
|
|
497
|
+
output += nested.text;
|
|
498
|
+
cursor = parsed.span.end;
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
const blockSpan = getBlockSpan(parsed);
|
|
502
|
+
if (blockSpan && containsPosition(blockSpan, sourcePosition)) {
|
|
503
|
+
const nested = materializeRegionForHover(fileName, originalText, blockSpan, sourcePosition);
|
|
504
|
+
if (isNestedMacroHoverTarget(nested)) {
|
|
505
|
+
return nested;
|
|
506
|
+
}
|
|
507
|
+
hoverPosition = output.length + nested.hoverPosition;
|
|
508
|
+
const generatedOffset = output.length;
|
|
509
|
+
mappings.push(...nested.mappings.map((mapping) => ({
|
|
510
|
+
generatedStart: mapping.generatedStart + generatedOffset,
|
|
511
|
+
generatedEnd: mapping.generatedEnd + generatedOffset,
|
|
512
|
+
sourceStart: mapping.sourceStart,
|
|
513
|
+
sourceEnd: mapping.sourceEnd,
|
|
514
|
+
})));
|
|
515
|
+
output += nested.text;
|
|
516
|
+
cursor = parsed.span.end;
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
return {
|
|
520
|
+
kind: 'macro',
|
|
521
|
+
invocation: parsed,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
output = appendMappedText(output, mappings, originalText.slice(cursor, regionSpan.end), cursor);
|
|
525
|
+
if (hoverPosition === undefined) {
|
|
526
|
+
hoverPosition = output.length - (regionSpan.end - sourcePosition);
|
|
527
|
+
}
|
|
528
|
+
return {
|
|
529
|
+
hoverPosition,
|
|
530
|
+
mappings,
|
|
531
|
+
text: output,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
export function materializeRegionForAnalysis(fileName, originalText, regionSpan) {
|
|
535
|
+
let cursor = regionSpan.start;
|
|
536
|
+
let output = '';
|
|
537
|
+
const mappings = [];
|
|
538
|
+
for (const parsed of collectInvocationsInRegion(fileName, originalText, regionSpan)) {
|
|
539
|
+
if (parsed.span.start < cursor || parsed.span.start >= regionSpan.end) {
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
output = appendMappedText(output, mappings, originalText.slice(cursor, parsed.span.start), cursor);
|
|
543
|
+
output += neutralizeMacroInvocation(parsed);
|
|
544
|
+
cursor = parsed.span.end;
|
|
545
|
+
}
|
|
546
|
+
output = appendMappedText(output, mappings, originalText.slice(cursor, regionSpan.end), cursor);
|
|
547
|
+
return {
|
|
548
|
+
hoverPosition: 0,
|
|
549
|
+
mappings,
|
|
550
|
+
text: output,
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function patchMaterializedRegionForCompletion(materializedRegion) {
|
|
554
|
+
let prefixStart = materializedRegion.hoverPosition;
|
|
555
|
+
while (prefixStart > 0 && isIdentifierPart(materializedRegion.text[prefixStart - 1])) {
|
|
556
|
+
prefixStart -= 1;
|
|
557
|
+
}
|
|
558
|
+
if (prefixStart > 0 && materializedRegion.text[prefixStart - 1] === '.') {
|
|
559
|
+
const patchedText = materializedRegion.text.slice(0, materializedRegion.hoverPosition) +
|
|
560
|
+
COMPLETION_PLACEHOLDER_IDENTIFIER +
|
|
561
|
+
materializedRegion.text.slice(materializedRegion.hoverPosition);
|
|
562
|
+
return {
|
|
563
|
+
lookupPosition: materializedRegion.hoverPosition + COMPLETION_PLACEHOLDER_IDENTIFIER.length -
|
|
564
|
+
1,
|
|
565
|
+
text: patchedText,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
return {
|
|
569
|
+
lookupPosition: Math.max(0, materializedRegion.hoverPosition - 1),
|
|
570
|
+
text: materializedRegion.text,
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
function resolveNodeFromMaterializedRegion(preparedProgram, resolved, materializedRegion, useCompletionPatch = false) {
|
|
574
|
+
const patchedMaterializedRegion = useCompletionPatch
|
|
575
|
+
? patchMaterializedRegionForCompletion(materializedRegion)
|
|
576
|
+
: {
|
|
577
|
+
lookupPosition: materializedRegion.hoverPosition,
|
|
578
|
+
text: materializedRegion.text,
|
|
579
|
+
};
|
|
580
|
+
const patchedSource = createPatchedMacroSource(preparedProgram, resolved, patchedMaterializedRegion.text);
|
|
581
|
+
if (!patchedSource) {
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
const patchedPosition = patchedSource.rewrittenStart + patchedMaterializedRegion.lookupPosition;
|
|
585
|
+
const node = findDeepestNodeContainingPosition(patchedSource.sourceFile, patchedPosition);
|
|
586
|
+
if (!node || ts.isSourceFile(node) || ts.isBlock(node)) {
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
589
|
+
return {
|
|
590
|
+
checker: patchedSource.checker,
|
|
591
|
+
materializedRegion,
|
|
592
|
+
node,
|
|
593
|
+
originalReplacementEnd: patchedSource.originalReplacementEnd,
|
|
594
|
+
originalReplacementStart: patchedSource.originalReplacementStart,
|
|
595
|
+
rewrittenStart: patchedSource.rewrittenStart,
|
|
596
|
+
semantics: patchedSource.semantics,
|
|
597
|
+
sourceFile: patchedSource.sourceFile,
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
export function wrapMaterializedRegion(materializedRegion, prefixText, suffixText) {
|
|
601
|
+
const generatedOffset = prefixText.length;
|
|
602
|
+
return {
|
|
603
|
+
hoverPosition: generatedOffset + materializedRegion.hoverPosition,
|
|
604
|
+
mappings: materializedRegion.mappings.map((mapping) => ({
|
|
605
|
+
generatedStart: mapping.generatedStart + generatedOffset,
|
|
606
|
+
generatedEnd: mapping.generatedEnd + generatedOffset,
|
|
607
|
+
sourceStart: mapping.sourceStart,
|
|
608
|
+
sourceEnd: mapping.sourceEnd,
|
|
609
|
+
})),
|
|
610
|
+
text: `${prefixText}${materializedRegion.text}${suffixText}`,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
export function resolveNodeAtMaterializedRegion(preparedProgram, resolved, materializedRegion) {
|
|
614
|
+
return resolveNodeFromMaterializedRegion(preparedProgram, resolved, materializedRegion);
|
|
615
|
+
}
|
|
616
|
+
export function resolveCompletionNodeAtMaterializedRegion(preparedProgram, resolved, materializedRegion) {
|
|
617
|
+
return resolveNodeFromMaterializedRegion(preparedProgram, resolved, materializedRegion, true);
|
|
618
|
+
}
|
|
619
|
+
export function createPatchedMacroRegion(preparedProgram, resolved, materializedRegion) {
|
|
620
|
+
const patchedSource = createPatchedMacroSource(preparedProgram, resolved, materializedRegion.text);
|
|
621
|
+
if (!patchedSource) {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
return {
|
|
625
|
+
checker: patchedSource.checker,
|
|
626
|
+
materializedRegion,
|
|
627
|
+
originalReplacementEnd: patchedSource.originalReplacementEnd,
|
|
628
|
+
originalReplacementStart: patchedSource.originalReplacementStart,
|
|
629
|
+
rewrittenStart: patchedSource.rewrittenStart,
|
|
630
|
+
semantics: patchedSource.semantics,
|
|
631
|
+
sourceFile: patchedSource.sourceFile,
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
export function mapMaterializedRangeToSource(materializedRegion, generatedStart, generatedEnd) {
|
|
635
|
+
const clampedStart = Math.max(0, Math.min(generatedStart, materializedRegion.text.length));
|
|
636
|
+
const clampedEnd = Math.max(clampedStart, Math.min(generatedEnd, materializedRegion.text.length));
|
|
637
|
+
const intersectingMappings = materializedRegion.mappings.filter((mapping) => !(clampedEnd <= mapping.generatedStart || clampedStart >= mapping.generatedEnd));
|
|
638
|
+
if (intersectingMappings.length === 0) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
const first = intersectingMappings[0];
|
|
642
|
+
const last = intersectingMappings[intersectingMappings.length - 1];
|
|
643
|
+
const start = first.sourceStart + Math.max(0, clampedStart - first.generatedStart);
|
|
644
|
+
const end = last.sourceStart + Math.max(0, clampedEnd - last.generatedStart);
|
|
645
|
+
let previousGeneratedEnd = Math.max(clampedStart, first.generatedStart);
|
|
646
|
+
let intersectsUnmapped = first.generatedStart > clampedStart;
|
|
647
|
+
for (const mapping of intersectingMappings) {
|
|
648
|
+
if (mapping.generatedStart > previousGeneratedEnd) {
|
|
649
|
+
intersectsUnmapped = true;
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
previousGeneratedEnd = Math.max(previousGeneratedEnd, mapping.generatedEnd);
|
|
653
|
+
}
|
|
654
|
+
if (previousGeneratedEnd < clampedEnd) {
|
|
655
|
+
intersectsUnmapped = true;
|
|
656
|
+
}
|
|
657
|
+
return {
|
|
658
|
+
start,
|
|
659
|
+
end: Math.max(start, end),
|
|
660
|
+
intersectsUnmapped,
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
export function resolveExpressionNodeAtSourcePosition(preparedProgram, resolved, sourcePosition) {
|
|
664
|
+
const invocation = resolved.placeholder.invocation;
|
|
665
|
+
const expressionArguments = invocation.argumentSpans.filter((argument) => argument.kind === 'ExprArg');
|
|
666
|
+
const hoveredExpressionArgument = expressionArguments.find((argument) => containsPosition(argument.span, sourcePosition));
|
|
667
|
+
if (!hoveredExpressionArgument) {
|
|
668
|
+
return null;
|
|
669
|
+
}
|
|
670
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
671
|
+
const materialized = materializeRegionForHover(invocation.fileName, preparedFile.originalText, hoveredExpressionArgument.span, sourcePosition);
|
|
672
|
+
if (isNestedMacroHoverTarget(materialized)) {
|
|
673
|
+
return materialized;
|
|
674
|
+
}
|
|
675
|
+
return resolveNodeFromMaterializedRegion(preparedProgram, resolved, materialized);
|
|
676
|
+
}
|
|
677
|
+
export function resolveBlockNodeAtSourcePosition(preparedProgram, resolved, sourcePosition) {
|
|
678
|
+
const blockSpan = getBlockSpan(resolved.placeholder.invocation);
|
|
679
|
+
if (!blockSpan || sourcePosition < blockSpan.start || sourcePosition >= blockSpan.end) {
|
|
680
|
+
return null;
|
|
681
|
+
}
|
|
682
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
683
|
+
const materialized = materializeRegionForHover(resolved.placeholder.invocation.fileName, preparedFile.originalText, blockSpan, sourcePosition);
|
|
684
|
+
if (isNestedMacroHoverTarget(materialized)) {
|
|
685
|
+
return materialized;
|
|
686
|
+
}
|
|
687
|
+
const resolvedNode = resolveNodeFromMaterializedRegion(preparedProgram, resolved, materialized);
|
|
688
|
+
if (!resolvedNode) {
|
|
689
|
+
return null;
|
|
690
|
+
}
|
|
691
|
+
return {
|
|
692
|
+
...resolvedNode,
|
|
693
|
+
originalBlockSpan: blockSpan,
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
export function resolveExpressionCompletionNodeAtSourcePosition(preparedProgram, resolved, sourcePosition) {
|
|
697
|
+
const invocation = resolved.placeholder.invocation;
|
|
698
|
+
const expressionArguments = invocation.argumentSpans.filter((argument) => argument.kind === 'ExprArg');
|
|
699
|
+
const hoveredExpressionArgument = expressionArguments.find((argument) => containsPosition(argument.span, sourcePosition) || argument.span.end === sourcePosition);
|
|
700
|
+
if (!hoveredExpressionArgument) {
|
|
701
|
+
return null;
|
|
702
|
+
}
|
|
703
|
+
const effectiveSourcePosition = sourcePosition === hoveredExpressionArgument.span.end
|
|
704
|
+
? Math.max(hoveredExpressionArgument.span.start, sourcePosition - 1)
|
|
705
|
+
: sourcePosition;
|
|
706
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
707
|
+
const materialized = materializeRegionForHover(invocation.fileName, preparedFile.originalText, hoveredExpressionArgument.span, effectiveSourcePosition);
|
|
708
|
+
if (isNestedMacroHoverTarget(materialized)) {
|
|
709
|
+
return materialized;
|
|
710
|
+
}
|
|
711
|
+
const completionMaterialized = sourcePosition === hoveredExpressionArgument.span.end
|
|
712
|
+
? { ...materialized, hoverPosition: materialized.text.length }
|
|
713
|
+
: materialized;
|
|
714
|
+
return resolveNodeFromMaterializedRegion(preparedProgram, resolved, completionMaterialized, true);
|
|
715
|
+
}
|
|
716
|
+
export function resolveBlockCompletionNodeAtSourcePosition(preparedProgram, resolved, sourcePosition) {
|
|
717
|
+
const blockSpan = getBlockSpan(resolved.placeholder.invocation);
|
|
718
|
+
if (!blockSpan || sourcePosition < blockSpan.start || sourcePosition > blockSpan.end) {
|
|
719
|
+
return null;
|
|
720
|
+
}
|
|
721
|
+
const effectiveSourcePosition = sourcePosition === blockSpan.end
|
|
722
|
+
? Math.max(blockSpan.start, sourcePosition - 1)
|
|
723
|
+
: sourcePosition;
|
|
724
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
725
|
+
const materialized = materializeRegionForHover(resolved.placeholder.invocation.fileName, preparedFile.originalText, blockSpan, effectiveSourcePosition);
|
|
726
|
+
if (isNestedMacroHoverTarget(materialized)) {
|
|
727
|
+
return materialized;
|
|
728
|
+
}
|
|
729
|
+
const completionMaterialized = sourcePosition === blockSpan.end
|
|
730
|
+
? { ...materialized, hoverPosition: materialized.text.length }
|
|
731
|
+
: materialized;
|
|
732
|
+
const resolvedNode = resolveNodeFromMaterializedRegion(preparedProgram, resolved, completionMaterialized, true);
|
|
733
|
+
if (!resolvedNode) {
|
|
734
|
+
return null;
|
|
735
|
+
}
|
|
736
|
+
return {
|
|
737
|
+
...resolvedNode,
|
|
738
|
+
originalBlockSpan: blockSpan,
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
export function resolveExprArgumentOperand(preparedProgram, resolved, index, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
742
|
+
const invocation = resolved.placeholder.invocation;
|
|
743
|
+
const exprSpan = getExprArgumentSpan(invocation, index);
|
|
744
|
+
if (!exprSpan) {
|
|
745
|
+
return null;
|
|
746
|
+
}
|
|
747
|
+
const replacement = resolved.placeholder.replacement;
|
|
748
|
+
const preparedFile = resolved.placeholder.preparedFile;
|
|
749
|
+
const operandText = preparedFile.originalText.slice(exprSpan.start, exprSpan.end);
|
|
750
|
+
const nestedExpansion = materializeNestedOperandExpansion(preparedProgram, resolved, operandText, nestedRegistries) ?? { expressionText: operandText, preludeTexts: [] };
|
|
751
|
+
if (!nestedExpansion) {
|
|
752
|
+
return null;
|
|
753
|
+
}
|
|
754
|
+
const expandedText = nestedExpansion.expressionText;
|
|
755
|
+
const containingStatement = findContainingStatement(resolved.callExpression);
|
|
756
|
+
const programReplacementStart = mapStageOnePositionToProgram(preparedFile, replacement.rewrittenSpan.start);
|
|
757
|
+
const programReplacementEnd = mapStageOnePositionToProgram(preparedFile, replacement.rewrittenSpan.end);
|
|
758
|
+
const statementStart = containingStatement?.getStart(resolved.callExpression.getSourceFile()) ??
|
|
759
|
+
programReplacementStart;
|
|
760
|
+
const insertedPrelude = nestedExpansion.preludeTexts.length > 0
|
|
761
|
+
? `${nestedExpansion.preludeTexts.join('\n')}\n`
|
|
762
|
+
: '';
|
|
763
|
+
const preludeAdjustedText = insertedPrelude.length > 0
|
|
764
|
+
? preparedFile.rewrittenText.slice(0, statementStart) + insertedPrelude +
|
|
765
|
+
preparedFile.rewrittenText.slice(statementStart)
|
|
766
|
+
: preparedFile.rewrittenText;
|
|
767
|
+
const replacementOffset = statementStart <= programReplacementStart
|
|
768
|
+
? insertedPrelude.length
|
|
769
|
+
: 0;
|
|
770
|
+
const patchedExpressionStart = programReplacementStart + replacementOffset;
|
|
771
|
+
const patchedText = replaceRange(preludeAdjustedText, programReplacementStart + replacementOffset, programReplacementEnd + replacementOffset, expandedText);
|
|
772
|
+
const rewrittenProgramFileName = preparedProgram.toProgramFileName(replacement.rewrittenSpan.fileName);
|
|
773
|
+
const overrideHost = {
|
|
774
|
+
...preparedProgram.preparedHost.host,
|
|
775
|
+
getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
|
|
776
|
+
if (fileName === rewrittenProgramFileName) {
|
|
777
|
+
return ts.createSourceFile(fileName, patchedText, languageVersion, true);
|
|
778
|
+
}
|
|
779
|
+
return preparedProgram.preparedHost.host.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);
|
|
780
|
+
},
|
|
781
|
+
readFile(fileName) {
|
|
782
|
+
if (fileName === rewrittenProgramFileName) {
|
|
783
|
+
return patchedText;
|
|
784
|
+
}
|
|
785
|
+
return preparedProgram.preparedHost.host.readFile(fileName);
|
|
786
|
+
},
|
|
787
|
+
};
|
|
788
|
+
const patchedProgram = ts.createProgram({
|
|
789
|
+
host: overrideHost,
|
|
790
|
+
options: preparedProgram.options,
|
|
791
|
+
rootNames: preparedProgram.rootNames.map((fileName) => preparedProgram.toProgramFileName(fileName)),
|
|
792
|
+
});
|
|
793
|
+
const patchedSourceFile = patchedProgram.getSourceFile(rewrittenProgramFileName);
|
|
794
|
+
if (!patchedSourceFile) {
|
|
795
|
+
return null;
|
|
796
|
+
}
|
|
797
|
+
const patchedExpression = findExpressionAtSpan(patchedSourceFile, patchedExpressionStart, patchedExpressionStart + expandedText.length);
|
|
798
|
+
if (!patchedExpression) {
|
|
799
|
+
return null;
|
|
800
|
+
}
|
|
801
|
+
return {
|
|
802
|
+
expandedText,
|
|
803
|
+
preludeTexts: nestedExpansion.preludeTexts,
|
|
804
|
+
node: patchedExpression,
|
|
805
|
+
semantics: createMacroSemantics(patchedProgram),
|
|
806
|
+
sourceFile: patchedSourceFile,
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
export function resolvePrimaryExprOperand(preparedProgram, resolved, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
810
|
+
const invocation = resolved.placeholder.invocation;
|
|
811
|
+
if (!_getPrimaryExprSpan(invocation)) {
|
|
812
|
+
return null;
|
|
813
|
+
}
|
|
814
|
+
return resolveExprArgumentOperand(preparedProgram, resolved, 0, nestedRegistries);
|
|
815
|
+
}
|
|
816
|
+
export function typeOfPrimaryExprOperand(preparedProgram, resolved, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
817
|
+
const operand = resolvePrimaryExprOperand(preparedProgram, resolved, nestedRegistries);
|
|
818
|
+
return operand ? operand.semantics.typeOfNode(operand.node) : null;
|
|
819
|
+
}
|
|
820
|
+
export function enclosingFunctionOfPrimaryExprOperand(preparedProgram, resolved, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
821
|
+
const operand = resolvePrimaryExprOperand(preparedProgram, resolved, nestedRegistries);
|
|
822
|
+
return operand ? operand.semantics.enclosingFunctionOfNode(operand.node) ?? null : null;
|
|
823
|
+
}
|
|
824
|
+
export function classifyCanonicalResultOfPrimaryExprOperand(preparedProgram, resolved, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
825
|
+
const operand = resolvePrimaryExprOperand(preparedProgram, resolved, nestedRegistries);
|
|
826
|
+
if (!operand) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
return operand.semantics.classifyCanonicalResultType(operand.semantics.typeOfNode(operand.node));
|
|
830
|
+
}
|
|
831
|
+
export function classifyCanonicalResultCarrierOfPrimaryExprOperand(preparedProgram, resolved, nestedRegistries = { advanced: new Map(), rewrite: new Map() }) {
|
|
832
|
+
const operand = resolvePrimaryExprOperand(preparedProgram, resolved, nestedRegistries);
|
|
833
|
+
if (!operand) {
|
|
834
|
+
return null;
|
|
835
|
+
}
|
|
836
|
+
return operand.semantics.classifyCanonicalResultCarrierType(operand.semantics.typeOfNode(operand.node));
|
|
837
|
+
}
|
|
838
|
+
import { getAlwaysAvailableBuiltinMacroSiteKinds } from './builtin_macro_support.js';
|