@phoenix-wing/kt-codegen 0.4.1 → 0.4.2

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.
Files changed (52) hide show
  1. package/README.md +24 -3
  2. package/dist/KtCodegenRenderer.d.ts +1 -1
  3. package/dist/KtCodegenRenderer.d.ts.map +1 -1
  4. package/dist/KtCodegenRenderer.js +3 -1293
  5. package/dist/KtCodegenRenderer.js.map +1 -1
  6. package/dist/api/compatibility.d.ts +21 -0
  7. package/dist/api/compatibility.d.ts.map +1 -0
  8. package/dist/api/compatibility.js +43 -0
  9. package/dist/api/compatibility.js.map +1 -0
  10. package/dist/api/index.d.ts +1 -0
  11. package/dist/api/index.d.ts.map +1 -1
  12. package/dist/api/index.js +1 -0
  13. package/dist/api/index.js.map +1 -1
  14. package/dist/renderer/caa-command-families.d.ts +4 -0
  15. package/dist/renderer/caa-command-families.d.ts.map +1 -0
  16. package/dist/renderer/caa-command-families.js +336 -0
  17. package/dist/renderer/caa-command-families.js.map +1 -0
  18. package/dist/renderer/caa-dialog-family.d.ts +5 -0
  19. package/dist/renderer/caa-dialog-family.d.ts.map +1 -0
  20. package/dist/renderer/caa-dialog-family.js +323 -0
  21. package/dist/renderer/caa-dialog-family.js.map +1 -0
  22. package/dist/renderer/caa-feature-families.d.ts +4 -0
  23. package/dist/renderer/caa-feature-families.d.ts.map +1 -0
  24. package/dist/renderer/caa-feature-families.js +250 -0
  25. package/dist/renderer/caa-feature-families.js.map +1 -0
  26. package/dist/renderer/caa-renderer.d.ts +6 -0
  27. package/dist/renderer/caa-renderer.d.ts.map +1 -0
  28. package/dist/renderer/caa-renderer.js +25 -0
  29. package/dist/renderer/caa-renderer.js.map +1 -0
  30. package/dist/renderer/cpp-parameter-family.d.ts +7 -0
  31. package/dist/renderer/cpp-parameter-family.d.ts.map +1 -0
  32. package/dist/renderer/cpp-parameter-family.js +77 -0
  33. package/dist/renderer/cpp-parameter-family.js.map +1 -0
  34. package/dist/renderer/dialog-support.d.ts +6 -0
  35. package/dist/renderer/dialog-support.d.ts.map +1 -0
  36. package/dist/renderer/dialog-support.js +16 -0
  37. package/dist/renderer/dialog-support.js.map +1 -0
  38. package/dist/renderer/family-registry.d.ts +28 -0
  39. package/dist/renderer/family-registry.d.ts.map +1 -0
  40. package/dist/renderer/family-registry.js +55 -0
  41. package/dist/renderer/family-registry.js.map +1 -0
  42. package/dist/renderer/legacy-compatibility.d.ts +16 -0
  43. package/dist/renderer/legacy-compatibility.d.ts.map +1 -0
  44. package/dist/renderer/legacy-compatibility.js +77 -0
  45. package/dist/renderer/legacy-compatibility.js.map +1 -0
  46. package/dist/renderer/qt-dialog-family.d.ts +7 -0
  47. package/dist/renderer/qt-dialog-family.d.ts.map +1 -0
  48. package/dist/renderer/qt-dialog-family.js +231 -0
  49. package/dist/renderer/qt-dialog-family.js.map +1 -0
  50. package/package.json +4 -2
  51. package/tests/fixtures/contracts/apply-projection-v1.json +82 -0
  52. package/tests/fixtures/contracts/codegen-host-contract-v1.json +280 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caa-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/caa-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAMjC,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,2oBAI1B,CAAC;AAEX,mDAAmD;AACnD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,sBAAsB,GACjC,uBAAuB,CAWzB"}
