@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,121 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { canonicalize, cppTypeFromCanonicalType, TYPED_ARRAY_NAMES } from "./semantic-facts.js";
|
|
3
|
+
import { makeDiagnostic } from "../ir/ast-node-utils.js";
|
|
4
|
+
/** Names of nodes that are not "expressions" we want to type-check — they're
|
|
5
|
+
* type-only or structural and would produce noise. */
|
|
6
|
+
function isSkippableForTyping(node) {
|
|
7
|
+
// Type-only constructs (isTypeNode covers TypeReference, TypeLiteral, etc.).
|
|
8
|
+
return (ts.isTypeNode(node) ||
|
|
9
|
+
ts.isTypeAliasDeclaration(node) ||
|
|
10
|
+
ts.isInterfaceDeclaration(node) ||
|
|
11
|
+
ts.isHeritageClause(node) ||
|
|
12
|
+
ts.isTypeParameterDeclaration(node) ||
|
|
13
|
+
// Statements themselves aren't typed; their expressions are visited.
|
|
14
|
+
ts.isStatement(node));
|
|
15
|
+
}
|
|
16
|
+
/** A blank identifier (`_`) used as a deliberate discard isn't a value use. */
|
|
17
|
+
function isVoidOrNeverExpression(node) {
|
|
18
|
+
return (node.kind === ts.SyntaxKind.VoidExpression ||
|
|
19
|
+
node.kind === ts.SyntaxKind.DeleteExpression);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Verify semantic-fact completeness across user files.
|
|
23
|
+
*
|
|
24
|
+
* Walks every expression, computes its CanonicalType, and emits a diagnostic
|
|
25
|
+
* for each one that resolves to "unknown" (at the configured severity).
|
|
26
|
+
*
|
|
27
|
+
* If `facts` is passed, the walk also POPULATES the store with the computed
|
|
28
|
+
* `type` (CanonicalType) and `cppType` for each expression. This is the single
|
|
29
|
+
* place concrete per-expression type facts are recorded — Phase 3 of the type-
|
|
30
|
+
* resolution consolidation — so gate rules can read them without re-deriving
|
|
31
|
+
* from the ts.TypeChecker, and so a future pipeline reorder can populate the
|
|
32
|
+
* same fields from the ProgramIR SymbolTable instead. See SemanticFacts.cppType.
|
|
33
|
+
*/
|
|
34
|
+
export function verifyFacts(program, userFiles, options = {}) {
|
|
35
|
+
const unknownSeverity = options.unknownTypeSeverity ?? "warning";
|
|
36
|
+
const facts = options.facts;
|
|
37
|
+
const checker = program.getTypeChecker();
|
|
38
|
+
const userFileSet = new Set(userFiles.map((f) => f.replace(/\\/g, "/")));
|
|
39
|
+
const diagnostics = [];
|
|
40
|
+
let expressionsVisited = 0;
|
|
41
|
+
let unknownTypeExpressions = 0;
|
|
42
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
43
|
+
const filePath = sourceFile.fileName.replace(/\\/g, "/");
|
|
44
|
+
if (!userFileSet.has(filePath))
|
|
45
|
+
continue;
|
|
46
|
+
if (filePath.includes("/node_modules/") || filePath.includes("/packages/"))
|
|
47
|
+
continue;
|
|
48
|
+
const sourceText = sourceFile.getFullText();
|
|
49
|
+
const visit = (node) => {
|
|
50
|
+
if (isSkippableForTyping(node)) {
|
|
51
|
+
// Still recurse so nested expressions in non-skippable children are
|
|
52
|
+
// visited, but don't type-check the skippable node itself.
|
|
53
|
+
ts.forEachChild(node, visit);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (ts.isExpression(node) && !isVoidOrNeverExpression(node)) {
|
|
57
|
+
expressionsVisited++;
|
|
58
|
+
const type = checker.getTypeAtLocation(node);
|
|
59
|
+
const category = canonicalize(checker, type);
|
|
60
|
+
// Record the concrete type facts on this expression node. `type` makes
|
|
61
|
+
// the SemanticFacts.type field actually populated (it was previously
|
|
62
|
+
// declared but only computed ephemerally here); `cppType` is the
|
|
63
|
+
// Phase 3 addition. Both are no-ops when no store is passed.
|
|
64
|
+
if (facts) {
|
|
65
|
+
facts.merge(node, {
|
|
66
|
+
type: category,
|
|
67
|
+
...(category !== "unknown"
|
|
68
|
+
? { cppType: cppTypeFromCanonicalType(checker, type, category) }
|
|
69
|
+
: {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (category === "unknown") {
|
|
73
|
+
unknownTypeExpressions++;
|
|
74
|
+
if (unknownSeverity !== "off") {
|
|
75
|
+
diagnostics.push(makeUnknownTypeDiagnostic(sourceText, node, checker, type));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
ts.forEachChild(node, visit);
|
|
80
|
+
};
|
|
81
|
+
visit(sourceFile);
|
|
82
|
+
}
|
|
83
|
+
// Apply severity to the collected unknown-type diagnostics.
|
|
84
|
+
if (unknownSeverity === "warning") {
|
|
85
|
+
for (const d of diagnostics)
|
|
86
|
+
d.severity = "warning";
|
|
87
|
+
}
|
|
88
|
+
else if (unknownSeverity === "error") {
|
|
89
|
+
for (const d of diagnostics)
|
|
90
|
+
d.severity = "error";
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
diagnostics,
|
|
94
|
+
counts: { expressionsVisited, unknownTypeExpressions },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function makeUnknownTypeDiagnostic(sourceText, node, checker, type) {
|
|
98
|
+
const message = describeUnknownType(type, checker, node);
|
|
99
|
+
const diag = makeDiagnostic(sourceText, node.getStart(), message, "warning", "TS2CPP_UNCLASSIFIABLE_TYPE");
|
|
100
|
+
diag.source = "semantic-facts-verifier";
|
|
101
|
+
return diag;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Produce a human-readable reason for why a type canonicalized to "unknown".
|
|
105
|
+
* By the time this runs, `any` has already been classified to its own category
|
|
106
|
+
* (not "unknown"), so the only remaining causes are `unknown`/`never` types
|
|
107
|
+
* (which the lowering can't target) or a type canonicalize() doesn't yet
|
|
108
|
+
* recognize (a classifier gap to report).
|
|
109
|
+
*/
|
|
110
|
+
function describeUnknownType(type, checker, node) {
|
|
111
|
+
const flags = type.flags;
|
|
112
|
+
const typeStr = checker.typeToString(type);
|
|
113
|
+
const exprText = node.getText().slice(0, 40);
|
|
114
|
+
if (flags & (ts.TypeFlags.Unknown | ts.TypeFlags.Never)) {
|
|
115
|
+
return `Expression '${exprText}' has type '${typeStr}', which has no safe C++ target. Use an explicit type annotation.`;
|
|
116
|
+
}
|
|
117
|
+
// Not unknown/never but still unclassified — canonicalize() has a gap.
|
|
118
|
+
return `Expression '${exprText}' has type '${typeStr}', which the type classifier does not yet recognize. This is a cuttlefish gap — please report it.`;
|
|
119
|
+
}
|
|
120
|
+
/** Re-export so callers can introspect the typed-array name set if needed. */
|
|
121
|
+
export { TYPED_ARRAY_NAMES };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { Diagnostic } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Canonical type category. Deliberately small — this is NOT a full SType
|
|
5
|
+
* algebra. It exists to stop the six boolean predicates from each calling
|
|
6
|
+
* typeToString() in disguise.
|
|
7
|
+
*
|
|
8
|
+
* Field names are chosen to be SIR-compatible: a future promotion to a full
|
|
9
|
+
* SType algebra should be able to widen `category` without renaming consumers.
|
|
10
|
+
*/
|
|
11
|
+
export type CanonicalType = "primitive" | "struct" | "array" | "typed-array" | "map" | "set" | "function" | "any" | "unknown";
|
|
12
|
+
/**
|
|
13
|
+
* How an expression's value reaches its use. The categories the current gates
|
|
14
|
+
* care about are: copy (map/record value lookup, by-value param) and reference.
|
|
15
|
+
* temporary/rvalue are reserved for future promotion; not all are populated in
|
|
16
|
+
* Phase 1.
|
|
17
|
+
*/
|
|
18
|
+
export type ValueCategory = "lvalue" | "rvalue" | "copy" | "reference" | "temporary";
|
|
19
|
+
export type Lifetime = "local" | "param" | "param-by-ref" | "field" | "global" | "temporary" | "unknown";
|
|
20
|
+
/**
|
|
21
|
+
* Nullability as the lowering sees it. `erased` = TS optional (`x?: T`) or
|
|
22
|
+
* nullable union flattened to a value type in C++ (the case
|
|
23
|
+
* TS2CPP_OPTIONAL_FIELD_NULLISH catches). `none` = definitively not null.
|
|
24
|
+
*/
|
|
25
|
+
export type Nullable = "none" | "erased" | "unknown";
|
|
26
|
+
/**
|
|
27
|
+
* Provenance of a value, used by the mutation gates to decide whether a write
|
|
28
|
+
* reaches the caller/container.
|
|
29
|
+
*
|
|
30
|
+
* Only the origins the current gates consume are defined here. Add new origins
|
|
31
|
+
* as new gates migrate — do not pre-declare a large set.
|
|
32
|
+
*/
|
|
33
|
+
export type SemanticOrigin = "map-value-lookup" | "array-param" | "typed-array-param" | "local-binding" | "field-access" | "other";
|
|
34
|
+
export interface SemanticFacts {
|
|
35
|
+
/** Canonical type category. The verifier requires this to be non-"unknown"
|
|
36
|
+
* for every expression in user code, else a fatal diagnostic is emitted. */
|
|
37
|
+
type: CanonicalType;
|
|
38
|
+
valueCategory?: ValueCategory;
|
|
39
|
+
lifetime?: Lifetime;
|
|
40
|
+
nullable?: Nullable;
|
|
41
|
+
origin?: SemanticOrigin;
|
|
42
|
+
/**
|
|
43
|
+
* The concrete C++ type this node lowers to, when it is determinable from
|
|
44
|
+
* the TS type alone (e.g. `number` → "double", `string` → "std::string",
|
|
45
|
+
* `Uint8Array` → "uint8_t*"). Undefined when the cppType depends on IR-build
|
|
46
|
+
* context the type-checker does not have (user class field resolution,
|
|
47
|
+
* cross-module types, `auto` deduction from a complex initializer).
|
|
48
|
+
*
|
|
49
|
+
* Phase 3 of the type-resolution consolidation. This is populated from the
|
|
50
|
+
* ts.TypeChecker (which buildSemanticFacts already holds) as
|
|
51
|
+
* forward-compatible infrastructure: it lets gate rules read a concrete
|
|
52
|
+
* cppType without re-deriving it, and — if the pipeline is later reordered
|
|
53
|
+
* to build ProgramIR before the gates — the SymbolTable can populate this
|
|
54
|
+
* field directly and the ts.TypeChecker derivation removed. The direction is
|
|
55
|
+
* strictly one-way: gates read facts.cppType, they never feed it back into
|
|
56
|
+
* the IR/emit SymbolTable. See docs/design-semantic-facts.md.
|
|
57
|
+
*/
|
|
58
|
+
cppType?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read-only view exposed to gate rules.
|
|
62
|
+
*
|
|
63
|
+
* `get` returns undefined for nodes outside user files or nodes the pipeline
|
|
64
|
+
* did not visit. Gate rules treat undefined as "no fact, skip" — they never
|
|
65
|
+
* throw. The verifier (Phase 3) is the only place that asserts presence.
|
|
66
|
+
*/
|
|
67
|
+
export interface FactStore {
|
|
68
|
+
/** Facts for a node, or undefined if not in a user file / not visited. */
|
|
69
|
+
get(node: ts.Node): Readonly<SemanticFacts> | undefined;
|
|
70
|
+
/** True iff node is in a user file and was visited by the pipeline. */
|
|
71
|
+
has(node: ts.Node): boolean;
|
|
72
|
+
/** Set a fact. Only called by analysis passes, before gate rules run. */
|
|
73
|
+
set(node: ts.Node, facts: SemanticFacts): void;
|
|
74
|
+
/**
|
|
75
|
+
* Merge a partial fact into an existing entry, creating one if absent.
|
|
76
|
+
* Used when multiple passes contribute to the same node. The `type` field
|
|
77
|
+
* defaults to "unknown" if a new entry is created — callers that know the
|
|
78
|
+
* type should set it explicitly first.
|
|
79
|
+
*/
|
|
80
|
+
merge(node: ts.Node, partial: Partial<SemanticFacts>): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Result of building semantic facts for a program.
|
|
84
|
+
*/
|
|
85
|
+
export interface AnalysisResult {
|
|
86
|
+
facts: FactStore;
|
|
87
|
+
/** Fatal analysis diagnostics — appended before gate diagnostics. */
|
|
88
|
+
diagnostics: Diagnostic[];
|
|
89
|
+
/** Identifier-to-origin resolver consumed by mutation gates. */
|
|
90
|
+
resolver: BindingResolver;
|
|
91
|
+
}
|
|
92
|
+
/** Names recognized as typed arrays (Int8Array .. Float64Array, etc.). */
|
|
93
|
+
export declare const TYPED_ARRAY_NAMES: Set<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Classify a resolved TS type into a canonical category. This is the single
|
|
96
|
+
* source of truth for "what kind of C++ concept does this type lower to?"
|
|
97
|
+
*
|
|
98
|
+
* Categories and their verifier meaning:
|
|
99
|
+
* - concrete categories (primitive, struct, array, ...) — fine.
|
|
100
|
+
* - "any" — the transpiler handles `any` via inference; the verifier treats
|
|
101
|
+
* this as a NON-hazard (it is not `unknown`).
|
|
102
|
+
* - "unknown" — genuinely unclassifiable; the verifier flags this.
|
|
103
|
+
*
|
|
104
|
+
* Unions with a null/undefined constituent (e.g. `Account | null`) are
|
|
105
|
+
* classified by their non-null constituent, because the transpiler erases
|
|
106
|
+
* optionality to the value type. `this` types resolve to the enclosing
|
|
107
|
+
* class/interface, so they classify as struct.
|
|
108
|
+
*/
|
|
109
|
+
export declare function canonicalize(checker: ts.TypeChecker, type: ts.Type): CanonicalType;
|
|
110
|
+
/**
|
|
111
|
+
* Map a canonicalized type to the concrete C++ type the lowering emits, for
|
|
112
|
+
* the categories where the cppType is deterministic from the TS type alone.
|
|
113
|
+
* Returns undefined when the cppType depends on IR-build context the
|
|
114
|
+
* type-checker does not have (user-defined class/interface names resolve to
|
|
115
|
+
* themselves as struct names but their field layout is a SymbolTable concern;
|
|
116
|
+
* `auto` deduction from complex initializers is an IR-build concern).
|
|
117
|
+
*
|
|
118
|
+
* This populates SemanticFacts.cppType so gate rules can read a concrete type
|
|
119
|
+
* without re-deriving it. Phase 3 of the type-resolution consolidation — see
|
|
120
|
+
* the doc comment on SemanticFacts.cppType for the one-way direction.
|
|
121
|
+
*/
|
|
122
|
+
export declare function cppTypeFromCanonicalType(checker: ts.TypeChecker, type: ts.Type, category: CanonicalType): string | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* A name->facts binding resolver. Gate rules call `resolveOrigin(identifier)`
|
|
125
|
+
* to ask "what is the origin of the value this identifier refers to?", which
|
|
126
|
+
* resolves the identifier to its declaration and looks up the declaration's
|
|
127
|
+
* origin fact. This replaces the name-based scope-chain lookup in the old
|
|
128
|
+
* GateScope machinery: it is shadowing-proof because the checker resolves the
|
|
129
|
+
* identifier to the exact declaration, regardless of scope.
|
|
130
|
+
*/
|
|
131
|
+
export interface BindingResolver {
|
|
132
|
+
/**
|
|
133
|
+
* Resolve an identifier's value origin. Returns undefined if the identifier
|
|
134
|
+
* is not a value reference or has no recorded origin.
|
|
135
|
+
*/
|
|
136
|
+
resolveOrigin(identifier: ts.Identifier): SemanticOrigin | undefined;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build the SemanticFacts store for a program by running the analysis passes.
|
|
140
|
+
*/
|
|
141
|
+
export declare function buildSemanticFacts(program: ts.Program, userFiles: string[]): AnalysisResult;
|