@typecad/cuttlefish 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/api/board-types.d.ts +1 -0
- package/dist/api/board-types.js +4 -0
- package/dist/api/capabilities.d.ts +12 -0
- package/dist/api/capabilities.js +1 -0
- package/dist/api/config.d.ts +120 -0
- package/dist/api/config.js +7 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.js +2 -0
- package/dist/api/schema/builder.d.ts +14 -0
- package/dist/api/schema/builder.js +15 -0
- package/dist/api/schema/index.d.ts +2 -0
- package/dist/api/schema/index.js +1 -0
- package/dist/api/schema/types.d.ts +257 -0
- package/dist/api/schema/types.js +4 -0
- package/dist/api/shared/async-runtime-static.d.ts +8 -0
- package/dist/api/shared/async-runtime-static.js +201 -0
- package/dist/api/shared/async-types.d.ts +42 -0
- package/dist/api/shared/async-types.js +8 -0
- package/dist/api/shared/board-resolver.d.ts +12 -0
- package/dist/api/shared/board-resolver.js +7 -0
- package/dist/api/shared/cpp-type-ir.d.ts +229 -0
- package/dist/api/shared/cpp-type-ir.js +672 -0
- package/dist/api/shared/display-adapter.d.ts +12 -0
- package/dist/api/shared/display-adapter.js +145 -0
- package/dist/api/shared/display-adapters/eink-mono.d.ts +2 -0
- package/dist/api/shared/display-adapters/eink-mono.js +53 -0
- package/dist/api/shared/display-adapters/sdl.d.ts +2 -0
- package/dist/api/shared/display-adapters/sdl.js +452 -0
- package/dist/api/shared/display-adapters/ssd1309.d.ts +2 -0
- package/dist/api/shared/display-adapters/ssd1309.js +136 -0
- package/dist/api/shared/display-adapters/st7796.d.ts +2 -0
- package/dist/api/shared/display-adapters/st7796.js +132 -0
- package/dist/api/shared/display-capabilities.d.ts +45 -0
- package/dist/api/shared/display-capabilities.js +54 -0
- package/dist/api/shared/display-op-ir.d.ts +62 -0
- package/dist/api/shared/display-op-ir.js +19 -0
- package/dist/api/shared/display-profile.d.ts +265 -0
- package/dist/api/shared/display-profile.js +338 -0
- package/dist/api/shared/graphics-strategy.d.ts +29 -0
- package/dist/api/shared/graphics-strategy.js +11 -0
- package/dist/api/shared/hal-op-ir.d.ts +393 -0
- package/dist/api/shared/hal-op-ir.js +18 -0
- package/dist/api/shared/index.d.ts +26 -0
- package/dist/api/shared/index.js +21 -0
- package/dist/api/shared/ir-core.d.ts +363 -0
- package/dist/api/shared/ir-core.js +8 -0
- package/dist/api/shared/ir-declarations.d.ts +201 -0
- package/dist/api/shared/ir-declarations.js +26 -0
- package/dist/api/shared/ir.d.ts +85 -0
- package/dist/api/shared/ir.js +13 -0
- package/dist/api/shared/platform-strategy.d.ts +402 -0
- package/dist/api/shared/platform-strategy.js +14 -0
- package/dist/api/shared/polyfill-helper-registry.d.ts +11 -0
- package/dist/api/shared/polyfill-helper-registry.js +86 -0
- package/dist/api/shared/polyfill-types.d.ts +33 -0
- package/dist/api/shared/polyfill-types.js +76 -0
- package/dist/api/shared/promise-runtime.d.ts +10 -0
- package/dist/api/shared/promise-runtime.js +244 -0
- package/dist/api/shared/snprintf-types.d.ts +29 -0
- package/dist/api/shared/snprintf-types.js +8 -0
- package/dist/api/shared/string-method-registry.d.ts +53 -0
- package/dist/api/shared/string-method-registry.js +168 -0
- package/dist/api/shared/toolchain-types.d.ts +63 -0
- package/dist/api/shared/toolchain-types.js +71 -0
- package/dist/api/shared/types.d.ts +50 -0
- package/dist/api/shared/types.js +6 -0
- package/dist/ast/parse.d.ts +2 -0
- package/dist/ast/parse.js +4 -0
- package/dist/cache.d.ts +26 -0
- package/dist/cache.js +95 -0
- package/dist/cli-utils.d.ts +37 -0
- package/dist/cli-utils.js +250 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +635 -0
- package/dist/config-loader.d.ts +78 -0
- package/dist/config-loader.js +508 -0
- package/dist/config-schema.d.ts +233 -0
- package/dist/config-schema.js +83 -0
- package/dist/create/board-checklist.d.ts +2 -0
- package/dist/create/board-checklist.js +52 -0
- package/dist/create/board-codegen.d.ts +9 -0
- package/dist/create/board-codegen.js +238 -0
- package/dist/create/board-generators.d.ts +12 -0
- package/dist/create/board-generators.js +652 -0
- package/dist/create/board-spec.d.ts +640 -0
- package/dist/create/board-spec.js +215 -0
- package/dist/create/eslint-rules-template.d.ts +2 -0
- package/dist/create/eslint-rules-template.js +672 -0
- package/dist/create/index.d.ts +11 -0
- package/dist/create/index.js +8 -0
- package/dist/create/init-scaffold.d.ts +27 -0
- package/dist/create/init-scaffold.js +150 -0
- package/dist/create/init-templates.d.ts +24 -0
- package/dist/create/init-templates.js +379 -0
- package/dist/create/init-wizard.d.ts +8 -0
- package/dist/create/init-wizard.js +168 -0
- package/dist/debug/breakpoint-loader.d.ts +24 -0
- package/dist/debug/breakpoint-loader.js +137 -0
- package/dist/debug/index.d.ts +3 -0
- package/dist/debug/index.js +7 -0
- package/dist/debug/preprocessor.d.ts +9 -0
- package/dist/debug/preprocessor.js +214 -0
- package/dist/debug/types.d.ts +32 -0
- package/dist/debug/types.js +6 -0
- package/dist/diagnostics/diagnostics-report.d.ts +51 -0
- package/dist/diagnostics/diagnostics-report.js +333 -0
- package/dist/diagnostics/json-schema.d.ts +138 -0
- package/dist/diagnostics/json-schema.js +27 -0
- package/dist/diagnostics/md-writer.d.ts +10 -0
- package/dist/diagnostics/md-writer.js +336 -0
- package/dist/diagnostics/mermaid-builder.d.ts +65 -0
- package/dist/diagnostics/mermaid-builder.js +681 -0
- package/dist/emit/cpp-emitter.d.ts +6 -0
- package/dist/emit/cpp-emitter.js +48 -0
- package/dist/emit/emitters/class-emitter.d.ts +2 -0
- package/dist/emit/emitters/class-emitter.js +523 -0
- package/dist/emit/emitters/emitter-context.d.ts +174 -0
- package/dist/emit/emitters/emitter-context.js +1 -0
- package/dist/emit/emitters/entrypoint-synthesizer.d.ts +2 -0
- package/dist/emit/emitters/entrypoint-synthesizer.js +175 -0
- package/dist/emit/emitters/function-emitter-impl.d.ts +19 -0
- package/dist/emit/emitters/function-emitter-impl.js +428 -0
- package/dist/emit/emitters/line-appender.d.ts +15 -0
- package/dist/emit/emitters/line-appender.js +344 -0
- package/dist/emit/emitters/namespace-emitter.d.ts +2 -0
- package/dist/emit/emitters/namespace-emitter.js +324 -0
- package/dist/emit/emitters/output-finalizer.d.ts +4 -0
- package/dist/emit/emitters/output-finalizer.js +267 -0
- package/dist/emit/emitters/setup.d.ts +3 -0
- package/dist/emit/emitters/setup.js +851 -0
- package/dist/emit/emitters/top-level-prep.d.ts +2 -0
- package/dist/emit/emitters/top-level-prep.js +706 -0
- package/dist/emit/emitters/type-decl-emitter.d.ts +2 -0
- package/dist/emit/emitters/type-decl-emitter.js +251 -0
- package/dist/emit/emitters/ui-emitter.d.ts +21 -0
- package/dist/emit/emitters/ui-emitter.js +564 -0
- package/dist/emit/enum-emitter.d.ts +1 -0
- package/dist/emit/enum-emitter.js +1 -0
- package/dist/emit/expression-renderer.d.ts +283 -0
- package/dist/emit/expression-renderer.js +1477 -0
- package/dist/emit/native-helpers-emitter.d.ts +11 -0
- package/dist/emit/native-helpers-emitter.js +34 -0
- package/dist/emit/route-hal-op.d.ts +5 -0
- package/dist/emit/route-hal-op.js +13 -0
- package/dist/emit/snprintf-helpers.d.ts +17 -0
- package/dist/emit/snprintf-helpers.js +462 -0
- package/dist/emit/statement-renderer.d.ts +189 -0
- package/dist/emit/statement-renderer.js +948 -0
- package/dist/emit/utils/async-state-machine.d.ts +42 -0
- package/dist/emit/utils/async-state-machine.js +343 -0
- package/dist/emit/utils/comment-helpers.d.ts +20 -0
- package/dist/emit/utils/comment-helpers.js +31 -0
- package/dist/emit/utils/cpp-helpers.d.ts +47 -0
- package/dist/emit/utils/cpp-helpers.js +85 -0
- package/dist/emit/utils/include-resolver.d.ts +58 -0
- package/dist/emit/utils/include-resolver.js +155 -0
- package/dist/emit/utils/index.d.ts +8 -0
- package/dist/emit/utils/index.js +12 -0
- package/dist/emit/utils/type-inference.d.ts +159 -0
- package/dist/emit/utils/type-inference.js +559 -0
- package/dist/eslint-check.d.ts +10 -0
- package/dist/eslint-check.js +102 -0
- package/dist/framework-package.d.ts +10 -0
- package/dist/framework-package.js +58 -0
- package/dist/framework-registry.d.ts +39 -0
- package/dist/framework-registry.js +30 -0
- package/dist/incremental-cache.d.ts +116 -0
- package/dist/incremental-cache.js +335 -0
- package/dist/ir/adc-range-validation.d.ts +11 -0
- package/dist/ir/adc-range-validation.js +250 -0
- package/dist/ir/ast-node-utils.d.ts +8 -0
- package/dist/ir/ast-node-utils.js +32 -0
- package/dist/ir/board-pin-utils.d.ts +13 -0
- package/dist/ir/board-pin-utils.js +65 -0
- package/dist/ir/board-resolver.d.ts +36 -0
- package/dist/ir/board-resolver.js +437 -0
- package/dist/ir/build-ir-state.d.ts +167 -0
- package/dist/ir/build-ir-state.js +306 -0
- package/dist/ir/build-ir.d.ts +2 -0
- package/dist/ir/build-ir.js +808 -0
- package/dist/ir/call-graph.d.ts +35 -0
- package/dist/ir/call-graph.js +194 -0
- package/dist/ir/compile-time-only.d.ts +2 -0
- package/dist/ir/compile-time-only.js +16 -0
- package/dist/ir/declaration-builders.d.ts +9 -0
- package/dist/ir/declaration-builders.js +608 -0
- package/dist/ir/entry-points.d.ts +30 -0
- package/dist/ir/entry-points.js +191 -0
- package/dist/ir/expression-to-ir.d.ts +5 -0
- package/dist/ir/expression-to-ir.js +2249 -0
- package/dist/ir/extract-property-chain.d.ts +10 -0
- package/dist/ir/extract-property-chain.js +30 -0
- package/dist/ir/feature-prescan.d.ts +3 -0
- package/dist/ir/feature-prescan.js +43 -0
- package/dist/ir/feature-registry.d.ts +30 -0
- package/dist/ir/feature-registry.js +816 -0
- package/dist/ir/filter.d.ts +7 -0
- package/dist/ir/filter.js +85 -0
- package/dist/ir/function-builder.d.ts +19 -0
- package/dist/ir/function-builder.js +670 -0
- package/dist/ir/hal/hal-emitter.d.ts +62 -0
- package/dist/ir/hal/hal-emitter.js +735 -0
- package/dist/ir/hal/hal-parser.d.ts +61 -0
- package/dist/ir/hal/hal-parser.js +473 -0
- package/dist/ir/hal/hal-plugins.d.ts +34 -0
- package/dist/ir/hal/hal-plugins.js +706 -0
- package/dist/ir/hal-resolver.d.ts +5 -0
- package/dist/ir/hal-resolver.js +5 -0
- package/dist/ir/heap-analysis.d.ts +8 -0
- package/dist/ir/heap-analysis.js +350 -0
- package/dist/ir/heap-array-validation.d.ts +24 -0
- package/dist/ir/heap-array-validation.js +29 -0
- package/dist/ir/identifier-collector.d.ts +18 -0
- package/dist/ir/identifier-collector.js +439 -0
- package/dist/ir/interrupt-analysis.d.ts +39 -0
- package/dist/ir/interrupt-analysis.js +467 -0
- package/dist/ir/memory-budget-validation.d.ts +10 -0
- package/dist/ir/memory-budget-validation.js +86 -0
- package/dist/ir/namespace-builder.d.ts +7 -0
- package/dist/ir/namespace-builder.js +152 -0
- package/dist/ir/ownership-analysis.d.ts +9 -0
- package/dist/ir/ownership-analysis.js +1207 -0
- package/dist/ir/peripheral-ownership.d.ts +3 -0
- package/dist/ir/peripheral-ownership.js +152 -0
- package/dist/ir/peripheral-symbols.d.ts +7 -0
- package/dist/ir/peripheral-symbols.js +57 -0
- package/dist/ir/peripheral-usage.d.ts +54 -0
- package/dist/ir/peripheral-usage.js +691 -0
- package/dist/ir/peripheral-validation.d.ts +8 -0
- package/dist/ir/peripheral-validation.js +77 -0
- package/dist/ir/pin-alias-conflict.d.ts +4 -0
- package/dist/ir/pin-alias-conflict.js +34 -0
- package/dist/ir/pin-capability-validation.d.ts +6 -0
- package/dist/ir/pin-capability-validation.js +413 -0
- package/dist/ir/pin-mode-validation.d.ts +10 -0
- package/dist/ir/pin-mode-validation.js +301 -0
- package/dist/ir/pin-safety.d.ts +11 -0
- package/dist/ir/pin-safety.js +58 -0
- package/dist/ir/program-analysis.d.ts +44 -0
- package/dist/ir/program-analysis.js +589 -0
- package/dist/ir/pulldown-validation.d.ts +7 -0
- package/dist/ir/pulldown-validation.js +49 -0
- package/dist/ir/pwm-timer-sharing.d.ts +4 -0
- package/dist/ir/pwm-timer-sharing.js +93 -0
- package/dist/ir/reachability.d.ts +68 -0
- package/dist/ir/reachability.js +224 -0
- package/dist/ir/register-decorators.d.ts +6 -0
- package/dist/ir/register-decorators.js +49 -0
- package/dist/ir/render-expr.d.ts +4 -0
- package/dist/ir/render-expr.js +127 -0
- package/dist/ir/resource-analysis.d.ts +19 -0
- package/dist/ir/resource-analysis.js +153 -0
- package/dist/ir/statement-to-ir.d.ts +23 -0
- package/dist/ir/statement-to-ir.js +349 -0
- package/dist/ir/symbol-table.d.ts +68 -0
- package/dist/ir/symbol-table.js +179 -0
- package/dist/ir/symbol-types.d.ts +56 -0
- package/dist/ir/symbol-types.js +107 -0
- package/dist/ir/timer0-pwm-timing-conflict.d.ts +4 -0
- package/dist/ir/timer0-pwm-timing-conflict.js +71 -0
- package/dist/ir/timing-validation.d.ts +7 -0
- package/dist/ir/timing-validation.js +95 -0
- package/dist/ir/transformers/array-methods.d.ts +8 -0
- package/dist/ir/transformers/array-methods.js +493 -0
- package/dist/ir/transformers/call-statement.d.ts +5 -0
- package/dist/ir/transformers/call-statement.js +758 -0
- package/dist/ir/transformers/callback-context-registry.d.ts +20 -0
- package/dist/ir/transformers/callback-context-registry.js +55 -0
- package/dist/ir/transformers/canvas-lowering.d.ts +42 -0
- package/dist/ir/transformers/canvas-lowering.js +249 -0
- package/dist/ir/transformers/control-flow.d.ts +8 -0
- package/dist/ir/transformers/control-flow.js +508 -0
- package/dist/ir/transformers/expressions.d.ts +7 -0
- package/dist/ir/transformers/expressions.js +406 -0
- package/dist/ir/transformers/hal-call-resolver.d.ts +29 -0
- package/dist/ir/transformers/hal-call-resolver.js +274 -0
- package/dist/ir/transformers/hal-emit-helpers.d.ts +14 -0
- package/dist/ir/transformers/hal-emit-helpers.js +63 -0
- package/dist/ir/transformers/namespace-methods.d.ts +20 -0
- package/dist/ir/transformers/namespace-methods.js +110 -0
- package/dist/ir/transformers/register-assignment.d.ts +5 -0
- package/dist/ir/transformers/register-assignment.js +56 -0
- package/dist/ir/transformers/ui-call-resolver.d.ts +149 -0
- package/dist/ir/transformers/ui-call-resolver.js +1136 -0
- package/dist/ir/transformers/ui-callback-lowering.d.ts +62 -0
- package/dist/ir/transformers/ui-callback-lowering.js +623 -0
- package/dist/ir/transformers/ui-mount.d.ts +20 -0
- package/dist/ir/transformers/ui-mount.js +35 -0
- package/dist/ir/transformers/ui-reactive.d.ts +68 -0
- package/dist/ir/transformers/ui-reactive.js +129 -0
- package/dist/ir/transformers/variables.d.ts +14 -0
- package/dist/ir/transformers/variables.js +1045 -0
- package/dist/ir/try-catch-validation.d.ts +26 -0
- package/dist/ir/try-catch-validation.js +128 -0
- package/dist/ir/type-resolution.d.ts +31 -0
- package/dist/ir/type-resolution.js +977 -0
- package/dist/ir/ui-element-auto-wire.d.ts +50 -0
- package/dist/ir/ui-element-auto-wire.js +218 -0
- package/dist/ir/unit-suspicion-validation.d.ts +12 -0
- package/dist/ir/unit-suspicion-validation.js +296 -0
- package/dist/ir/utils/walk-ir.d.ts +6 -0
- package/dist/ir/utils/walk-ir.js +162 -0
- package/dist/ir/validation-orchestrator.d.ts +4 -0
- package/dist/ir/validation-orchestrator.js +45 -0
- package/dist/libdef/base-class-resolver.d.ts +23 -0
- package/dist/libdef/base-class-resolver.js +50 -0
- package/dist/libdef/cpp-to-decl.d.ts +34 -0
- package/dist/libdef/cpp-to-decl.js +584 -0
- package/dist/libdef/header-parser.d.ts +53 -0
- package/dist/libdef/header-parser.js +269 -0
- package/dist/libdef/registry.d.ts +10 -0
- package/dist/libdef/registry.js +142 -0
- package/dist/mapping/peripheral-names.d.ts +23 -0
- package/dist/mapping/peripheral-names.js +63 -0
- package/dist/mapping/source-map.d.ts +46 -0
- package/dist/mapping/source-map.js +207 -0
- package/dist/orchestrator/dts-generator.d.ts +17 -0
- package/dist/orchestrator/dts-generator.js +83 -0
- package/dist/orchestrator/graph-builder.d.ts +18 -0
- package/dist/orchestrator/graph-builder.js +218 -0
- package/dist/orchestrator/semantic-facts-verifier.d.ts +38 -0
- package/dist/orchestrator/semantic-facts-verifier.js +121 -0
- package/dist/orchestrator/semantic-facts.d.ts +141 -0
- package/dist/orchestrator/semantic-facts.js +652 -0
- package/dist/orchestrator/type-checker.d.ts +39 -0
- package/dist/orchestrator/type-checker.js +760 -0
- package/dist/platform/async-runtime.d.ts +8 -0
- package/dist/platform/async-runtime.js +26 -0
- package/dist/platform/generic-strategy.d.ts +101 -0
- package/dist/platform/generic-strategy.js +289 -0
- package/dist/platform/index.d.ts +4 -0
- package/dist/platform/index.js +9 -0
- package/dist/platform/registry.d.ts +21 -0
- package/dist/platform/registry.js +42 -0
- package/dist/platform/toolchain.d.ts +4 -0
- package/dist/platform/toolchain.js +43 -0
- package/dist/preview/client.d.ts +1 -0
- package/dist/preview/client.js +137 -0
- package/dist/preview/server.d.ts +5 -0
- package/dist/preview/server.js +199 -0
- package/dist/profiler/index.d.ts +28 -0
- package/dist/profiler/index.js +28 -0
- package/dist/profiler/profiler.d.ts +95 -0
- package/dist/profiler/profiler.js +338 -0
- package/dist/profiler/types.d.ts +87 -0
- package/dist/profiler/types.js +12 -0
- package/dist/stores/display-profile-store.d.ts +16 -0
- package/dist/stores/display-profile-store.js +48 -0
- package/dist/stores/theme-store.d.ts +13 -0
- package/dist/stores/theme-store.js +30 -0
- package/dist/testing.d.ts +45 -0
- package/dist/testing.js +47 -0
- package/dist/transpile/resolution.d.ts +29 -0
- package/dist/transpile/resolution.js +282 -0
- package/dist/transpile.d.ts +3 -0
- package/dist/transpile.js +722 -0
- package/dist/types.d.ts +217 -0
- package/dist/types.js +1 -0
- package/dist/ui/ui-bridge.d.ts +4 -0
- package/dist/ui/ui-bridge.js +34 -0
- package/dist/ui-hook.d.ts +84 -0
- package/dist/ui-hook.js +45 -0
- package/dist/utils/cli.d.ts +3 -0
- package/dist/utils/cli.js +463 -0
- package/dist/utils/fs.d.ts +4 -0
- package/dist/utils/fs.js +23 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +8 -0
- package/dist/utils/strings.d.ts +35 -0
- package/dist/utils/strings.js +142 -0
- package/dist/utils/ui.d.ts +66 -0
- package/dist/utils/ui.js +149 -0
- package/dist/watch.d.ts +35 -0
- package/dist/watch.js +111 -0
- package/package.json +127 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { halInstances } from "./build-ir-state.js";
|
|
2
|
+
export { halInstances };
|
|
3
|
+
export { HALInstance, HALMethodEntry, HALClassEntry, halClassRegistry, halGlobalFunctions, halSingletons, halCtorIncludes, halModulesLoaded, isHALSingleton, resolveHALSourceDir, extractCtorFieldMap, extractCtorIncludes, extractParams, extractMethods, loadHALModules, getCtorIncludes, resolveHALReceiver, resolveCtorFieldValues, isKnownHALClass, getHALCtorFieldMap, } from "./hal/hal-parser.js";
|
|
4
|
+
export { resolveSemanticArg, resolveNumericArg, portFromInstance, tryResolveBoardResolveArg, tryResolveCompoundSemanticReturn, tryResolveSemanticCall, } from "./hal/hal-plugins.js";
|
|
5
|
+
export { maybeEscapeResolvedText, resolveExpressionText, extractAndRegisterCallbacks, processHALMethodBody, isLiteralReturnValue, resolveCppObjectName, processStatementList, resetHALResolver, setActiveStrategy, resolveHALExprToText, registerFloatVariable, buildSnprintfFromConcat, } from "./hal/hal-emitter.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { halInstances } from "./build-ir-state.js";
|
|
2
|
+
export { halInstances };
|
|
3
|
+
export { halClassRegistry, halGlobalFunctions, halSingletons, halCtorIncludes, halModulesLoaded, isHALSingleton, resolveHALSourceDir, extractCtorFieldMap, extractCtorIncludes, extractParams, extractMethods, loadHALModules, getCtorIncludes, resolveHALReceiver, resolveCtorFieldValues, isKnownHALClass, getHALCtorFieldMap, } from "./hal/hal-parser.js";
|
|
4
|
+
export { resolveSemanticArg, resolveNumericArg, portFromInstance, tryResolveBoardResolveArg, tryResolveCompoundSemanticReturn, tryResolveSemanticCall, } from "./hal/hal-plugins.js";
|
|
5
|
+
export { maybeEscapeResolvedText, resolveExpressionText, extractAndRegisterCallbacks, processHALMethodBody, isLiteralReturnValue, resolveCppObjectName, processStatementList, resetHALResolver, setActiveStrategy, resolveHALExprToText, registerFloatVariable, buildSnprintfFromConcat, } from "./hal/hal-emitter.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProgramIR } from "../api/index.js";
|
|
2
|
+
import type { HeapEstimate } from "../diagnostics/json-schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Perform heap/memory estimate analysis on a ProgramIR.
|
|
5
|
+
*/
|
|
6
|
+
export declare function analyzeHeapUsage(program: ProgramIR | null, architecture?: string, callGraphNodes?: Map<string, {
|
|
7
|
+
dependencies: Set<string>;
|
|
8
|
+
}>): HeapEstimate;
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Heap / Memory Estimate Analysis
|
|
3
|
+
//
|
|
4
|
+
// Performs static analysis of the ProgramIR to estimate memory usage.
|
|
5
|
+
// This is a conservative approximation — actual usage depends on compiler
|
|
6
|
+
// optimizations and runtime behavior.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
import { parseCppType, renderCppType, bareType } from "../api/shared/cpp-type-ir.js";
|
|
9
|
+
/** Type sizes for common C++ types on AVR (8-bit) and ESP32 (32-bit) */
|
|
10
|
+
const AVR_TYPE_SIZES = {
|
|
11
|
+
bool: 1,
|
|
12
|
+
char: 1,
|
|
13
|
+
"unsigned char": 1,
|
|
14
|
+
"signed char": 1,
|
|
15
|
+
uint8_t: 1,
|
|
16
|
+
int8_t: 1,
|
|
17
|
+
byte: 1,
|
|
18
|
+
short: 2,
|
|
19
|
+
"unsigned short": 2,
|
|
20
|
+
int16_t: 2,
|
|
21
|
+
uint16_t: 2,
|
|
22
|
+
int: 2,
|
|
23
|
+
"unsigned int": 2,
|
|
24
|
+
int32_t: 4,
|
|
25
|
+
uint32_t: 4,
|
|
26
|
+
long: 4,
|
|
27
|
+
"unsigned long": 4,
|
|
28
|
+
int64_t: 8,
|
|
29
|
+
uint64_t: 8,
|
|
30
|
+
float: 4,
|
|
31
|
+
double: 4,
|
|
32
|
+
"long long": 8,
|
|
33
|
+
size_t: 2,
|
|
34
|
+
ptrdiff_t: 2,
|
|
35
|
+
pointer: 2,
|
|
36
|
+
"char*": 2,
|
|
37
|
+
"const char*": 2,
|
|
38
|
+
};
|
|
39
|
+
const ESP32_TYPE_SIZES = {
|
|
40
|
+
bool: 1,
|
|
41
|
+
char: 1,
|
|
42
|
+
"unsigned char": 1,
|
|
43
|
+
"signed char": 1,
|
|
44
|
+
uint8_t: 1,
|
|
45
|
+
int8_t: 1,
|
|
46
|
+
byte: 1,
|
|
47
|
+
short: 2,
|
|
48
|
+
"unsigned short": 2,
|
|
49
|
+
int16_t: 2,
|
|
50
|
+
uint16_t: 2,
|
|
51
|
+
int: 4,
|
|
52
|
+
"unsigned int": 4,
|
|
53
|
+
int32_t: 4,
|
|
54
|
+
uint32_t: 4,
|
|
55
|
+
long: 4,
|
|
56
|
+
"unsigned long": 4,
|
|
57
|
+
int64_t: 8,
|
|
58
|
+
uint64_t: 8,
|
|
59
|
+
float: 4,
|
|
60
|
+
double: 8,
|
|
61
|
+
"long long": 8,
|
|
62
|
+
size_t: 4,
|
|
63
|
+
ptrdiff_t: 4,
|
|
64
|
+
pointer: 4,
|
|
65
|
+
"char*": 4,
|
|
66
|
+
"const char*": 4,
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Determine the type size table based on the target architecture.
|
|
70
|
+
*/
|
|
71
|
+
function getTypeSizes(architecture) {
|
|
72
|
+
const arch = (architecture ?? "").toLowerCase();
|
|
73
|
+
if (arch === "avr" || arch === "atmega328p" || arch === "atmega2560") {
|
|
74
|
+
return AVR_TYPE_SIZES;
|
|
75
|
+
}
|
|
76
|
+
if (arch === "esp32" || arch === "esp32s3" || arch === "esp32c3" || arch === "esp32c6" || arch === "xtensa" || arch === "riscv32") {
|
|
77
|
+
return ESP32_TYPE_SIZES;
|
|
78
|
+
}
|
|
79
|
+
// Default to ESP32 sizes (more conservative for 32-bit targets)
|
|
80
|
+
return ESP32_TYPE_SIZES;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Estimate the size of a C++ type string.
|
|
84
|
+
* Handles arrays like "int[10]" and pointers.
|
|
85
|
+
*/
|
|
86
|
+
function estimateTypeSize(cppType, typeSizes) {
|
|
87
|
+
const ir = parseCppType(cppType);
|
|
88
|
+
// Fixed-size arrays: element[N] → element size × N.
|
|
89
|
+
if (ir.kind === "staticArray" && ir.size !== undefined) {
|
|
90
|
+
return estimateTypeSize(renderCppType(ir.element), typeSizes) * ir.size;
|
|
91
|
+
}
|
|
92
|
+
// Pointers.
|
|
93
|
+
if (ir.kind === "pointer") {
|
|
94
|
+
return typeSizes.pointer ?? 2;
|
|
95
|
+
}
|
|
96
|
+
// Normalize: strip const, references, etc., then look up the bare name.
|
|
97
|
+
const normalized = renderCppType(bareType(ir));
|
|
98
|
+
// Check known sizes
|
|
99
|
+
if (typeSizes[normalized] !== undefined) {
|
|
100
|
+
return typeSizes[normalized];
|
|
101
|
+
}
|
|
102
|
+
// For struct/class types, we return 0 here and handle in struct size analysis
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Estimate the size of a variable, falling back to the initializer when the
|
|
107
|
+
* type-based estimate is zero. This handles array-typed variables whose
|
|
108
|
+
* element count isn't in the type string:
|
|
109
|
+
* - `int32_t buf[] = {0,0,...}` (cArray with no size)
|
|
110
|
+
* - `std::vector<int32_t> buf = {...}` (vector — common before AVR promotion)
|
|
111
|
+
* - `__tc_StaticArray<int32_t, N> buf = {...}` (handled by estimateTypeSize
|
|
112
|
+
* when N is known, but the initializer fallback covers edge cases)
|
|
113
|
+
* Without this, large unsized global arrays (the most common SRAM consumer on
|
|
114
|
+
* AVR) are silently under-counted in the memory budget estimate.
|
|
115
|
+
*/
|
|
116
|
+
function estimateVariableSize(vd, typeSizes) {
|
|
117
|
+
const typeSize = estimateTypeSize(vd.cppType, typeSizes);
|
|
118
|
+
if (typeSize > 0)
|
|
119
|
+
return typeSize;
|
|
120
|
+
if (!vd.initializer)
|
|
121
|
+
return 0;
|
|
122
|
+
// Determine the element count and element type from the initializer.
|
|
123
|
+
const init = vd.initializer;
|
|
124
|
+
let count = 0;
|
|
125
|
+
let elementType = "";
|
|
126
|
+
if (init.kind === "array" && Array.isArray(init.elements)) {
|
|
127
|
+
count = init.elements.length;
|
|
128
|
+
elementType = init.elementType ?? "";
|
|
129
|
+
}
|
|
130
|
+
else if (init.kind === "raw" && typeof init.value === "string") {
|
|
131
|
+
const match = init.value.match(/^\s*\{([\s\S]*)\}\s*$/);
|
|
132
|
+
if (match) {
|
|
133
|
+
const inner = match[1].trim();
|
|
134
|
+
count = inner === "" ? 0 : inner.split(",").length;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (count === 0)
|
|
138
|
+
return 0;
|
|
139
|
+
// Recover the element type from the cppType if the initializer didn't carry it.
|
|
140
|
+
if (!elementType) {
|
|
141
|
+
const ir = parseCppType(vd.cppType);
|
|
142
|
+
// cArray: element field holds the element type IR.
|
|
143
|
+
// std::vector<T> / __tc_StaticArray<T,N>: element field holds T.
|
|
144
|
+
const arrayLike = ir;
|
|
145
|
+
if (arrayLike.element && typeof arrayLike.element === "object") {
|
|
146
|
+
elementType = renderCppType(arrayLike.element);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Fallback: try to extract from the raw type string (e.g. "std::vector<int32_t>").
|
|
150
|
+
const m = vd.cppType.match(/<[ \t]*(\w+)[ \t]*>/);
|
|
151
|
+
if (m)
|
|
152
|
+
elementType = m[1];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const elementSize = estimateTypeSize(elementType, typeSizes);
|
|
156
|
+
if (elementSize > 0)
|
|
157
|
+
return elementSize * count;
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Estimate the size of a struct or class from its fields.
|
|
162
|
+
*/
|
|
163
|
+
function estimateStructSize(def, typeSizes, structSizes) {
|
|
164
|
+
let total = 0;
|
|
165
|
+
const fields = "fields" in def ? def.fields : def.fields;
|
|
166
|
+
if (fields) {
|
|
167
|
+
for (const field of fields) {
|
|
168
|
+
total += estimateTypeSize(field.cppType, typeSizes);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return total;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Walk expression IR to find string literals.
|
|
175
|
+
*/
|
|
176
|
+
function collectStringLiterals(expr, literals) {
|
|
177
|
+
if (!expr)
|
|
178
|
+
return;
|
|
179
|
+
// Work around type re-export issues with ExpressionIR union
|
|
180
|
+
const e = expr;
|
|
181
|
+
if (e.kind === "string") {
|
|
182
|
+
const value = e.value ?? "";
|
|
183
|
+
// C string: length + null terminator
|
|
184
|
+
const bytes = value.length + 1;
|
|
185
|
+
// Deduplicate (optional — keep simple for now)
|
|
186
|
+
literals.push({ value, estimatedBytes: bytes });
|
|
187
|
+
}
|
|
188
|
+
if (e.kind === "binary") {
|
|
189
|
+
collectStringLiterals(e.left, literals);
|
|
190
|
+
collectStringLiterals(e.right, literals);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Walk statements to find string literals in expressions.
|
|
195
|
+
*/
|
|
196
|
+
function collectStatementsStringLiterals(stmts, literals) {
|
|
197
|
+
if (!stmts || !Array.isArray(stmts))
|
|
198
|
+
return;
|
|
199
|
+
for (const stmt of stmts) {
|
|
200
|
+
const s = stmt;
|
|
201
|
+
if (s.kind === "var_decl") {
|
|
202
|
+
const vd = stmt;
|
|
203
|
+
if (vd.initializer) {
|
|
204
|
+
collectStringLiterals(vd.initializer, literals);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (s.kind === "expr_stmt") {
|
|
208
|
+
if (s.expression) {
|
|
209
|
+
collectStringLiterals(s.expression, literals);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Estimate stack depth and return the deepest paths.
|
|
216
|
+
*/
|
|
217
|
+
function estimateStackDepth(callGraphNodes, entryPoints) {
|
|
218
|
+
const visited = new Set();
|
|
219
|
+
let maxDepth = 0;
|
|
220
|
+
let deepestPaths = [];
|
|
221
|
+
function dfs(name, depth, currentPath) {
|
|
222
|
+
if (depth > 30)
|
|
223
|
+
return; // guard against infinite recursion
|
|
224
|
+
const newPath = [...currentPath, name];
|
|
225
|
+
visited.add(name);
|
|
226
|
+
if (depth > maxDepth) {
|
|
227
|
+
maxDepth = depth;
|
|
228
|
+
deepestPaths = [newPath];
|
|
229
|
+
}
|
|
230
|
+
else if (depth === maxDepth && maxDepth > 0) {
|
|
231
|
+
deepestPaths.push(newPath);
|
|
232
|
+
}
|
|
233
|
+
const node = callGraphNodes.get(name);
|
|
234
|
+
if (node) {
|
|
235
|
+
for (const dep of node.dependencies) {
|
|
236
|
+
if (!visited.has(dep)) {
|
|
237
|
+
dfs(dep, depth + 1, newPath);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const entry of entryPoints) {
|
|
243
|
+
visited.clear();
|
|
244
|
+
dfs(entry, 1, []);
|
|
245
|
+
}
|
|
246
|
+
return { depth: maxDepth, paths: deepestPaths.slice(0, 5) }; // Return top 5 deepest paths
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Perform heap/memory estimate analysis on a ProgramIR.
|
|
250
|
+
*/
|
|
251
|
+
export function analyzeHeapUsage(program, architecture, callGraphNodes) {
|
|
252
|
+
const typeSizes = getTypeSizes(architecture);
|
|
253
|
+
const globalVariables = [];
|
|
254
|
+
const structSizes = {};
|
|
255
|
+
const stringLiterals = [];
|
|
256
|
+
const notes = [];
|
|
257
|
+
let totalStaticBytes = 0;
|
|
258
|
+
if (!program) {
|
|
259
|
+
notes.push("No program IR available for heap analysis.");
|
|
260
|
+
return {
|
|
261
|
+
globalVariables: [],
|
|
262
|
+
structSizes: {},
|
|
263
|
+
stringLiterals: [],
|
|
264
|
+
totalStaticBytes: 0,
|
|
265
|
+
estimatedStackDepth: 0,
|
|
266
|
+
stackPaths: [],
|
|
267
|
+
notes,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// Analyze struct sizes
|
|
271
|
+
for (const struct of program.structs) {
|
|
272
|
+
const size = estimateStructSize(struct, typeSizes, structSizes);
|
|
273
|
+
structSizes[struct.name] = size;
|
|
274
|
+
totalStaticBytes += size;
|
|
275
|
+
}
|
|
276
|
+
// Analyze class sizes
|
|
277
|
+
for (const cls of program.classes) {
|
|
278
|
+
const size = estimateStructSize(cls, typeSizes, structSizes);
|
|
279
|
+
structSizes[cls.name] = size;
|
|
280
|
+
totalStaticBytes += size;
|
|
281
|
+
}
|
|
282
|
+
// Analyze global variable declarations from top-level statements
|
|
283
|
+
for (const stmt of program.topLevelStatements) {
|
|
284
|
+
if (stmt.kind === "var_decl") {
|
|
285
|
+
const vd = stmt;
|
|
286
|
+
const size = estimateVariableSize(vd, typeSizes);
|
|
287
|
+
if (size > 0) {
|
|
288
|
+
globalVariables.push({
|
|
289
|
+
name: vd.name,
|
|
290
|
+
cppType: vd.cppType,
|
|
291
|
+
estimatedBytes: size,
|
|
292
|
+
});
|
|
293
|
+
totalStaticBytes += size;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// Unknown type — might be a struct/class
|
|
297
|
+
globalVariables.push({
|
|
298
|
+
name: vd.name,
|
|
299
|
+
cppType: vd.cppType,
|
|
300
|
+
estimatedBytes: 0,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Analyze global variables declared inside functions (static locals)
|
|
306
|
+
// and string literals from function bodies
|
|
307
|
+
for (const fn of program.functions) {
|
|
308
|
+
for (const stmt of fn.statements) {
|
|
309
|
+
if (stmt.kind === "var_decl") {
|
|
310
|
+
const vd = stmt;
|
|
311
|
+
const size = estimateVariableSize(vd, typeSizes);
|
|
312
|
+
globalVariables.push({
|
|
313
|
+
name: `${fn.originalName}::${vd.name}`,
|
|
314
|
+
cppType: vd.cppType,
|
|
315
|
+
estimatedBytes: size,
|
|
316
|
+
});
|
|
317
|
+
totalStaticBytes += size;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
collectStatementsStringLiterals(fn.statements, stringLiterals);
|
|
321
|
+
}
|
|
322
|
+
// Collect string literals from top-level statements
|
|
323
|
+
collectStatementsStringLiterals(program.topLevelStatements, stringLiterals);
|
|
324
|
+
// Sum string literal sizes
|
|
325
|
+
let stringTotal = 0;
|
|
326
|
+
for (const sl of stringLiterals) {
|
|
327
|
+
stringTotal += sl.estimatedBytes;
|
|
328
|
+
}
|
|
329
|
+
totalStaticBytes += stringTotal;
|
|
330
|
+
// Estimate stack depth from call graph
|
|
331
|
+
const entryPoints = ["setup", "loop"];
|
|
332
|
+
const stackInfo = callGraphNodes
|
|
333
|
+
? estimateStackDepth(callGraphNodes, entryPoints)
|
|
334
|
+
: { depth: 0, paths: [] };
|
|
335
|
+
// Add notes about approximations
|
|
336
|
+
notes.push("Heap estimate is static only — dynamic allocations (malloc/new) are not tracked.");
|
|
337
|
+
notes.push("String literals may be deduplicated by the compiler/linker.");
|
|
338
|
+
notes.push(architecture === "avr"
|
|
339
|
+
? "AVR sizes: int=2 bytes, pointer=2 bytes, float=4 bytes."
|
|
340
|
+
: `Default sizes: int=${typeSizes.int ?? "?"} bytes, pointer=${typeSizes.pointer ?? "?"} bytes, float=${typeSizes.float ?? "?"} bytes.`);
|
|
341
|
+
return {
|
|
342
|
+
globalVariables,
|
|
343
|
+
structSizes,
|
|
344
|
+
stringLiterals,
|
|
345
|
+
totalStaticBytes,
|
|
346
|
+
estimatedStackDepth: stackInfo.depth,
|
|
347
|
+
stackPaths: stackInfo.paths,
|
|
348
|
+
notes,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Diagnostic } from '../types.js';
|
|
2
|
+
import type { BoardConstants } from './board-resolver.js';
|
|
3
|
+
import type { StatementIR } from '../api/index.js';
|
|
4
|
+
import type { PlatformStrategy } from '../api/shared/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated Heap allocation is now validated at emit time by the platform
|
|
7
|
+
* strategy's `profileDiagnostics` (see framework-arduino `collectHeapAllocationDiagnostics`).
|
|
8
|
+
* This build-time stub returns no diagnostics. Kept to preserve the
|
|
9
|
+
* `validation-orchestrator.ts` import; remove that call site when convenient.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateHeapArrayUsage(_program: {
|
|
12
|
+
topLevelStatements: StatementIR[];
|
|
13
|
+
functions: Array<{
|
|
14
|
+
statements: StatementIR[];
|
|
15
|
+
}>;
|
|
16
|
+
classes: Array<{
|
|
17
|
+
methods: Array<{
|
|
18
|
+
statements: StatementIR[];
|
|
19
|
+
}>;
|
|
20
|
+
constructor?: {
|
|
21
|
+
statements: StatementIR[];
|
|
22
|
+
};
|
|
23
|
+
}>;
|
|
24
|
+
}, _boardConstants: BoardConstants | undefined, _strategy?: PlatformStrategy): Diagnostic[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Heap Allocation Validator (retired — moved to the emit-time profile gate)
|
|
3
|
+
//
|
|
4
|
+
// Heap allocation via `new` on no-heap architectures (AVR, etc.) is now
|
|
5
|
+
// rejected by the Arduino strategy's `profileDiagnostics`
|
|
6
|
+
// (`framework-arduino/src/strategy.ts` `collectHeapAllocationDiagnostics`).
|
|
7
|
+
//
|
|
8
|
+
// WHY THE MOVE: this build-time validator keyed off `boardConstants.architecture`,
|
|
9
|
+
// which is only populated when an MCU/board `import` is present. Programs with
|
|
10
|
+
// no such import silently bypassed it — so demo #33's `new Accumulator()`
|
|
11
|
+
// passed while a HAL-importing demo's `new Blinker()` failed, for the same
|
|
12
|
+
// source pattern. The profile-time gate derives `arch` from the FQBN
|
|
13
|
+
// (`frameworkData.buildTarget`), so it fires regardless of import structure
|
|
14
|
+
// (demo #34 Finding A). It also keys off the `newClassName` marker a user-class
|
|
15
|
+
// `new` tags its raw IR node with (set in `expression-to-ir.ts`), making
|
|
16
|
+
// detection structural rather than textual.
|
|
17
|
+
//
|
|
18
|
+
// The export is kept (returns `[]`) so `validation-orchestrator.ts`'s import
|
|
19
|
+
// stays valid; the real work happens at emit time.
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* @deprecated Heap allocation is now validated at emit time by the platform
|
|
23
|
+
* strategy's `profileDiagnostics` (see framework-arduino `collectHeapAllocationDiagnostics`).
|
|
24
|
+
* This build-time stub returns no diagnostics. Kept to preserve the
|
|
25
|
+
* `validation-orchestrator.ts` import; remove that call site when convenient.
|
|
26
|
+
*/
|
|
27
|
+
export function validateHeapArrayUsage(_program, _boardConstants, _strategy) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ExpressionIR, StatementIR } from "../api/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Shared utility for collecting identifiers from IR nodes.
|
|
4
|
+
* This consolidates duplicate logic that was previously in:
|
|
5
|
+
* - transpile.ts (collectExpressionIdentifiers, collectStatementIdentifiers)
|
|
6
|
+
* - call-graph.ts (collectExpressionIdentifiers, collectStatementIdentifiers)
|
|
7
|
+
* - build-ir.ts (similar traversal logic)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Collect all identifiers from an expression IR node.
|
|
11
|
+
* Returns a Set of identifier names found.
|
|
12
|
+
*/
|
|
13
|
+
export declare function collectExpressionIdentifiers(expr: ExpressionIR | null | undefined): Set<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Collect all identifiers from a statement IR node.
|
|
16
|
+
* Returns a Set of identifier names found.
|
|
17
|
+
*/
|
|
18
|
+
export declare function collectStatementIdentifiers(statement: StatementIR | null | undefined): Set<string>;
|