draft-ole 0.9.0
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.ja.md +134 -0
- package/README.md +128 -0
- package/dist/chunk-5BNNDTRT.js +95 -0
- package/dist/chunk-5BNNDTRT.js.map +1 -0
- package/dist/chunk-STLTIBMA.js +7658 -0
- package/dist/chunk-STLTIBMA.js.map +1 -0
- package/dist/chunk-YK4Y4ENL.js +389 -0
- package/dist/chunk-YK4Y4ENL.js.map +1 -0
- package/dist/entries/app.cjs +7337 -0
- package/dist/entries/app.cjs.map +1 -0
- package/dist/entries/app.d.cts +115 -0
- package/dist/entries/app.d.ts +115 -0
- package/dist/entries/app.js +10 -0
- package/dist/entries/app.js.map +1 -0
- package/dist/entries/page.cjs +7558 -0
- package/dist/entries/page.cjs.map +1 -0
- package/dist/entries/page.d.cts +2 -0
- package/dist/entries/page.d.ts +2 -0
- package/dist/entries/page.js +30 -0
- package/dist/entries/page.js.map +1 -0
- package/dist/index.cjs +10524 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4700 -0
- package/dist/index.d.ts +4700 -0
- package/dist/index.js +2573 -0
- package/dist/index.js.map +1 -0
- package/dist/page-DylNkWXm.d.ts +366 -0
- package/dist/page-h3DPzs8l.d.cts +366 -0
- package/dist/transformer/call-detector.d.ts +38 -0
- package/dist/transformer/call-detector.d.ts.map +1 -0
- package/dist/transformer/call-detector.js +151 -0
- package/dist/transformer/call-detector.js.map +1 -0
- package/dist/transformer/command-injector.d.ts +27 -0
- package/dist/transformer/command-injector.d.ts.map +1 -0
- package/dist/transformer/command-injector.js +111 -0
- package/dist/transformer/command-injector.js.map +1 -0
- package/dist/transformer/diagnostic-reporter.d.ts +81 -0
- package/dist/transformer/diagnostic-reporter.d.ts.map +1 -0
- package/dist/transformer/diagnostic-reporter.js +330 -0
- package/dist/transformer/diagnostic-reporter.js.map +1 -0
- package/dist/transformer/each-scope-branch.d.ts +28 -0
- package/dist/transformer/each-scope-branch.d.ts.map +1 -0
- package/dist/transformer/each-scope-branch.js +95 -0
- package/dist/transformer/each-scope-branch.js.map +1 -0
- package/dist/transformer/each-state-rewriter.d.ts +117 -0
- package/dist/transformer/each-state-rewriter.d.ts.map +1 -0
- package/dist/transformer/each-state-rewriter.js +393 -0
- package/dist/transformer/each-state-rewriter.js.map +1 -0
- package/dist/transformer/format-diagnostics.d.ts +27 -0
- package/dist/transformer/format-diagnostics.d.ts.map +1 -0
- package/dist/transformer/format-diagnostics.js +50 -0
- package/dist/transformer/format-diagnostics.js.map +1 -0
- package/dist/transformer/handler-ir-extractor.d.ts +71 -0
- package/dist/transformer/handler-ir-extractor.d.ts.map +1 -0
- package/dist/transformer/handler-ir-extractor.js +171 -0
- package/dist/transformer/handler-ir-extractor.js.map +1 -0
- package/dist/transformer/handler-serializer.d.ts +56 -0
- package/dist/transformer/handler-serializer.d.ts.map +1 -0
- package/dist/transformer/handler-serializer.js +315 -0
- package/dist/transformer/handler-serializer.js.map +1 -0
- package/dist/transformer/helper-context-resolver.d.ts +180 -0
- package/dist/transformer/helper-context-resolver.d.ts.map +1 -0
- package/dist/transformer/helper-context-resolver.js +376 -0
- package/dist/transformer/helper-context-resolver.js.map +1 -0
- package/dist/transformer/helper-decl-utils.d.ts +28 -0
- package/dist/transformer/helper-decl-utils.d.ts.map +1 -0
- package/dist/transformer/helper-decl-utils.js +92 -0
- package/dist/transformer/helper-decl-utils.js.map +1 -0
- package/dist/transformer/identifier-collector.d.ts +28 -0
- package/dist/transformer/identifier-collector.d.ts.map +1 -0
- package/dist/transformer/identifier-collector.js +184 -0
- package/dist/transformer/identifier-collector.js.map +1 -0
- package/dist/transformer/index.d.ts +56 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +333 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/inline-recovery.d.ts +109 -0
- package/dist/transformer/inline-recovery.d.ts.map +1 -0
- package/dist/transformer/inline-recovery.js +369 -0
- package/dist/transformer/inline-recovery.js.map +1 -0
- package/dist/transformer/label-injector.d.ts +105 -0
- package/dist/transformer/label-injector.d.ts.map +1 -0
- package/dist/transformer/label-injector.js +221 -0
- package/dist/transformer/label-injector.js.map +1 -0
- package/dist/transformer/package.json +3 -0
- package/dist/transformer/per-call-context.d.ts +95 -0
- package/dist/transformer/per-call-context.d.ts.map +1 -0
- package/dist/transformer/per-call-context.js +3 -0
- package/dist/transformer/per-call-context.js.map +1 -0
- package/dist/transformer/state-id-fallback.d.ts +85 -0
- package/dist/transformer/state-id-fallback.d.ts.map +1 -0
- package/dist/transformer/state-id-fallback.js +132 -0
- package/dist/transformer/state-id-fallback.js.map +1 -0
- package/dist/transformer/state-id-resolver.d.ts +104 -0
- package/dist/transformer/state-id-resolver.d.ts.map +1 -0
- package/dist/transformer/state-id-resolver.js +222 -0
- package/dist/transformer/state-id-resolver.js.map +1 -0
- package/dist/transformer/theme-class-detector.d.ts +47 -0
- package/dist/transformer/theme-class-detector.d.ts.map +1 -0
- package/dist/transformer/theme-class-detector.js +242 -0
- package/dist/transformer/theme-class-detector.js.map +1 -0
- package/dist/transformer/varname-resolver.d.ts +53 -0
- package/dist/transformer/varname-resolver.d.ts.map +1 -0
- package/dist/transformer/varname-resolver.js +231 -0
- package/dist/transformer/varname-resolver.js.map +1 -0
- package/dist/transformer/whitelist-registry.d.ts +68 -0
- package/dist/transformer/whitelist-registry.d.ts.map +1 -0
- package/dist/transformer/whitelist-registry.js +122 -0
- package/dist/transformer/whitelist-registry.js.map +1 -0
- package/dist/transformer/whitelist-validator.d.ts +59 -0
- package/dist/transformer/whitelist-validator.d.ts.map +1 -0
- package/dist/transformer/whitelist-validator.js +493 -0
- package/dist/transformer/whitelist-validator.js.map +1 -0
- package/dist/types-BXV3vhHS.d.cts +4590 -0
- package/dist/types-BXV3vhHS.d.ts +4590 -0
- package/package.json +121 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* each-scope-branch — Phase 4b per-call delegate
|
|
4
|
+
*
|
|
5
|
+
* (transformer-index-pipeline-split task 3.2)
|
|
6
|
+
*
|
|
7
|
+
* validation エラーなしの場合の each-scope 分岐を集約する delegate と
|
|
8
|
+
* その内部 sub-helper 群。旧 index.ts 主ループ L630-L700 相当のロジックを
|
|
9
|
+
* 3 個の named sub-helper に分割し、`runEachScopeBranch` から順次呼ぶ構造に
|
|
10
|
+
* 再構成する。cognitive concentration を dispersed する目的で sub-helper
|
|
11
|
+
* 単位での独立 unit test 可能性を保つ (Req 6.1, 6.2)。
|
|
12
|
+
*
|
|
13
|
+
* 本モジュールは each-state-rewriter.ts の Phase 4b orchestration 専用に
|
|
14
|
+
* 分離されている (Req 7.3: 受け側モジュールが 500 行を超えるため別ファイルへ分散)。
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.runEachScopeBranch = runEachScopeBranch;
|
|
18
|
+
const diagnostic_reporter_1 = require("./diagnostic-reporter");
|
|
19
|
+
const each_state_rewriter_1 = require("./each-state-rewriter");
|
|
20
|
+
const state_id_resolver_1 = require("./state-id-resolver");
|
|
21
|
+
// ---- sub-helpers (module-private) -------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* sub-helper 1: helper-aware path を考慮した EachScopeContext / paramSymbols を解決する。
|
|
24
|
+
*
|
|
25
|
+
* `preCheck.helperPathUsed === true` の場合は inherited 値を再利用する。
|
|
26
|
+
* それ以外は直接 walk-up で `detectEachScopeContext` を呼び、'ambiguous' は null に正規化する
|
|
27
|
+
* (直接 walk-up 経路は helperCallSites 未指定のため理論上 'ambiguous' を返さないが、
|
|
28
|
+
* 型 narrowing のため明示的にハンドリングする)。
|
|
29
|
+
*/
|
|
30
|
+
function resolveEachScopeForCall(base, callInfo, preCheck) {
|
|
31
|
+
if (preCheck.helperPathUsed) {
|
|
32
|
+
return {
|
|
33
|
+
eachContext: preCheck.inheritedEachContext,
|
|
34
|
+
eachParamSymbols: preCheck.inheritedEachParamSymbols,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const directCtx = (0, each_state_rewriter_1.detectEachScopeContext)(callInfo.callExpr, base.checker);
|
|
38
|
+
const eachContext = directCtx === null || directCtx === 'ambiguous' ? null : directCtx;
|
|
39
|
+
const eachParamSymbols = eachContext === null
|
|
40
|
+
? undefined
|
|
41
|
+
: (0, each_state_rewriter_1.collectEachScopeParamSymbols)(callInfo.callExpr, base.checker);
|
|
42
|
+
return { eachContext, eachParamSymbols };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* sub-helper 2: EachScopeContext が確定している場合のみ DT003 使用検証を実施。
|
|
46
|
+
* 既存 `validateEachScopeUsage` を呼ぶ薄いラッパ。
|
|
47
|
+
*/
|
|
48
|
+
function validateEachUsage(arrowFn, eachContext, sourceFile) {
|
|
49
|
+
if (eachContext === null)
|
|
50
|
+
return [];
|
|
51
|
+
return (0, each_state_rewriter_1.validateEachScopeUsage)(arrowFn, eachContext, sourceFile);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* sub-helper 3: stateIdMap を構築し、unresolved Symbol を DT011 診断に変換する。
|
|
55
|
+
* `eachParamSymbols` は `buildStateIdMap` の `eachScopeParamSymbols` オプションへ渡され、
|
|
56
|
+
* each scope param と一致する Symbol は unresolved に積まれない (既存挙動)。
|
|
57
|
+
*/
|
|
58
|
+
function composeStateIdMapForEachScope(arrowFn, base, eachParamSymbols) {
|
|
59
|
+
// buildStateIdMap は Set<ts.Symbol> を期待する。ReadonlySet を Set に widen する。
|
|
60
|
+
const resolution = (0, state_id_resolver_1.buildStateIdMap)(arrowFn, base.checker, {
|
|
61
|
+
fallback: base.fallback,
|
|
62
|
+
eachScopeParamSymbols: eachParamSymbols,
|
|
63
|
+
});
|
|
64
|
+
const diagnostics = [];
|
|
65
|
+
for (const [, identNode] of resolution.unresolved) {
|
|
66
|
+
const identifierName = identNode.text;
|
|
67
|
+
diagnostics.push((0, diagnostic_reporter_1.createDiagnostic)('DT011', identNode, base.sourceFile, {
|
|
68
|
+
identifierName,
|
|
69
|
+
fixExample: `root.state<"${identifierName}-id">(...)`,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
return { stateIdMap: resolution.stateIdMap, diagnostics };
|
|
73
|
+
}
|
|
74
|
+
// ---- Phase 4b delegate ------------------------------------------------------
|
|
75
|
+
/**
|
|
76
|
+
* Phase 4b per-call delegate: validation エラーなしの場合の each-scope 分岐を実行する。
|
|
77
|
+
*
|
|
78
|
+
* 3 個の private sub-helper を順次呼んで `EachScopeOutcome` を組み立てる薄い
|
|
79
|
+
* オーケストレーター (本体 ≤ 15 行)。
|
|
80
|
+
*
|
|
81
|
+
* @param base - per-invocation base context (checker / sourceFile / fallback など)
|
|
82
|
+
* @param callInfo - 対象 .on() 呼出情報
|
|
83
|
+
* @param preCheck - Phase 1 outcome (helperPathUsed / inherited each-scope を含む)
|
|
84
|
+
*/
|
|
85
|
+
function runEachScopeBranch(base, callInfo, preCheck) {
|
|
86
|
+
const { eachContext, eachParamSymbols } = resolveEachScopeForCall(base, callInfo, preCheck);
|
|
87
|
+
const eachUsageDiags = validateEachUsage(callInfo.handlerArg, eachContext, base.sourceFile);
|
|
88
|
+
const { stateIdMap, diagnostics: dt011Diags } = composeStateIdMapForEachScope(callInfo.handlerArg, base, eachParamSymbols);
|
|
89
|
+
return {
|
|
90
|
+
stateIdMap,
|
|
91
|
+
eachScopeParams: eachContext === null ? undefined : (0, each_state_rewriter_1.buildEachParamNameMap)(eachContext),
|
|
92
|
+
diagnostics: [...eachUsageDiags, ...dt011Diags],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=each-scope-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-scope-branch.js","sourceRoot":"","sources":["../../src/transformer/each-scope-branch.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AA6GH,gDAiBC;AA1HD,+DAAyD;AACzD,+DAM+B;AAM/B,2DAAsD;AAEtD,gFAAgF;AAEhF;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAC9B,IAA4B,EAC5B,QAAoB,EACpB,QAAyB;IAKzB,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,oBAAoB;YAC1C,gBAAgB,EAAE,QAAQ,CAAC,yBAAyB;SACrD,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,IAAA,4CAAsB,EAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,WAAW,GACf,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,gBAAgB,GACpB,WAAW,KAAK,IAAI;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAA,kDAA4B,EAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,OAAyB,EACzB,WAAoC,EACpC,UAAyB;IAEzB,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,IAAA,4CAAsB,EAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,SAAS,6BAA6B,CACpC,OAAyB,EACzB,IAA4B,EAC5B,gBAAoD;IAKpD,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAA,mCAAe,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,qBAAqB,EAAE,gBAA8C;KACtE,CAAC,CAAC;IACH,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC;QACtC,WAAW,CAAC,IAAI,CACd,IAAA,sCAAgB,EAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;YACpD,cAAc;YACd,UAAU,EAAE,eAAe,cAAc,YAAY;SACtD,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,SAAgB,kBAAkB,CAChC,IAA4B,EAC5B,QAAoB,EACpB,QAAyB;IAEzB,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5F,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5F,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,6BAA6B,CAC3E,QAAQ,CAAC,UAAU,EACnB,IAAI,EACJ,gBAAgB,CACjB,CAAC;IACF,OAAO;QACL,UAAU;QACV,eAAe,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,2CAAqB,EAAC,WAAW,CAAC;QACtF,WAAW,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,UAAU,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* each-state-rewriter — `.each()` コールバック内のステート識別子検出・マップ構築・診断
|
|
3
|
+
*
|
|
4
|
+
* Task 1.1:
|
|
5
|
+
* - `.on()` CallExpression の AST 祖先を辿り、直近の ArrowFunction 親が
|
|
6
|
+
* `.each(fn)` の引数かどうかを判定する
|
|
7
|
+
* - `EachScopeContext { itemParamName, factoryParamName }` 型を定義して export
|
|
8
|
+
* - each スコープ外では `null` を返す
|
|
9
|
+
* - `factoryParamName` は常に `"itemId"` で固定(`buildFactoryCode` シグネチャと整合)
|
|
10
|
+
*
|
|
11
|
+
* 対応 requirements: 1.1, 1.2, 5
|
|
12
|
+
*/
|
|
13
|
+
import * as ts from 'typescript';
|
|
14
|
+
/**
|
|
15
|
+
* `.each()` コールバック内でのスコープ検出結果。
|
|
16
|
+
* `detectEachScopeContext` が each スコープを検出した場合に返す。
|
|
17
|
+
*/
|
|
18
|
+
export interface EachScopeContext {
|
|
19
|
+
/** `.each()` コールバックの item パラメータ名(例: "item") */
|
|
20
|
+
readonly itemParamName: string;
|
|
21
|
+
/** `buildFactoryCode` が生成する factory 関数の第1パラメータ名(常に "itemId") */
|
|
22
|
+
readonly factoryParamName: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* `detectEachScopeContext` の戻り値型 (3-state, TXDX-DX Task 2.1).
|
|
26
|
+
*
|
|
27
|
+
* - `EachScopeContext`: each スコープを (直接 or helper 経由で) 一意に特定できた。
|
|
28
|
+
* - `null`: each スコープ外であることが確定した。
|
|
29
|
+
* - `'ambiguous'`: helper-aware 経路で call-site が `.each` 内外混在、または
|
|
30
|
+
* 異なる `itemParamName` を持つため一意に判定できない。
|
|
31
|
+
* `'ambiguous'` は helper-aware 経路 (`options.helperCallSites` 指定時) でのみ
|
|
32
|
+
* 発生し、直接 AST walk-up 経路では決して返されない。
|
|
33
|
+
*/
|
|
34
|
+
export type EachScopeDetectionResult = EachScopeContext | null | 'ambiguous';
|
|
35
|
+
/**
|
|
36
|
+
* `.on()` CallExpression が `.each()` コールバック内にあるかを検出する。
|
|
37
|
+
*
|
|
38
|
+
* AST を `node.parent` を使って上位に辿り、最初に見つかった ArrowFunction 祖先が
|
|
39
|
+
* `.each(fn)` の引数であるかを判定する。ネスト each は Non-Goals のため、
|
|
40
|
+
* 最初の ArrowFunction 祖先のみを対象とする。
|
|
41
|
+
*
|
|
42
|
+
* Helper-aware walk-up (TXDX-2 / TXDX-DX Task 2.1):
|
|
43
|
+
* `options.helperCallSites` が指定された場合、通常 walk-up が `null` を返す
|
|
44
|
+
* ケース(helper の body 内に `.on` があり helper 自身の直近 ArrowFunction 祖先が
|
|
45
|
+
* `.each` でない場合)に、各 call-site から再帰的に detectEachScopeContext を
|
|
46
|
+
* 実行する。判定結果は 3-state:
|
|
47
|
+
* - すべての call-site が同一 `EachScopeContext` → その context を継承
|
|
48
|
+
* - すべての call-site が `null` (each 外) → `null`
|
|
49
|
+
* - context と null の混在 / 異 itemParamName → `'ambiguous'`
|
|
50
|
+
* `'ambiguous'` は helper-aware 経路でのみ発生し、直接 AST walk-up 経路は
|
|
51
|
+
* 従来通り `EachScopeContext | null` のみを返す。
|
|
52
|
+
*
|
|
53
|
+
* @param onCallExpr `.on(event, arrow)` の CallExpression ノード
|
|
54
|
+
* @param checker TypeChecker(将来の型ベース拡張用、現在は AST 走査のみ使用)
|
|
55
|
+
* @param options 任意オプション。`helperCallSites` を指定すると helper 経由の
|
|
56
|
+
* walk-up を 1 段だけ継続する。再帰呼び出し時は省略する。
|
|
57
|
+
* @returns EachScopeDetectionResult (3-state: context | null | 'ambiguous')
|
|
58
|
+
*/
|
|
59
|
+
export declare function detectEachScopeContext(onCallExpr: ts.CallExpression, checker: ts.TypeChecker, options?: {
|
|
60
|
+
readonly helperCallSites?: readonly ts.CallExpression[];
|
|
61
|
+
}): EachScopeDetectionResult;
|
|
62
|
+
/**
|
|
63
|
+
* EachScopeContext から「識別子名 → factory パラメータ名」マップを構築する。
|
|
64
|
+
*
|
|
65
|
+
* 例: EachScopeContext { itemParamName: "item", factoryParamName: "itemId" }
|
|
66
|
+
* → Map { "item" -> "itemId" }
|
|
67
|
+
*
|
|
68
|
+
* @param context `detectEachScopeContext` が返した EachScopeContext
|
|
69
|
+
* @returns 識別子名 → factory パラメータ名のマップ
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildEachParamNameMap(context: EachScopeContext): Map<string, string>;
|
|
72
|
+
/**
|
|
73
|
+
* each スコープハンドラ内の識別子使用パターンを検査し、
|
|
74
|
+
* サポート外パターンに対して DT003 診断を返す。
|
|
75
|
+
*
|
|
76
|
+
* サポート対象: each スコープ識別子が PropertyAccessExpression の左辺(object)として使用
|
|
77
|
+
* 例: `item.get()`, `item.set(v)`, `item.done`
|
|
78
|
+
*
|
|
79
|
+
* サポート外: PropertyAccessExpression の左辺以外で使用
|
|
80
|
+
* 例: `doSomething(item)`, `const x = item`, `return item`
|
|
81
|
+
*
|
|
82
|
+
* @param arrowFn ハンドラの ArrowFunction ノード(`.on()` の第 2 引数)
|
|
83
|
+
* @param context `detectEachScopeContext` が返した EachScopeContext
|
|
84
|
+
* @param sourceFile ソースファイル(診断生成に使用)
|
|
85
|
+
* @returns DT003 診断の配列(サポート対象のみの場合は空配列)
|
|
86
|
+
*/
|
|
87
|
+
export declare function validateEachScopeUsage(arrowFn: ts.ArrowFunction, context: EachScopeContext, sourceFile: ts.SourceFile): ts.Diagnostic[];
|
|
88
|
+
/**
|
|
89
|
+
* `.on()` CallExpression を起点に祖先方向に走査し、最も内側の `.each(fn)`
|
|
90
|
+
* コールバックアロー関数を検出して、そのパラメータ Identifier の Symbol 集合を返す。
|
|
91
|
+
*
|
|
92
|
+
* `detectEachScopeContext` と同じ祖先走査ロジックを用いるが、こちらはパラメータの
|
|
93
|
+
* Symbol を `buildStateIdMap` の `eachScopeParamSymbols` に注入するために必要となる
|
|
94
|
+
* Symbol 集合を返す。
|
|
95
|
+
*
|
|
96
|
+
* Helper-aware (TXDX-DX Task 3.1):
|
|
97
|
+
* `options.helperCallSites` が指定された場合、直接 enclosing `.each` が見つからない
|
|
98
|
+
* ときに各 call-site で `detectEachScopeContext` を評価し、全 call-site が一意の
|
|
99
|
+
* `EachScopeContext` を共有する場合のみ、call-site の `.each(itemParam => ...)` の
|
|
100
|
+
* itemParam Symbol および helper body 内の同名 Identifier の Symbol を集合に加える。
|
|
101
|
+
* 混在 (`'ambiguous'`) や全 call-site が each 外の場合は helper-aware 経路では
|
|
102
|
+
* 何も追加せず `undefined` を返す (これらは呼び出し側 `tryEnclosingHelperRecovery`
|
|
103
|
+
* で既に handle されている前提)。
|
|
104
|
+
*
|
|
105
|
+
* @returns each スコープ外、もしくは Symbol 取得不可の場合は `undefined`
|
|
106
|
+
*/
|
|
107
|
+
export declare function collectEachScopeParamSymbols(onCallExpr: ts.CallExpression, checker: ts.TypeChecker, options?: {
|
|
108
|
+
readonly helperCallSites?: readonly ts.CallExpression[];
|
|
109
|
+
}): Set<ts.Symbol> | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* テスト専用エクスポート (TXDX-DX Task 3.1).
|
|
112
|
+
*
|
|
113
|
+
* `collectEachScopeParamSymbols` の単体テスト用に `__test__` プレフィックス付きで
|
|
114
|
+
* 参照可能にする。relocated from index.ts (transformer-index-pipeline-split task 2.1).
|
|
115
|
+
*/
|
|
116
|
+
export declare const __test__collectEachScopeParamSymbols: typeof collectEachScopeParamSymbols;
|
|
117
|
+
//# sourceMappingURL=each-state-rewriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-state-rewriter.d.ts","sourceRoot":"","sources":["../../src/transformer/each-state-rewriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAuBjC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG,IAAI,GAAG,WAAW,CAAC;AAqD7E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,CAAA;CAAE,GACpE,wBAAwB,CAoE1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,GACxB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAErB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,EAAE,CAAC,aAAa,EACzB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,EAAE,CAAC,UAAU,EAAE,CAsCjB;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,EAAE,CAAC,cAAc,EAC7B,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,CAAA;CAAE,GACpE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAyH5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,qCAA+B,CAAC"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* each-state-rewriter — `.each()` コールバック内のステート識別子検出・マップ構築・診断
|
|
4
|
+
*
|
|
5
|
+
* Task 1.1:
|
|
6
|
+
* - `.on()` CallExpression の AST 祖先を辿り、直近の ArrowFunction 親が
|
|
7
|
+
* `.each(fn)` の引数かどうかを判定する
|
|
8
|
+
* - `EachScopeContext { itemParamName, factoryParamName }` 型を定義して export
|
|
9
|
+
* - each スコープ外では `null` を返す
|
|
10
|
+
* - `factoryParamName` は常に `"itemId"` で固定(`buildFactoryCode` シグネチャと整合)
|
|
11
|
+
*
|
|
12
|
+
* 対応 requirements: 1.1, 1.2, 5
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.__test__collectEachScopeParamSymbols = void 0;
|
|
49
|
+
exports.detectEachScopeContext = detectEachScopeContext;
|
|
50
|
+
exports.buildEachParamNameMap = buildEachParamNameMap;
|
|
51
|
+
exports.validateEachScopeUsage = validateEachScopeUsage;
|
|
52
|
+
exports.collectEachScopeParamSymbols = collectEachScopeParamSymbols;
|
|
53
|
+
const ts = __importStar(require("typescript"));
|
|
54
|
+
// ---- 定数 -------------------------------------------------------------------
|
|
55
|
+
/**
|
|
56
|
+
* `.each()` を判定するメソッド名。
|
|
57
|
+
* whitelist-validator.ts の NESTED_CALLBACK_METHODS と整合させる。
|
|
58
|
+
*/
|
|
59
|
+
const EACH_METHOD_NAME = 'each';
|
|
60
|
+
/**
|
|
61
|
+
* `buildFactoryCode` が生成する factory 関数の第 1 パラメータ名。
|
|
62
|
+
* `function(itemId, idx, draftole)` シグネチャと整合する固定値。
|
|
63
|
+
*/
|
|
64
|
+
const FACTORY_PARAM_NAME = 'itemId';
|
|
65
|
+
/**
|
|
66
|
+
* DT003 診断コード: each スコープ識別子のサポート外使用パターン
|
|
67
|
+
*/
|
|
68
|
+
const DT003_CODE = 9003;
|
|
69
|
+
// ---- ヘルパー ----------------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* ノードが `.each(fn)` CallExpression の直接引数である ArrowFunction かを判定する。
|
|
72
|
+
*
|
|
73
|
+
* 判定条件:
|
|
74
|
+
* 1. `node` が ArrowFunction
|
|
75
|
+
* 2. `node.parent` が CallExpression
|
|
76
|
+
* 3. その CallExpression の expression が PropertyAccessExpression
|
|
77
|
+
* 4. プロパティ名が "each"
|
|
78
|
+
* 5. `node` がその CallExpression の第 1 引数
|
|
79
|
+
*/
|
|
80
|
+
function isEachCallbackArrow(node) {
|
|
81
|
+
if (!ts.isArrowFunction(node))
|
|
82
|
+
return false;
|
|
83
|
+
const parent = node.parent;
|
|
84
|
+
if (!ts.isCallExpression(parent))
|
|
85
|
+
return false;
|
|
86
|
+
const expr = parent.expression;
|
|
87
|
+
if (!ts.isPropertyAccessExpression(expr))
|
|
88
|
+
return false;
|
|
89
|
+
if (expr.name.text !== EACH_METHOD_NAME)
|
|
90
|
+
return false;
|
|
91
|
+
// `node` が第 1 引数(インデックス 0)であること
|
|
92
|
+
return parent.arguments.length >= 1 && parent.arguments[0] === node;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* ソースファイルの診断情報を作成するヘルパー
|
|
96
|
+
*/
|
|
97
|
+
function createDiagnostic(node, messageText, code) {
|
|
98
|
+
const sourceFile = node.getSourceFile();
|
|
99
|
+
const start = node.getStart(sourceFile, false);
|
|
100
|
+
const length = node.getWidth(sourceFile);
|
|
101
|
+
return {
|
|
102
|
+
file: sourceFile,
|
|
103
|
+
start,
|
|
104
|
+
length,
|
|
105
|
+
messageText,
|
|
106
|
+
category: ts.DiagnosticCategory.Error,
|
|
107
|
+
code,
|
|
108
|
+
source: 'draftole-transformer',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// ---- 公開 API ----------------------------------------------------------------
|
|
112
|
+
/**
|
|
113
|
+
* `.on()` CallExpression が `.each()` コールバック内にあるかを検出する。
|
|
114
|
+
*
|
|
115
|
+
* AST を `node.parent` を使って上位に辿り、最初に見つかった ArrowFunction 祖先が
|
|
116
|
+
* `.each(fn)` の引数であるかを判定する。ネスト each は Non-Goals のため、
|
|
117
|
+
* 最初の ArrowFunction 祖先のみを対象とする。
|
|
118
|
+
*
|
|
119
|
+
* Helper-aware walk-up (TXDX-2 / TXDX-DX Task 2.1):
|
|
120
|
+
* `options.helperCallSites` が指定された場合、通常 walk-up が `null` を返す
|
|
121
|
+
* ケース(helper の body 内に `.on` があり helper 自身の直近 ArrowFunction 祖先が
|
|
122
|
+
* `.each` でない場合)に、各 call-site から再帰的に detectEachScopeContext を
|
|
123
|
+
* 実行する。判定結果は 3-state:
|
|
124
|
+
* - すべての call-site が同一 `EachScopeContext` → その context を継承
|
|
125
|
+
* - すべての call-site が `null` (each 外) → `null`
|
|
126
|
+
* - context と null の混在 / 異 itemParamName → `'ambiguous'`
|
|
127
|
+
* `'ambiguous'` は helper-aware 経路でのみ発生し、直接 AST walk-up 経路は
|
|
128
|
+
* 従来通り `EachScopeContext | null` のみを返す。
|
|
129
|
+
*
|
|
130
|
+
* @param onCallExpr `.on(event, arrow)` の CallExpression ノード
|
|
131
|
+
* @param checker TypeChecker(将来の型ベース拡張用、現在は AST 走査のみ使用)
|
|
132
|
+
* @param options 任意オプション。`helperCallSites` を指定すると helper 経由の
|
|
133
|
+
* walk-up を 1 段だけ継続する。再帰呼び出し時は省略する。
|
|
134
|
+
* @returns EachScopeDetectionResult (3-state: context | null | 'ambiguous')
|
|
135
|
+
*/
|
|
136
|
+
function detectEachScopeContext(onCallExpr, checker, options) {
|
|
137
|
+
// `checker` パラメータは将来の型ベース拡張用(現時点では AST 走査のみ)
|
|
138
|
+
void checker;
|
|
139
|
+
// 1. 通常の AST 親方向 walk-up
|
|
140
|
+
let current = onCallExpr;
|
|
141
|
+
while (current.parent !== undefined) {
|
|
142
|
+
current = current.parent;
|
|
143
|
+
if (ts.isArrowFunction(current)) {
|
|
144
|
+
// 直近の ArrowFunction 祖先に到達
|
|
145
|
+
if (isEachCallbackArrow(current)) {
|
|
146
|
+
// `.each((item) => ...)` の ArrowFunction: item パラメータ名を取得
|
|
147
|
+
const firstParam = current.parameters[0];
|
|
148
|
+
const itemParamName = firstParam !== undefined && ts.isParameter(firstParam) && ts.isIdentifier(firstParam.name)
|
|
149
|
+
? firstParam.name.text
|
|
150
|
+
: 'item';
|
|
151
|
+
return {
|
|
152
|
+
itemParamName,
|
|
153
|
+
factoryParamName: FACTORY_PARAM_NAME,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// each 以外の ArrowFunction が先に見つかった → 通常 walk-up は each スコープ外
|
|
158
|
+
// helper-aware ルートに委ねるため break
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 2. helper-aware walk-up (1 段限定; 再帰時は helperCallSites を渡さない)
|
|
164
|
+
const helperCallSites = options === null || options === void 0 ? void 0 : options.helperCallSites;
|
|
165
|
+
if (helperCallSites === undefined || helperCallSites.length === 0) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
let inheritedContext = null;
|
|
169
|
+
let sawNull = false;
|
|
170
|
+
let sawContext = false;
|
|
171
|
+
for (const callSite of helperCallSites) {
|
|
172
|
+
// 再帰時は options を渡さない(multi-level helper は Non-Goal)。
|
|
173
|
+
// 再帰側は helper-aware 経路を使わないため、戻り値は EachScopeContext | null に
|
|
174
|
+
// 限定される('ambiguous' は発生し得ない)。
|
|
175
|
+
const ctx = detectEachScopeContext(callSite, checker);
|
|
176
|
+
if (ctx === null) {
|
|
177
|
+
sawNull = true;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
// ctx === 'ambiguous' は再帰側では発生しないが、union narrowing のため明示。
|
|
181
|
+
if (ctx === 'ambiguous') {
|
|
182
|
+
return 'ambiguous';
|
|
183
|
+
}
|
|
184
|
+
sawContext = true;
|
|
185
|
+
if (inheritedContext === null) {
|
|
186
|
+
inheritedContext = ctx;
|
|
187
|
+
}
|
|
188
|
+
else if (inheritedContext.itemParamName !== ctx.itemParamName) {
|
|
189
|
+
// 異なる itemParamName → ambiguous
|
|
190
|
+
return 'ambiguous';
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// 混在 (一部 each 内 + 一部 each 外) → ambiguous
|
|
194
|
+
if (sawNull && sawContext)
|
|
195
|
+
return 'ambiguous';
|
|
196
|
+
// すべて null → each 外 (継承なし)
|
|
197
|
+
// すべて同一 context → inheritedContext を継承
|
|
198
|
+
return inheritedContext;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* EachScopeContext から「識別子名 → factory パラメータ名」マップを構築する。
|
|
202
|
+
*
|
|
203
|
+
* 例: EachScopeContext { itemParamName: "item", factoryParamName: "itemId" }
|
|
204
|
+
* → Map { "item" -> "itemId" }
|
|
205
|
+
*
|
|
206
|
+
* @param context `detectEachScopeContext` が返した EachScopeContext
|
|
207
|
+
* @returns 識別子名 → factory パラメータ名のマップ
|
|
208
|
+
*/
|
|
209
|
+
function buildEachParamNameMap(context) {
|
|
210
|
+
return new Map([[context.itemParamName, context.factoryParamName]]);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* each スコープハンドラ内の識別子使用パターンを検査し、
|
|
214
|
+
* サポート外パターンに対して DT003 診断を返す。
|
|
215
|
+
*
|
|
216
|
+
* サポート対象: each スコープ識別子が PropertyAccessExpression の左辺(object)として使用
|
|
217
|
+
* 例: `item.get()`, `item.set(v)`, `item.done`
|
|
218
|
+
*
|
|
219
|
+
* サポート外: PropertyAccessExpression の左辺以外で使用
|
|
220
|
+
* 例: `doSomething(item)`, `const x = item`, `return item`
|
|
221
|
+
*
|
|
222
|
+
* @param arrowFn ハンドラの ArrowFunction ノード(`.on()` の第 2 引数)
|
|
223
|
+
* @param context `detectEachScopeContext` が返した EachScopeContext
|
|
224
|
+
* @param sourceFile ソースファイル(診断生成に使用)
|
|
225
|
+
* @returns DT003 診断の配列(サポート対象のみの場合は空配列)
|
|
226
|
+
*/
|
|
227
|
+
function validateEachScopeUsage(arrowFn, context, sourceFile) {
|
|
228
|
+
void sourceFile; // ソースファイルは node.getSourceFile() から取得
|
|
229
|
+
const diagnostics = [];
|
|
230
|
+
const { itemParamName } = context;
|
|
231
|
+
function visit(node) {
|
|
232
|
+
if (ts.isIdentifier(node) && node.text === itemParamName) {
|
|
233
|
+
// PropertyAccessExpression の左辺(object)として使用されているか確認
|
|
234
|
+
const parent = node.parent;
|
|
235
|
+
if (ts.isPropertyAccessExpression(parent) &&
|
|
236
|
+
parent.expression === node) {
|
|
237
|
+
// サポート対象: `item.something` の形式
|
|
238
|
+
// このノード自体は OK、子ノードへの再帰はスキップ(自身が識別子のため子なし)
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
// サポート外パターン: PropertyAccess の左辺以外
|
|
243
|
+
diagnostics.push(createDiagnostic(node, `DraftOle DT003: each-scope identifier '${itemParamName}' is used in an unsupported pattern. ` +
|
|
244
|
+
`Only property access (e.g. '${itemParamName}.get()', '${itemParamName}.set(v)') is supported. ` +
|
|
245
|
+
`See docs/each-scope-handler.md`, DT003_CODE));
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
ts.forEachChild(node, visit);
|
|
250
|
+
}
|
|
251
|
+
visit(arrowFn.body);
|
|
252
|
+
return diagnostics;
|
|
253
|
+
}
|
|
254
|
+
// ---- each スコープ Symbol 集合 (relocated from index.ts) --------------------
|
|
255
|
+
/**
|
|
256
|
+
* `.on()` CallExpression を起点に祖先方向に走査し、最も内側の `.each(fn)`
|
|
257
|
+
* コールバックアロー関数を検出して、そのパラメータ Identifier の Symbol 集合を返す。
|
|
258
|
+
*
|
|
259
|
+
* `detectEachScopeContext` と同じ祖先走査ロジックを用いるが、こちらはパラメータの
|
|
260
|
+
* Symbol を `buildStateIdMap` の `eachScopeParamSymbols` に注入するために必要となる
|
|
261
|
+
* Symbol 集合を返す。
|
|
262
|
+
*
|
|
263
|
+
* Helper-aware (TXDX-DX Task 3.1):
|
|
264
|
+
* `options.helperCallSites` が指定された場合、直接 enclosing `.each` が見つからない
|
|
265
|
+
* ときに各 call-site で `detectEachScopeContext` を評価し、全 call-site が一意の
|
|
266
|
+
* `EachScopeContext` を共有する場合のみ、call-site の `.each(itemParam => ...)` の
|
|
267
|
+
* itemParam Symbol および helper body 内の同名 Identifier の Symbol を集合に加える。
|
|
268
|
+
* 混在 (`'ambiguous'`) や全 call-site が each 外の場合は helper-aware 経路では
|
|
269
|
+
* 何も追加せず `undefined` を返す (これらは呼び出し側 `tryEnclosingHelperRecovery`
|
|
270
|
+
* で既に handle されている前提)。
|
|
271
|
+
*
|
|
272
|
+
* @returns each スコープ外、もしくは Symbol 取得不可の場合は `undefined`
|
|
273
|
+
*/
|
|
274
|
+
function collectEachScopeParamSymbols(onCallExpr, checker, options) {
|
|
275
|
+
// 1. 直接 enclosing `.each` を AST walk-up で探す (従来挙動)
|
|
276
|
+
let current = onCallExpr;
|
|
277
|
+
while (current.parent !== undefined) {
|
|
278
|
+
current = current.parent;
|
|
279
|
+
if (ts.isArrowFunction(current)) {
|
|
280
|
+
const parent = current.parent;
|
|
281
|
+
if (ts.isCallExpression(parent) &&
|
|
282
|
+
ts.isPropertyAccessExpression(parent.expression) &&
|
|
283
|
+
parent.expression.name.text === 'each' &&
|
|
284
|
+
parent.arguments.length >= 1 &&
|
|
285
|
+
parent.arguments[0] === current) {
|
|
286
|
+
const symbols = new Set();
|
|
287
|
+
for (const param of current.parameters) {
|
|
288
|
+
if (ts.isIdentifier(param.name)) {
|
|
289
|
+
const sym = checker.getSymbolAtLocation(param.name);
|
|
290
|
+
if (sym !== undefined) {
|
|
291
|
+
symbols.add(sym);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return symbols;
|
|
296
|
+
}
|
|
297
|
+
// each 以外の ArrowFunction が先に見つかった → 直接経路では each スコープ外
|
|
298
|
+
// helper-aware 経路に委ねるため break
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// 2. helper-aware 経路
|
|
303
|
+
const helperCallSites = options === null || options === void 0 ? void 0 : options.helperCallSites;
|
|
304
|
+
if (helperCallSites === undefined || helperCallSites.length === 0) {
|
|
305
|
+
return undefined;
|
|
306
|
+
}
|
|
307
|
+
// 全 call-site で一意な EachScopeContext を共有することを確認する。
|
|
308
|
+
// 混在 / each 外 / ambiguous の場合は何も返さない。
|
|
309
|
+
let sharedItemParamName;
|
|
310
|
+
const callSiteEachArrows = [];
|
|
311
|
+
for (const callSite of helperCallSites) {
|
|
312
|
+
const ctx = detectEachScopeContext(callSite, checker);
|
|
313
|
+
if (ctx === null || ctx === 'ambiguous') {
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
if (sharedItemParamName === undefined) {
|
|
317
|
+
sharedItemParamName = ctx.itemParamName;
|
|
318
|
+
}
|
|
319
|
+
else if (sharedItemParamName !== ctx.itemParamName) {
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
// call-site の祖先方向に `.each(arrow)` の arrow を探す
|
|
323
|
+
let cur = callSite;
|
|
324
|
+
while (cur.parent !== undefined) {
|
|
325
|
+
cur = cur.parent;
|
|
326
|
+
if (ts.isArrowFunction(cur)) {
|
|
327
|
+
const par = cur.parent;
|
|
328
|
+
if (ts.isCallExpression(par) &&
|
|
329
|
+
ts.isPropertyAccessExpression(par.expression) &&
|
|
330
|
+
par.expression.name.text === 'each' &&
|
|
331
|
+
par.arguments.length >= 1 &&
|
|
332
|
+
par.arguments[0] === cur) {
|
|
333
|
+
callSiteEachArrows.push(cur);
|
|
334
|
+
}
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (sharedItemParamName === undefined || callSiteEachArrows.length === 0) {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
const symbols = new Set();
|
|
343
|
+
// (a) 各 call-site の `.each` arrow の itemParam Symbol を追加
|
|
344
|
+
for (const arrow of callSiteEachArrows) {
|
|
345
|
+
for (const param of arrow.parameters) {
|
|
346
|
+
if (ts.isIdentifier(param.name)) {
|
|
347
|
+
const sym = checker.getSymbolAtLocation(param.name);
|
|
348
|
+
if (sym !== undefined) {
|
|
349
|
+
symbols.add(sym);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// (b) helper body 内の同名 Identifier の Symbol を追加
|
|
355
|
+
// onCallExpr を内包する helper の本体 (= 最上位の ArrowFunction 祖先) を探し、
|
|
356
|
+
// その body 配下で `ts.isIdentifier && text === sharedItemParamName` の
|
|
357
|
+
// Symbol を集める。
|
|
358
|
+
let helperBodyRoot;
|
|
359
|
+
let cur2 = onCallExpr;
|
|
360
|
+
while (cur2.parent !== undefined) {
|
|
361
|
+
cur2 = cur2.parent;
|
|
362
|
+
if (ts.isArrowFunction(cur2)) {
|
|
363
|
+
helperBodyRoot = cur2.body;
|
|
364
|
+
// 最も外側 (= module-level helper の arrow body) まで遡らず、最も内側で十分:
|
|
365
|
+
// helper body 全域を walk するため、まず最初に見つけた ArrowFunction の親方向に
|
|
366
|
+
// 更に ArrowFunction があれば、そちらを優先する。
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (helperBodyRoot !== undefined) {
|
|
370
|
+
const visit = (n) => {
|
|
371
|
+
if (ts.isIdentifier(n) && n.text === sharedItemParamName) {
|
|
372
|
+
const sym = checker.getSymbolAtLocation(n);
|
|
373
|
+
if (sym !== undefined) {
|
|
374
|
+
symbols.add(sym);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
ts.forEachChild(n, visit);
|
|
378
|
+
};
|
|
379
|
+
visit(helperBodyRoot);
|
|
380
|
+
}
|
|
381
|
+
if (symbols.size === 0) {
|
|
382
|
+
return undefined;
|
|
383
|
+
}
|
|
384
|
+
return symbols;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* テスト専用エクスポート (TXDX-DX Task 3.1).
|
|
388
|
+
*
|
|
389
|
+
* `collectEachScopeParamSymbols` の単体テスト用に `__test__` プレフィックス付きで
|
|
390
|
+
* 参照可能にする。relocated from index.ts (transformer-index-pipeline-split task 2.1).
|
|
391
|
+
*/
|
|
392
|
+
exports.__test__collectEachScopeParamSymbols = collectEachScopeParamSymbols;
|
|
393
|
+
//# sourceMappingURL=each-state-rewriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"each-state-rewriter.js","sourceRoot":"","sources":["../../src/transformer/each-state-rewriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* draftole-transformer 由来の TypeScript Diagnostic を 1 件 1 行のフラット形式に整形する。
|
|
3
|
+
*
|
|
4
|
+
* 形式:
|
|
5
|
+
* - file + start 有り: `[draftole-transformer <Category>] <fileName>:<line>:<col> <message>\n`
|
|
6
|
+
* - それ以外 : `[draftole-transformer <Category>] <message>\n`
|
|
7
|
+
*
|
|
8
|
+
* 行・列は 1-origin、message は `DiagnosticMessageChain` の場合 top-level のみ採用する。
|
|
9
|
+
*
|
|
10
|
+
* 本モジュールは副作用を持たず、文字列の整形のみを行う純関数群。
|
|
11
|
+
* 書き出し先(stderr / 集約配列等)の選択は呼び出し側の責務。
|
|
12
|
+
*
|
|
13
|
+
* Requirements: TXDX-1(transformer 診断の silent drop 解消)
|
|
14
|
+
*
|
|
15
|
+
* @module transformer/format-diagnostics
|
|
16
|
+
*/
|
|
17
|
+
import ts from 'typescript';
|
|
18
|
+
/**
|
|
19
|
+
* 単一の Diagnostic を 1 行のテキストに整形する(改行を含む)。
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatTransformerDiagnostic(diag: ts.Diagnostic): string;
|
|
22
|
+
/**
|
|
23
|
+
* Diagnostic 配列を整形して与えられた `WritableStream` に書き出す。
|
|
24
|
+
* 空配列の場合は何もしない。
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeTransformerDiagnostics(diags: readonly ts.Diagnostic[], stream: NodeJS.WritableStream): void;
|
|
27
|
+
//# sourceMappingURL=format-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-diagnostics.d.ts","sourceRoot":"","sources":["../../src/transformer/format-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,MAAM,CAWvE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,EAC/B,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,IAAI,CAKN"}
|