@@ -0,0 +1,25 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { KT_CODEGEN_CAA_COMMAND_FAMILIES } from "./caa-command-families.js";
3
+ import { KT_CODEGEN_CAA_DIALOG_FAMILIES } from "./caa-dialog-family.js";
4
+ import { KT_CODEGEN_CAA_FEATURE_FAMILIES } from "./caa-feature-families.js";
5
+ import { ktCodegenRenderRegisteredFamilies } from "./family-registry.js";
6
+ /** CAA 只在这里组合能力;具体模板归各 block family 所有。 */
7
+ export const KT_CODEGEN_CAA_FAMILIES = [
8
+ ...KT_CODEGEN_CAA_FEATURE_FAMILIES,
9
+ ...KT_CODEGEN_CAA_DIALOG_FAMILIES,
10
+ ...KT_CODEGEN_CAA_COMMAND_FAMILIES,
11
+ ];
12
+ /** 通过 family registry 生成已迁移 CAA block,并报告未注册目标。 */
13
+ export function ktCodegenRenderCaa(context, algorithms) {
14
+ return ktCodegenRenderRegisteredFamilies(context, algorithms, KT_CODEGEN_CAA_FAMILIES, {
15
+ supportedTargets: [
16
+ "caa.core",
17
+ "caa.model",
18
+ "caa.feature-io",
19
+ "caa.control",
20
+ "caa.dialog",
21
+ ],
22
+ noFamilyMessage: (target) => `${target} has no migrated CAA block renderer yet.`,
23
+ });
24
+ }
25
+ //# sourceMappingURL=caa-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caa-renderer.js","sourceRoot":"","sources":["../../src/renderer/caa-renderer.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAOtC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAEzE,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,GAAG,+BAA+B;IAClC,GAAG,8BAA8B;IACjC,GAAG,+BAA+B;CAC1B,CAAC;AAEX,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAChC,OAAiC,EACjC,UAAkC;IAElC,OAAO,iCAAiC,CAAC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE;QACrF,gBAAgB,EAAE;YAChB,UAAU;YACV,WAAW;YACX,gBAAgB;YAChB,aAAa;YACb,YAAY;SACb;QACD,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,0CAA0C;KACjF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { KtCodegenDefaultValueFormatter, KtCodegenRendererContext, KtCodegenRendererResult } from "../KtCodegenRenderer.js";
2
+ import type { KtCodegenRendererFamily } from "./family-registry.js";
3
+ export declare const KT_CODEGEN_CPP_PARAMETER_BLOCKS: readonly ["PARAM CONSTRUCTOR", "PARAM DECLARATION", "PARAM DESTRUCTOR", "PARAM EQUAL"];
4
+ export declare const KT_CODEGEN_CPP_PARAMETER_FAMILIES: readonly [KtCodegenRendererFamily<KtCodegenDefaultValueFormatter>];
5
+ /** 通过 block family 注册表生成普通 C++ Parameter 目标。 */
6
+ export declare function ktCodegenRenderCppParameter(context: KtCodegenRendererContext, formatDefaultValue: KtCodegenDefaultValueFormatter): KtCodegenRendererResult;
7
+ //# sourceMappingURL=cpp-parameter-family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpp-parameter-family.d.ts","sourceRoot":"","sources":["../../src/renderer/cpp-parameter-family.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAQpE,eAAO,MAAM,+BAA+B,wFAKK,CAAC;AAgFlD,eAAO,MAAM,iCAAiC,oEAEyC,CAAC;AAExF,gDAAgD;AAChD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,wBAAwB,EACjC,kBAAkB,EAAE,8BAA8B,GACjD,uBAAuB,CAUzB"}
@@ -0,0 +1,77 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { ktCodegenRenderRegisteredFamilies } from "./family-registry.js";
3
+ import { ktCodegenRenderLegacyEnd, ktCodegenRenderLegacyNotes, ktCodegenRenderLegacyStart, } from "./legacy-compatibility.js";
4
+ export const KT_CODEGEN_CPP_PARAMETER_BLOCKS = [
5
+ "PARAM CONSTRUCTOR",
6
+ "PARAM DECLARATION",
7
+ "PARAM DESTRUCTOR",
8
+ "PARAM EQUAL",
9
+ ];
10
+ /** 按旧 VB 规则生成一个普通 C++ Parameter 自动代码块的逻辑行。 */
11
+ function ktCodegenRenderCppParameterLines(region, items, formatDefaultValue) {
12
+ const prefix = region.start.linePrefix;
13
+ const lines = ktCodegenRenderLegacyStart(region);
14
+ switch (region.blockKey) {
15
+ case "PARAM CONSTRUCTOR":
16
+ for (const item of items) {
17
+ const initializerPrefix = item.id === 1 ? ": " : ", ";
18
+ lines.push(`${prefix}${initializerPrefix}${item.paramString}(${formatDefaultValue(item)}) // ${item.id}`);
19
+ }
20
+ // 旧方法使用 Trim 写出 End,故 clang-format 与 End 不保留 `_prefix`。
21
+ lines.push("", "// clang-format on", `// ${region.end.text}`);
22
+ return lines;
23
+ case "PARAM EQUAL":
24
+ for (const item of items) {
25
+ // 旧 VB 使用 IndexOf("*") > 0;星号位于首字符时不会注释该行。
26
+ const pointerPrefix = item.dataType.indexOf("*") > 0 ? "// " : "";
27
+ lines.push(`${prefix}${pointerPrefix}${item.paramString} = iOriginal.${item.paramString}; // ${item.id}`);
28
+ }
29
+ return [...lines, ...ktCodegenRenderLegacyEnd(region)];
30
+ case "PARAM DESTRUCTOR":
31
+ for (const item of items) {
32
+ if (item.dataType.toLowerCase() === "catispecobject_var") {
33
+ lines.push(`${prefix}${item.paramString} = NULL_var; // ${item.id}`);
34
+ }
35
+ else if (item.dataType.includes("*")) {
36
+ lines.push(`${prefix}${item.paramString} = NULL; // ${item.id}`);
37
+ }
38
+ else {
39
+ lines.push(`${prefix}// ${item.paramString} = ${formatDefaultValue(item, true)}; // ${item.id}`);
40
+ }
41
+ }
42
+ return [...lines, ...ktCodegenRenderLegacyEnd(region)];
43
+ case "PARAM DECLARATION":
44
+ lines.push("", `${prefix}// @app Kt Auto Code`, `${prefix}// @version 5.0.0, (2024)`, "");
45
+ items.forEach((item, index) => {
46
+ if (index > 0)
47
+ lines.push("");
48
+ lines.push(...ktCodegenRenderLegacyNotes(item, prefix));
49
+ lines.push(`${prefix}${item.dataType} ${item.paramString};`);
50
+ });
51
+ return [...lines, ...ktCodegenRenderLegacyEnd(region)];
52
+ default:
53
+ return [];
54
+ }
55
+ }
56
+ const cppParameterFamily = {
57
+ id: "cpp.parameter",
58
+ blockKeys: KT_CODEGEN_CPP_PARAMETER_BLOCKS,
59
+ renderRegion(context, region, formatDefaultValue) {
60
+ const items = context.param.items.filter((item) => item.nameSuffix === region.nameSuffix && item.id >= 1);
61
+ return {
62
+ items,
63
+ lines: ktCodegenRenderCppParameterLines(region, items, formatDefaultValue),
64
+ };
65
+ },
66
+ };
67
+ export const KT_CODEGEN_CPP_PARAMETER_FAMILIES = [
68
+ cppParameterFamily,
69
+ ];
70
+ /** 通过 block family 注册表生成普通 C++ Parameter 目标。 */
71
+ export function ktCodegenRenderCppParameter(context, formatDefaultValue) {
72
+ return ktCodegenRenderRegisteredFamilies(context, formatDefaultValue, KT_CODEGEN_CPP_PARAMETER_FAMILIES, {
73
+ supportedTargets: ["cpp.parameter"],
74
+ noFamilyMessage: (target) => `${target} has no registered C++ block family.`,
75
+ });
76
+ }
77
+ //# sourceMappingURL=cpp-parameter-family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpp-parameter-family.js","sourceRoot":"","sources":["../../src/renderer/cpp-parameter-family.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { KtCodegenItem } from "../KtCodegenItem.js";
2
+ /** 取得旧 UI 多控件分支使用的集合起始下标;不支持时返回 `null`。 */
3
+ export declare function ktCodegenLegacyDialogListIndex(dataType: string, includeFloat: boolean): number | null;
4
+ /** 生成移除下划线后的旧 CAA/Qt 控件成员后缀。 */
5
+ export declare function ktCodegenDialogParamName(item: KtCodegenItem): string;
6
+ //# sourceMappingURL=dialog-support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-support.d.ts","sourceRoot":"","sources":["../../src/renderer/dialog-support.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,2CAA2C;AAC3C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,OAAO,GACpB,MAAM,GAAG,IAAI,CAKf;AAED,gCAAgC;AAChC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /** 取得旧 UI 多控件分支使用的集合起始下标;不支持时返回 `null`。 */
3
+ export function ktCodegenLegacyDialogListIndex(dataType, includeFloat) {
4
+ if (dataType === "CATRawColldouble")
5
+ return 1;
6
+ if (dataType === "ListKtdouble" || dataType === "ListKtint")
7
+ return 0;
8
+ if (includeFloat && dataType === "ListKtfloat")
9
+ return 0;
10
+ return null;
11
+ }
12
+ /** 生成移除下划线后的旧 CAA/Qt 控件成员后缀。 */
13
+ export function ktCodegenDialogParamName(item) {
14
+ return item.paramString.replaceAll("_", "");
15
+ }
16
+ //# sourceMappingURL=dialog-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-support.js","sourceRoot":"","sources":["../../src/renderer/dialog-support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAItC,2CAA2C;AAC3C,MAAM,UAAU,8BAA8B,CAC5C,QAAgB,EAChB,YAAqB;IAErB,IAAI,QAAQ,KAAK,kBAAkB;QAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,CAAC,CAAC;IACtE,IAAI,YAAY,IAAI,QAAQ,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,wBAAwB,CAAC,IAAmB;IAC1D,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type KtCodegenBlockKey } from "../blocks/legacy-blocks.js";
2
+ import type { KtCodegenMarkerRegion } from "../KtCodegenMarker.js";
3
+ import type { KtCodegenItem } from "../KtCodegenItem.js";
4
+ import type { KtCodegenRendererContext, KtCodegenRendererResult } from "../KtCodegenRenderer.js";
5
+ /** 一个 family 对单个安全 Marker 区域的纯渲染结果。 */
6
+ export interface KtCodegenRenderedRegion {
7
+ readonly items: readonly KtCodegenItem[];
8
+ readonly lines: readonly string[];
9
+ }
10
+ /**
11
+ * Block family strategy:注册表只映射能力,模板实现留在各 family 模块。
12
+ *
13
+ * `services` 由 Core 注入并保持只读,避免 family 反向依赖 Core。
14
+ */
15
+ export interface KtCodegenRendererFamily<TServices> {
16
+ readonly id: string;
17
+ readonly blockKeys: readonly KtCodegenBlockKey[];
18
+ renderRegion(context: KtCodegenRendererContext, region: KtCodegenMarkerRegion, services: TServices): KtCodegenRenderedRegion;
19
+ }
20
+ export interface KtCodegenFamilyRegistryOptions {
21
+ readonly supportedTargets: readonly KtCodegenRendererContext["target"][];
22
+ readonly noFamilyMessage: (target: KtCodegenRendererContext["target"]) => string;
23
+ }
24
+ /** 建立不可重复的 block → family 能力映射;注册表本身不含模板。 */
25
+ export declare function ktCodegenCreateRendererFamilyRegistry<TServices>(families: readonly KtCodegenRendererFamily<TServices>[]): ReadonlyMap<KtCodegenBlockKey, KtCodegenRendererFamily<TServices>>;
26
+ /** 用 family 注册表生成一个目标,统一处理 artifact 绑定、兼容告警和待迁移诊断。 */
27
+ export declare function ktCodegenRenderRegisteredFamilies<TServices>(context: KtCodegenRendererContext, services: TServices, families: readonly KtCodegenRendererFamily<TServices>[], options: KtCodegenFamilyRegistryOptions): KtCodegenRendererResult;
28
+ //# sourceMappingURL=family-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-registry.d.ts","sourceRoot":"","sources":["../../src/renderer/family-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAMjC,uCAAuC;AACvC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB,CAAC,SAAS;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,YAAY,CACV,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,EAAE,SAAS,GAClB,uBAAuB,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACzE,QAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;CAClF;AAED,6CAA6C;AAC7C,wBAAgB,qCAAqC,CAAC,SAAS,EAC7D,QAAQ,EAAE,SAAS,uBAAuB,CAAC,SAAS,CAAC,EAAE,GACtD,WAAW,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAcpE;AAED,sDAAsD;AACtD,wBAAgB,iCAAiC,CAAC,SAAS,EACzD,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,SAAS,uBAAuB,CAAC,SAAS,CAAC,EAAE,EACvD,OAAO,EAAE,8BAA8B,GACtC,uBAAuB,CAmDzB"}
@@ -0,0 +1,55 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { ktCodegenGetBlock } from "../blocks/legacy-blocks.js";
3
+ import { ktCodegenAppendRegionArtifact, ktCodegenLegacyDeprecatedDiagnostic, } from "./legacy-compatibility.js";
4
+ /** 建立不可重复的 block → family 能力映射;注册表本身不含模板。 */
5
+ export function ktCodegenCreateRendererFamilyRegistry(families) {
6
+ const registry = new Map();
7
+ for (const family of families) {
8
+ for (const blockKey of family.blockKeys) {
9
+ const existing = registry.get(blockKey);
10
+ if (existing) {
11
+ throw new Error(`Renderer block ${blockKey} is registered by both ${existing.id} and ${family.id}.`);
12
+ }
13
+ registry.set(blockKey, family);
14
+ }
15
+ }
16
+ return registry;
17
+ }
18
+ /** 用 family 注册表生成一个目标,统一处理 artifact 绑定、兼容告警和待迁移诊断。 */
19
+ export function ktCodegenRenderRegisteredFamilies(context, services, families, options) {
20
+ const registry = ktCodegenCreateRendererFamilyRegistry(families);
21
+ const artifacts = [];
22
+ const diagnostics = [];
23
+ const requestedBlocks = new Set(context.blockKeys);
24
+ for (const region of context.markerRegions) {
25
+ const family = registry.get(region.blockKey);
26
+ if (!family ||
27
+ !requestedBlocks.has(region.blockKey) ||
28
+ ktCodegenGetBlock(region.blockKey).target !== context.target) {
29
+ continue;
30
+ }
31
+ const rendered = family.renderRegion(context, region, services);
32
+ const artifactCount = artifacts.length;
33
+ ktCodegenAppendRegionArtifact(context, region, rendered.items, rendered.lines, artifacts, diagnostics);
34
+ if (artifacts.length > artifactCount &&
35
+ ktCodegenGetBlock(region.blockKey).legacyState === "legacy-deprecated") {
36
+ diagnostics.push(ktCodegenLegacyDeprecatedDiagnostic(region));
37
+ }
38
+ }
39
+ const targetBlocks = context.blockKeys.filter((blockKey) => ktCodegenGetBlock(blockKey).target === context.target);
40
+ const pendingBlocks = targetBlocks.filter((blockKey) => !registry.has(blockKey));
41
+ const targetSupported = options.supportedTargets.includes(context.target);
42
+ const status = targetSupported && pendingBlocks.length === 0 ? "ready" : "scaffold";
43
+ if (status === "scaffold") {
44
+ diagnostics.push({
45
+ code: "renderer.blocks-pending",
46
+ severity: "info",
47
+ message: pendingBlocks.length > 0
48
+ ? `${context.target} still has pending blocks: ${pendingBlocks.join(", ")}.`
49
+ : options.noFamilyMessage(context.target),
50
+ path: { source: "renderer", field: context.target },
51
+ });
52
+ }
53
+ return { status, artifacts, diagnostics };
54
+ }
55
+ //# sourceMappingURL=family-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-registry.js","sourceRoot":"","sources":["../../src/renderer/family-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { KtCodegenArtifact } from "../api/contracts.js";
2
+ import type { KtCodegenMarkerRegion } from "../KtCodegenMarker.js";
3
+ import type { KtCodegenItem } from "../KtCodegenItem.js";
4
+ import type { KtCodegenParamSpecListClassifier, KtCodegenRendererContext } from "../KtCodegenRenderer.js";
5
+ import type { KtCodegenDiagnostic } from "../model/diagnostic.js";
6
+ /** 按旧 `CodeAppendNotes` 的0/1/2模式创建 Doxygen 注释。 */
7
+ export declare function ktCodegenRenderLegacyNotes(item: KtCodegenItem, prefix: string, mode?: 0 | 1 | 2, isParamSpecList?: KtCodegenParamSpecListClassifier): string[];
8
+ /** 创建旧 Start 标记和 clang-format off 头部。 */
9
+ export declare function ktCodegenRenderLegacyStart(region: KtCodegenMarkerRegion): string[];
10
+ /** 创建标准旧 clang-format on 和 End 标记尾部。 */
11
+ export declare function ktCodegenRenderLegacyEnd(region: KtCodegenMarkerRegion): string[];
12
+ /** 把逻辑行组装为绑定安全区域的 artifact,或返回快照缺失诊断。 */
13
+ export declare function ktCodegenAppendRegionArtifact(context: KtCodegenRendererContext, region: KtCodegenMarkerRegion, items: readonly KtCodegenItem[], lines: readonly string[], artifacts: KtCodegenArtifact[], diagnostics: KtCodegenDiagnostic[]): void;
14
+ /** 兼容 family 统一产生废弃旧块告警,模板模块无需重复协议文案。 */
15
+ export declare function ktCodegenLegacyDeprecatedDiagnostic(region: KtCodegenMarkerRegion): KtCodegenDiagnostic;
16
+ //# sourceMappingURL=legacy-compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-compatibility.d.ts","sourceRoot":"","sources":["../../src/renderer/legacy-compatibility.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,gCAAgC,EAChC,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE,kDAAkD;AAClD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,CAAC,GAAG,CAAC,GAAG,CAAK,EACnB,eAAe,CAAC,EAAE,gCAAgC,GACjD,MAAM,EAAE,CAiBV;AAED,yCAAyC;AACzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAGlF;AAED,wCAAwC;AACxC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAGhF;AAoBD,yCAAyC;AACzC,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,SAAS,EAAE,iBAAiB,EAAE,EAC9B,WAAW,EAAE,mBAAmB,EAAE,GACjC,IAAI,CAqBN;AAED,yCAAyC;AACzC,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,qBAAqB,GAC5B,mBAAmB,CAWrB"}
@@ -0,0 +1,77 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /** 按旧 `CodeAppendNotes` 的0/1/2模式创建 Doxygen 注释。 */
3
+ export function ktCodegenRenderLegacyNotes(item, prefix, mode = 0, isParamSpecList) {
4
+ const lines = [`${prefix}/**`, `${prefix} * @brief ${item.name}`];
5
+ if (mode === 1) {
6
+ lines.push(`${prefix} * @param[in] value ${item.dataType}`, `${prefix} * @return HRESULT`);
7
+ }
8
+ else if (mode === 2) {
9
+ lines.push(`${prefix} * @return ${isParamSpecList?.(item) ? "HRESULT" : item.dataType}`);
10
+ }
11
+ if (item.author.length > 0)
12
+ lines.push(`${prefix} * @author ${item.author}`);
13
+ if (item.createDate.length > 0)
14
+ lines.push(`${prefix} * @date ${item.createDate}`);
15
+ if (item.notes.length > 0)
16
+ lines.push(`${prefix} * @note ${item.notes}`);
17
+ lines.push(`${prefix} * @id ${item.id}`, `${prefix} */`);
18
+ return lines;
19
+ }
20
+ /** 创建旧 Start 标记和 clang-format off 头部。 */
21
+ export function ktCodegenRenderLegacyStart(region) {
22
+ const prefix = region.start.linePrefix;
23
+ return [`${prefix}// ${region.start.text}`, "", `${prefix}// clang-format off`];
24
+ }
25
+ /** 创建标准旧 clang-format on 和 End 标记尾部。 */
26
+ export function ktCodegenRenderLegacyEnd(region) {
27
+ const prefix = region.start.linePrefix;
28
+ return ["", `${prefix}// clang-format on`, `${prefix}// ${region.end.text}`];
29
+ }
30
+ /** 从快照推断一个区域写回时应继续使用的换行符。 */
31
+ function ktCodegenResolveRegionEol(context, region) {
32
+ const file = context.snapshot.files.find((candidate) => candidate.path === region.path && candidate.fingerprint === region.sourceFingerprint);
33
+ if (!file)
34
+ return null;
35
+ const eol = file.eol === "crlf" || (file.eol === undefined && file.text.includes("\r\n"))
36
+ ? "\r\n"
37
+ : "\n";
38
+ const endTail = file.text.slice(region.end.markerEndOffset, region.end.lineEndOffset);
39
+ return { eol, hasFinalEol: endTail.includes("\n") || endTail.includes("\r") };
40
+ }
41
+ /** 把逻辑行组装为绑定安全区域的 artifact,或返回快照缺失诊断。 */
42
+ export function ktCodegenAppendRegionArtifact(context, region, items, lines, artifacts, diagnostics) {
43
+ const lineEnding = ktCodegenResolveRegionEol(context, region);
44
+ if (!lineEnding) {
45
+ diagnostics.push({
46
+ code: "renderer.source-snapshot-missing",
47
+ severity: "error",
48
+ message: `Marker region ${region.id} no longer has its source snapshot.`,
49
+ path: { source: "renderer", file: region.path, field: region.blockKey },
50
+ });
51
+ return;
52
+ }
53
+ const body = lines.join(lineEnding.eol);
54
+ artifacts.push({
55
+ id: `kt.codegen.artifact:${context.target}:${region.id}`,
56
+ regionId: region.id,
57
+ target: context.target,
58
+ blockKey: region.blockKey,
59
+ classId: region.classId,
60
+ content: lineEnding.hasFinalEol ? `${body}${lineEnding.eol}` : body,
61
+ sourceParameters: items.map((item) => item.paramString),
62
+ });
63
+ }
64
+ /** 兼容 family 统一产生废弃旧块告警,模板模块无需重复协议文案。 */
65
+ export function ktCodegenLegacyDeprecatedDiagnostic(region) {
66
+ return {
67
+ code: "renderer.legacy-deprecated-block",
68
+ severity: "warning",
69
+ message: `${region.blockKey} is retained for compatibility; its archived VB method is marked discarded.`,
70
+ path: {
71
+ source: "renderer",
72
+ file: region.path,
73
+ field: region.blockKey,
74
+ },
75
+ };
76
+ }
77
+ //# sourceMappingURL=legacy-compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-compatibility.js","sourceRoot":"","sources":["../../src/renderer/legacy-compatibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { KtCodegenQtAlgorithms, KtCodegenRendererContext, KtCodegenRendererResult } from "../KtCodegenRenderer.js";
2
+ import type { KtCodegenRendererFamily } from "./family-registry.js";
3
+ export declare const KT_CODEGEN_QT_BLOCKS: readonly ["QT UPDATE DIALOG", "QT UPDATE INFORS"];
4
+ export declare const KT_CODEGEN_QT_FAMILIES: readonly [KtCodegenRendererFamily<KtCodegenQtAlgorithms>];
5
+ /** 通过 block family 注册表生成 Qt Dialog/Parameter 双向更新目标。 */
6
+ export declare function ktCodegenRenderQt(context: KtCodegenRendererContext, algorithms: KtCodegenQtAlgorithms): KtCodegenRendererResult;
7
+ //# sourceMappingURL=qt-dialog-family.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qt-dialog-family.d.ts","sourceRoot":"","sources":["../../src/renderer/qt-dialog-family.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAOpE,eAAO,MAAM,oBAAoB,mDAGgB,CAAC;AAqQlD,eAAO,MAAM,sBAAsB,2DAE2C,CAAC;AAE/E,wDAAwD;AACxD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,EACjC,UAAU,EAAE,qBAAqB,GAChC,uBAAuB,CAKzB"}
@@ -0,0 +1,231 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { ktCodegenDialogParamName, ktCodegenLegacyDialogListIndex, } from "./dialog-support.js";
3
+ import { ktCodegenRenderRegisteredFamilies } from "./family-registry.js";
4
+ import { ktCodegenRenderLegacyEnd, ktCodegenRenderLegacyStart, } from "./legacy-compatibility.js";
5
+ export const KT_CODEGEN_QT_BLOCKS = [
6
+ "QT UPDATE DIALOG",
7
+ "QT UPDATE INFORS",
8
+ ];
9
+ /** 按旧 `CreateQTUpdateDialog` 规则把共享参数写入 Qt 控件。 */
10
+ function ktCodegenRenderQtUpdateDialogLines(region, items, isPointOrVector3DType) {
11
+ const prefix = region.start.linePrefix;
12
+ const lines = ktCodegenRenderLegacyStart(region);
13
+ for (const item of items) {
14
+ lines.push("");
15
+ const dialogPointer = item.isParamDlg ? "dialogMore->" : "ui->";
16
+ const param = `parameter->${item.paramString}`;
17
+ const name = ktCodegenDialogParamName(item);
18
+ let notes = `// ${item.id}, ${item.paramString}, ${item.notes}`;
19
+ const generated = [];
20
+ if (item.componentCount <= 0) {
21
+ notes += `,NO ACTION, ${item.component},${item.componentCount}`;
22
+ }
23
+ else if (item.component === "QListWidget") {
24
+ generated.push(`${prefix}KT_AUTO_FIELD_SET_LINE(${dialogPointer}listWidget${name}, ${param});`);
25
+ }
26
+ else if (item.component === "QDoubleSpinBox" || item.component === "QSpinBox") {
27
+ const componentStem = item.component === "QDoubleSpinBox" ? "doubleSpinBox" : "spinBox";
28
+ const component = `${dialogPointer}${componentStem}${name}`;
29
+ if (isPointOrVector3DType(item.dataType)) {
30
+ const unitFactor = item.unit === "mm" ? " * 0.001" : "";
31
+ generated.push(`${prefix}${component}X->setValue(${param}.GetX()${unitFactor});`, `${prefix}${component}Y->setValue(${param}.GetY()${unitFactor});`, `${prefix}${component}Z->setValue(${param}.GetZ()${unitFactor});`);
32
+ }
33
+ else if (item.componentCount === 1) {
34
+ generated.push(`${prefix}${component}->setValue(${param});`);
35
+ }
36
+ else {
37
+ const indexSub = ktCodegenLegacyDialogListIndex(item.dataType, item.component === "QSpinBox");
38
+ if (indexSub === null) {
39
+ notes += "Data type is not suitable for auto code.";
40
+ }
41
+ else {
42
+ const unitFactor = item.unit === "mm" ? " * 0.001" : "";
43
+ for (let index = 0; index < item.componentCount; index += 1) {
44
+ generated.push(`${prefix}${component}${index}->setValue(${param}[${index + indexSub}]${unitFactor});`);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ else if (item.component.startsWith("QCheckBox")) {
50
+ const component = `${dialogPointer}checkBox${name}`;
51
+ if (item.componentCount === 1) {
52
+ generated.push(`${prefix}${component}->setChecked(${param});`);
53
+ }
54
+ else {
55
+ for (let index = 0; index < item.componentCount; index += 1) {
56
+ generated.push(`${prefix}${component}${index}->setChecked( ${param} & (1<<${index}));`);
57
+ }
58
+ }
59
+ }
60
+ else if (item.component.startsWith("QRadioButton")) {
61
+ const component = `${dialogPointer}radioButton${name}`;
62
+ const count = item.componentCount === 1 ? 2 : item.componentCount;
63
+ const lastIndex = count - 1;
64
+ generated.push(`${prefix}if (${param}>${lastIndex} || ${param}<0) ${param}=0;//Correct`);
65
+ for (let index = 0; index < count; index += 1) {
66
+ generated.push(`${prefix}${component}${index}->setChecked( ${param}==${index});`);
67
+ }
68
+ }
69
+ else if (item.component.startsWith("QComboBox")) {
70
+ const component = `${dialogPointer}comboBox${name}`;
71
+ if (item.dataType === "int" ||
72
+ item.dataType === "short" ||
73
+ item.dataType === "uint32_t") {
74
+ generated.push(`${prefix}${component}->setCurrentIndex(${param});`);
75
+ }
76
+ else if (item.dataType === "QString") {
77
+ generated.push(`${prefix}${component}->setEditText(${param});`);
78
+ }
79
+ else {
80
+ // 原 VB 使用普通字符串而非插值字符串,故输出中保留字面占位符。
81
+ generated.push(`${prefix}${component}->setEditText(QString::fromLocal8Bit({strParamSame}.str()));`);
82
+ }
83
+ }
84
+ else if (item.component === "QLineEdit") {
85
+ const component = `${dialogPointer}lineEdit${name}`;
86
+ const value = item.dataType === "KtString"
87
+ ? ` QString::fromLocal8Bit(${param}.str()) `
88
+ : param;
89
+ if (item.componentCount === 1) {
90
+ generated.push(`${prefix}${component}->setText( ${value});`);
91
+ }
92
+ else {
93
+ for (let index = 0; index < item.componentCount; index += 1) {
94
+ generated.push(`${prefix}${component}${index}->setText(${value}[${index + 1}]);`);
95
+ }
96
+ }
97
+ }
98
+ else {
99
+ const supportNote = item.component.length === 0 || item.component === "QPushButton"
100
+ ? ""
101
+ : " (Not Support)";
102
+ notes += `,NO ACTION, ${item.component}${supportNote},${item.componentCount}`;
103
+ }
104
+ lines.push(`${prefix}${notes}`, ...generated);
105
+ }
106
+ return [...lines, ...ktCodegenRenderLegacyEnd(region)];
107
+ }
108
+ /** 按旧 `CreateQTUpdateInfors` 规则把 Qt 控件值写回共享参数。 */
109
+ function ktCodegenRenderQtUpdateInforsLines(region, items, isPointOrVector3DType) {
110
+ const prefix = region.start.linePrefix;
111
+ const lines = ktCodegenRenderLegacyStart(region);
112
+ for (const item of items) {
113
+ lines.push("");
114
+ const dialogPointer = item.isParamDlg ? "dialogMore->" : "ui->";
115
+ const param = `parameter->${item.paramString}`;
116
+ const name = ktCodegenDialogParamName(item);
117
+ let notes = `// ${item.id}, ${item.paramString}, ${item.notes}`;
118
+ const generated = [];
119
+ const convertToInt = item.tcKind === "tk_integer" && item.dataType.toLowerCase() !== "int";
120
+ if (item.componentCount <= 0) {
121
+ notes += `,NO ACTION, ${item.component},${item.componentCount}`;
122
+ }
123
+ else if (item.component === "QDoubleSpinBox" || item.component === "QSpinBox") {
124
+ const componentStem = item.component === "QDoubleSpinBox" ? "doubleSpinBox" : "spinBox";
125
+ const component = `${dialogPointer}${componentStem}${name}`;
126
+ if (isPointOrVector3DType(item.dataType)) {
127
+ const unitFactor = item.unit === "mm" ? " * 1000.0" : "";
128
+ generated.push(`${prefix}${param}.SetX(${component}X->value()${unitFactor});`, `${prefix}${param}.SetY(${component}Y->value()${unitFactor});`, `${prefix}${param}.SetZ(${component}Z->value()${unitFactor});`);
129
+ }
130
+ else if (item.componentCount === 1) {
131
+ const value = `${component}->value()`;
132
+ if (item.component === "QDoubleSpinBox" && item.dataType === "int") {
133
+ generated.push(`${prefix}${param} = Kt::round(${value}); //round to int`);
134
+ }
135
+ else {
136
+ generated.push(`${prefix}${param} = ${value};`);
137
+ }
138
+ }
139
+ else {
140
+ const indexSub = ktCodegenLegacyDialogListIndex(item.dataType, true);
141
+ if (indexSub === null) {
142
+ notes += "Data type is not suitable for auto code.";
143
+ }
144
+ else {
145
+ for (let index = 0; index < item.componentCount; index += 1) {
146
+ const value = `${component}${index}->value()`;
147
+ const rounded = item.component === "QDoubleSpinBox" && item.dataType === "int"
148
+ ? `Kt::round(${value})`
149
+ : value;
150
+ generated.push(`${prefix}${param}[${index + indexSub}] = ${rounded};${rounded !== value ? " //round to int" : ""}`);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ else if (item.component.startsWith("QCheckBox")) {
156
+ const component = `${dialogPointer}checkBox${name}`;
157
+ if (item.componentCount === 1) {
158
+ generated.push(`${prefix}${param} = ${component}->isChecked();`);
159
+ }
160
+ else {
161
+ generated.push(`${prefix}${param}=0;`);
162
+ for (let index = 0; index < item.componentCount; index += 1) {
163
+ generated.push(`${prefix}if (${component}${index}->isChecked()) { ${param} = ${param} | (1<<${index}); }`);
164
+ }
165
+ }
166
+ }
167
+ else if (item.component.startsWith("QRadioButton")) {
168
+ const component = `${dialogPointer}radioButton${name}`;
169
+ const count = item.componentCount === 1 ? 2 : item.componentCount;
170
+ generated.push(`${prefix}${param} = 0;//默认值0`);
171
+ for (let index = 0; index < count; index += 1) {
172
+ generated.push(`${prefix}if (${component}${index}->isChecked())`, `${prefix} ${param} = ${convertToInt ? `(${item.dataType})` : ""}${index};${convertToInt ? "}" : ""}`);
173
+ }
174
+ }
175
+ else if (item.component.startsWith("QComboBox")) {
176
+ const component = `${dialogPointer}comboBox${name}`;
177
+ if (item.dataType === "int" ||
178
+ item.dataType === "short" ||
179
+ item.dataType === "uint32_t") {
180
+ generated.push(`${prefix}${param} = ${component}->currentIndex();`);
181
+ }
182
+ else if (item.dataType === "QString") {
183
+ generated.push(`${prefix}${param} = ${component}->currentText();`);
184
+ }
185
+ else {
186
+ generated.push(`${prefix}${param} = ${component}->currentText().toLocal8Bit().constData();`);
187
+ }
188
+ }
189
+ else if (item.component === "QLineEdit") {
190
+ const component = `${dialogPointer}lineEdit${name}`;
191
+ const conversion = item.dataType === "KtString" ? ".toLocal8Bit().constData()" : "";
192
+ if (item.componentCount === 1) {
193
+ generated.push(`${prefix}${param} = ${component}->text()${conversion};`);
194
+ }
195
+ else {
196
+ for (let index = 0; index < item.componentCount; index += 1) {
197
+ generated.push(`${prefix}${param}[${index + 1}] = ${component}${index}->text()${conversion};`);
198
+ }
199
+ }
200
+ }
201
+ else {
202
+ notes += `,NO ACTION, ${item.component} (Not Support),${item.componentCount}`;
203
+ }
204
+ lines.push(`${prefix}${notes}`, ...generated);
205
+ }
206
+ return [...lines, ...ktCodegenRenderLegacyEnd(region)];
207
+ }
208
+ const qtDialogFamily = {
209
+ id: "qt.dialog",
210
+ blockKeys: KT_CODEGEN_QT_BLOCKS,
211
+ renderRegion(context, region, algorithms) {
212
+ const items = context.param.items.filter((item) => item.nameSuffix === region.nameSuffix && item.id >= 1);
213
+ return {
214
+ items,
215
+ lines: region.blockKey === "QT UPDATE DIALOG"
216
+ ? ktCodegenRenderQtUpdateDialogLines(region, items, algorithms.isPointOrVector3DType)
217
+ : ktCodegenRenderQtUpdateInforsLines(region, items, algorithms.isPointOrVector3DType),
218
+ };
219
+ },
220
+ };
221
+ export const KT_CODEGEN_QT_FAMILIES = [
222
+ qtDialogFamily,
223
+ ];
224
+ /** 通过 block family 注册表生成 Qt Dialog/Parameter 双向更新目标。 */
225
+ export function ktCodegenRenderQt(context, algorithms) {
226
+ return ktCodegenRenderRegisteredFamilies(context, algorithms, KT_CODEGEN_QT_FAMILIES, {
227
+ supportedTargets: ["qt.dialog", "qt.parameter"],
228
+ noFamilyMessage: (target) => `${target} has no registered Qt block family.`,
229
+ });
230
+ }
231
+ //# sourceMappingURL=qt-dialog-family.js.map