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,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* helper-context-resolver — `.on(arrow)` を内包する helper の発見・eligibility 判定・call-site 列挙
|
|
4
|
+
*
|
|
5
|
+
* 仕様: `.kiro/specs/helper-inline-recovery/`
|
|
6
|
+
* - design.md §Components and Interfaces / helper-context-resolver.ts
|
|
7
|
+
* - requirements.md 1.1, 1.4, 2.3, 3.1, 3.2, 3.3
|
|
8
|
+
*
|
|
9
|
+
* 単一責任:
|
|
10
|
+
* 1. `.on` CallExpression の AST 上方向 walk-up で直近 helper 宣言を発見
|
|
11
|
+
* 2. helper の eligibility(module-level / const / zero-param / arrow initializer)を判定
|
|
12
|
+
* 3. accepted helper の call-site を同一 SourceFile から列挙
|
|
13
|
+
* 4. rejected helper から DT014 診断を生成
|
|
14
|
+
*
|
|
15
|
+
* 副作用なしの純粋関数のみ。`fileDiagnostics` への push は呼び出し側(index.ts)の責務。
|
|
16
|
+
*
|
|
17
|
+
* Task 1.1: 型定義と内部 helper(symbol 解決・宣言形状判定)のみを実装する。
|
|
18
|
+
* findEnclosingHelper / findHelperCallSites / buildEnclosingHelperDiagnostic は
|
|
19
|
+
* それぞれ task 1.2 / 1.3 / 1.4 で追加する。
|
|
20
|
+
*/
|
|
21
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
24
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
25
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(o, k2, desc);
|
|
28
|
+
}) : (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
o[k2] = m[k];
|
|
31
|
+
}));
|
|
32
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
33
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
34
|
+
}) : function(o, v) {
|
|
35
|
+
o["default"] = v;
|
|
36
|
+
});
|
|
37
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
38
|
+
var ownKeys = function(o) {
|
|
39
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
40
|
+
var ar = [];
|
|
41
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
42
|
+
return ar;
|
|
43
|
+
};
|
|
44
|
+
return ownKeys(o);
|
|
45
|
+
};
|
|
46
|
+
return function (mod) {
|
|
47
|
+
if (mod && mod.__esModule) return mod;
|
|
48
|
+
var result = {};
|
|
49
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
50
|
+
__setModuleDefault(result, mod);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
})();
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.DT014_CODE = void 0;
|
|
56
|
+
exports.buildEnclosingHelperDiagnostic = buildEnclosingHelperDiagnostic;
|
|
57
|
+
exports.findHelperCallSites = findHelperCallSites;
|
|
58
|
+
exports.findEnclosingHelper = findEnclosingHelper;
|
|
59
|
+
exports.tryEnclosingHelperRecovery = tryEnclosingHelperRecovery;
|
|
60
|
+
exports.runHelperAwarePreCheck = runHelperAwarePreCheck;
|
|
61
|
+
const ts = __importStar(require("typescript"));
|
|
62
|
+
const each_state_rewriter_1 = require("./each-state-rewriter");
|
|
63
|
+
const helper_decl_utils_1 = require("./helper-decl-utils");
|
|
64
|
+
// ---- 内部 helper: symbol 解決 ------------------------------------------------
|
|
65
|
+
// resolveValueDeclaration / isModuleLevelVariableDeclaration / isConstDeclaration は
|
|
66
|
+
// `./helper-decl-utils` に移管。本ファイルでは import して使用する。
|
|
67
|
+
// ---- 公開 API: buildEnclosingHelperDiagnostic -------------------------------
|
|
68
|
+
/** DT014 診断コード: enclosing-helper recovery 不可能な helper 形状。`hasFileError` 集計除外用に index.ts へも export する。 */
|
|
69
|
+
exports.DT014_CODE = 9014;
|
|
70
|
+
/** reason.code を人読み形に整形する。 */
|
|
71
|
+
function describeRejectionReason(reason) {
|
|
72
|
+
switch (reason.code) {
|
|
73
|
+
case 'not-module-level':
|
|
74
|
+
return 'not-module-level: helper is not declared at module top-level';
|
|
75
|
+
case 'mutable-binding':
|
|
76
|
+
return 'mutable-binding: helper is declared with let (mutable binding)';
|
|
77
|
+
case 'function-declaration':
|
|
78
|
+
return 'function-declaration: helper is a function declaration, not a const arrow';
|
|
79
|
+
case 'non-arrow-initializer':
|
|
80
|
+
return 'non-arrow-initializer: helper initializer is not an arrow function';
|
|
81
|
+
case 'has-parameters':
|
|
82
|
+
return `has-parameters: helper takes ${reason.paramCount} parameter(s)`;
|
|
83
|
+
case 'no-call-sites':
|
|
84
|
+
return 'no-call-sites: helper is never called in this file';
|
|
85
|
+
case 'ambiguous-call-sites':
|
|
86
|
+
return `ambiguous-call-sites: helper has ${reason.callSiteCount} call site(s) with inconsistent each-scope context`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* `RejectedEnclosingHelper` から DT014 診断を生成する。
|
|
91
|
+
*
|
|
92
|
+
* - `code`: 9014(`__brand: 'DT014'`)
|
|
93
|
+
* - `source`: `'draftole-transformer'`
|
|
94
|
+
* - `relatedInformation`: reason code + helper 宣言位置 1 件
|
|
95
|
+
*
|
|
96
|
+
* 診断アンカーはトリガとなった `.on` CallExpression。helper 宣言位置は
|
|
97
|
+
* `relatedInformation` 経由でユーザに提示する。
|
|
98
|
+
*
|
|
99
|
+
* @param rejection findEnclosingHelper の rejection
|
|
100
|
+
* @param sourceFile 該当 SourceFile
|
|
101
|
+
* @param category `ts.DiagnosticCategory.Error | Warning | Suggestion`
|
|
102
|
+
* @returns DT014 診断
|
|
103
|
+
*/
|
|
104
|
+
function buildEnclosingHelperDiagnostic(rejection, sourceFile, category) {
|
|
105
|
+
const reasonText = describeRejectionReason(rejection.reason);
|
|
106
|
+
const anchor = rejection.onCallExpr;
|
|
107
|
+
const start = anchor.getStart(sourceFile);
|
|
108
|
+
const length = anchor.getWidth(sourceFile);
|
|
109
|
+
const messageText = `DraftOle DT014: enclosing helper '${rejection.name}' is not eligible for inline-recovery ` +
|
|
110
|
+
`(${reasonText}). ` +
|
|
111
|
+
`Supported shape: zero-parameter module-level const arrow function with a consistent each-scope context across all call sites. ` +
|
|
112
|
+
'Suggested fix: inline the `.on(...)` at its call site, or refactor the helper to a zero-param module-level const arrow.';
|
|
113
|
+
const declNode = rejection.declaration;
|
|
114
|
+
const declStart = declNode.getStart(sourceFile);
|
|
115
|
+
const declLength = declNode.getWidth(sourceFile);
|
|
116
|
+
return {
|
|
117
|
+
file: sourceFile,
|
|
118
|
+
start,
|
|
119
|
+
length,
|
|
120
|
+
messageText,
|
|
121
|
+
category,
|
|
122
|
+
code: exports.DT014_CODE,
|
|
123
|
+
source: 'draftole-transformer',
|
|
124
|
+
relatedInformation: [
|
|
125
|
+
{
|
|
126
|
+
file: sourceFile,
|
|
127
|
+
start: declStart,
|
|
128
|
+
length: declLength,
|
|
129
|
+
messageText: `helper declaration (reason: ${rejection.reason.code})`,
|
|
130
|
+
category: ts.DiagnosticCategory.Message,
|
|
131
|
+
code: exports.DT014_CODE,
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// ---- 公開 API: findHelperCallSites ------------------------------------------
|
|
137
|
+
/**
|
|
138
|
+
* 同一 SourceFile 内で `helperDecl` を呼び出している CallExpression を列挙する。
|
|
139
|
+
*
|
|
140
|
+
* マッチ条件:
|
|
141
|
+
* - CallExpression の `expression` が Identifier
|
|
142
|
+
* - その Identifier から `resolveValueDeclaration` を辿った結果が `helperDecl` と同一
|
|
143
|
+
*
|
|
144
|
+
* helper 自身の body 内からの自己再帰呼び出しも CallExpression として列挙される
|
|
145
|
+
* (実用上は再帰 helper はそもそも task 1.2 で reject されるため問題にならない)。
|
|
146
|
+
*
|
|
147
|
+
* @param helperDecl helper の宣言(VariableDeclaration)
|
|
148
|
+
* @param sourceFile 探索対象 SourceFile
|
|
149
|
+
* @param checker TypeChecker(symbol 解決に使用)
|
|
150
|
+
* @returns call-site CallExpression の配列(出現順)
|
|
151
|
+
*/
|
|
152
|
+
function findHelperCallSites(helperDecl, sourceFile, checker) {
|
|
153
|
+
const sites = [];
|
|
154
|
+
function visit(node) {
|
|
155
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
156
|
+
const resolvedDecl = (0, helper_decl_utils_1.resolveValueDeclaration)(node.expression, checker);
|
|
157
|
+
if (resolvedDecl === helperDecl) {
|
|
158
|
+
sites.push(node);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
ts.forEachChild(node, visit);
|
|
162
|
+
}
|
|
163
|
+
visit(sourceFile);
|
|
164
|
+
return sites;
|
|
165
|
+
}
|
|
166
|
+
// ---- 公開 API: findEnclosingHelper ------------------------------------------
|
|
167
|
+
/**
|
|
168
|
+
* `.on(arrow)` CallExpression を内包する直近 helper を探索する。
|
|
169
|
+
*
|
|
170
|
+
* アルゴリズム:
|
|
171
|
+
* 1. `onCallExpr.parent` から SourceFile に達するまで AST 親方向に walk-up
|
|
172
|
+
* 2. 最初に出会う関数式(ArrowFunction / FunctionExpression)または FunctionDeclaration を
|
|
173
|
+
* enclosing function 候補とする
|
|
174
|
+
* 3. 候補が ArrowFunction かつ親が VariableDeclaration の場合のみ eligibility を判定
|
|
175
|
+
* 4. それ以外(callback として使われた arrow、function expression、function declaration 等)は
|
|
176
|
+
* reject または `none` を返す
|
|
177
|
+
*
|
|
178
|
+
* 注意:
|
|
179
|
+
* - `.on` の **handler 引数**(`.on("click", () => ...)` の第 2 引数)は走査しない
|
|
180
|
+
* (node.parent チェインは `.on` 自身を経由するため、handler 内へ降りない)
|
|
181
|
+
* - callSites の列挙は本関数では行わない(task 1.3 で `findHelperCallSites` 統合)
|
|
182
|
+
* - accepted の callSites は本実装段階では常に空配列。完全な統合は task 1.3 完了後。
|
|
183
|
+
*
|
|
184
|
+
* @param onCallExpr `.on(event, arrow)` の CallExpression
|
|
185
|
+
* @param sourceFile 解析対象 SourceFile
|
|
186
|
+
* @param checker TypeChecker(将来の型ベース拡張用、現時点では未使用)
|
|
187
|
+
* @returns 採否判定結果
|
|
188
|
+
*/
|
|
189
|
+
function findEnclosingHelper(onCallExpr, sourceFile, checker) {
|
|
190
|
+
var _a, _b;
|
|
191
|
+
void checker; // 将来の型解決用フック
|
|
192
|
+
let current = onCallExpr;
|
|
193
|
+
while (current.parent !== undefined && !ts.isSourceFile(current.parent)) {
|
|
194
|
+
current = current.parent;
|
|
195
|
+
// FunctionDeclaration: `function name() { ... }` 形式の helper
|
|
196
|
+
if (ts.isFunctionDeclaration(current)) {
|
|
197
|
+
const name = (_b = (_a = current.name) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : '<anonymous>';
|
|
198
|
+
return {
|
|
199
|
+
kind: 'rejected',
|
|
200
|
+
rejection: {
|
|
201
|
+
name,
|
|
202
|
+
declaration: current,
|
|
203
|
+
onCallExpr,
|
|
204
|
+
reason: { code: 'function-declaration' },
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// ArrowFunction / FunctionExpression: 関数式形式
|
|
209
|
+
if (ts.isArrowFunction(current) || ts.isFunctionExpression(current)) {
|
|
210
|
+
const parent = current.parent;
|
|
211
|
+
if (parent === undefined || !ts.isVariableDeclaration(parent)) {
|
|
212
|
+
// callback として渡された関数式(`.each(item => ...)` 等)→ 既存挙動に委ねる
|
|
213
|
+
return { kind: 'none' };
|
|
214
|
+
}
|
|
215
|
+
// VariableDeclaration の name から helper 名を取得
|
|
216
|
+
const name = ts.isIdentifier(parent.name) ? parent.name.text : '<anonymous>';
|
|
217
|
+
// 1. module-level 判定
|
|
218
|
+
if (!(0, helper_decl_utils_1.isModuleLevelVariableDeclaration)(parent, sourceFile)) {
|
|
219
|
+
return {
|
|
220
|
+
kind: 'rejected',
|
|
221
|
+
rejection: {
|
|
222
|
+
name,
|
|
223
|
+
declaration: parent,
|
|
224
|
+
onCallExpr,
|
|
225
|
+
reason: { code: 'not-module-level' },
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// 2. const 判定
|
|
230
|
+
if (!(0, helper_decl_utils_1.isConstDeclaration)(parent)) {
|
|
231
|
+
return {
|
|
232
|
+
kind: 'rejected',
|
|
233
|
+
rejection: {
|
|
234
|
+
name,
|
|
235
|
+
declaration: parent,
|
|
236
|
+
onCallExpr,
|
|
237
|
+
reason: { code: 'mutable-binding' },
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// 3. 関数式形式が ArrowFunction でなければ non-arrow-initializer
|
|
242
|
+
if (!ts.isArrowFunction(current)) {
|
|
243
|
+
return {
|
|
244
|
+
kind: 'rejected',
|
|
245
|
+
rejection: {
|
|
246
|
+
name,
|
|
247
|
+
declaration: parent,
|
|
248
|
+
onCallExpr,
|
|
249
|
+
reason: { code: 'non-arrow-initializer' },
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// 4. zero-param 判定
|
|
254
|
+
if (current.parameters.length > 0) {
|
|
255
|
+
return {
|
|
256
|
+
kind: 'rejected',
|
|
257
|
+
rejection: {
|
|
258
|
+
name,
|
|
259
|
+
declaration: parent,
|
|
260
|
+
onCallExpr,
|
|
261
|
+
reason: { code: 'has-parameters', paramCount: current.parameters.length },
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// すべての eligibility 判定をクリア → call-site 列挙
|
|
266
|
+
const callSites = findHelperCallSites(parent, sourceFile, checker);
|
|
267
|
+
if (callSites.length === 0) {
|
|
268
|
+
return {
|
|
269
|
+
kind: 'rejected',
|
|
270
|
+
rejection: {
|
|
271
|
+
name,
|
|
272
|
+
declaration: parent,
|
|
273
|
+
onCallExpr,
|
|
274
|
+
reason: { code: 'no-call-sites' },
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
kind: 'accepted',
|
|
280
|
+
helper: {
|
|
281
|
+
name,
|
|
282
|
+
declaration: parent,
|
|
283
|
+
arrow: current,
|
|
284
|
+
callSites,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// SourceFile に到達 → enclosing helper なし
|
|
290
|
+
return { kind: 'none' };
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* `.on(arrow)` を内包する helper を発見し、each scope 継承または DT014 発行を決定する。
|
|
294
|
+
*
|
|
295
|
+
* 分岐:
|
|
296
|
+
* - helper 不在 (`kind: 'none'`): `pass-through`(既存ロジックに委ねる)
|
|
297
|
+
* - helper 採用 (`kind: 'accepted'`): `detectEachScopeContext` を helperCallSites 付きで
|
|
298
|
+
* 呼び出し、結果を `inherited` で返す。null(全 call-site が each 外 / ambiguous)の
|
|
299
|
+
* 場合も `inherited { context: null }` として返し、呼び出し側が ambiguous を判定する。
|
|
300
|
+
* - helper 不採用 (`kind: 'rejected'`): DT014 を生成して返す
|
|
301
|
+
*/
|
|
302
|
+
function tryEnclosingHelperRecovery(onCallExpr, sourceFile, checker) {
|
|
303
|
+
const result = findEnclosingHelper(onCallExpr, sourceFile, checker);
|
|
304
|
+
if (result.kind === 'none') {
|
|
305
|
+
return { kind: 'pass-through' };
|
|
306
|
+
}
|
|
307
|
+
if (result.kind === 'rejected') {
|
|
308
|
+
return {
|
|
309
|
+
kind: 'rejected',
|
|
310
|
+
diagnostic: buildEnclosingHelperDiagnostic(result.rejection, sourceFile, ts.DiagnosticCategory.Error),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
// accepted: helper 経由の each scope を判定
|
|
314
|
+
// Task 2.2: detectEachScopeContext の 3-state を明示的に分岐する。
|
|
315
|
+
// - EachScopeContext: helper 全 call-site が単一 each scope を共有
|
|
316
|
+
// - null: helper 全 call-site が each 外で確定
|
|
317
|
+
// - 'ambiguous': call-site が each 内外混在 / 異 itemParamName
|
|
318
|
+
// → DT014 を `ambiguous-call-sites` reason 付きで発行して当該 handler をスキップ
|
|
319
|
+
const ctx = (0, each_state_rewriter_1.detectEachScopeContext)(onCallExpr, checker, {
|
|
320
|
+
helperCallSites: result.helper.callSites,
|
|
321
|
+
});
|
|
322
|
+
if (ctx === 'ambiguous') {
|
|
323
|
+
const rejection = {
|
|
324
|
+
name: result.helper.name,
|
|
325
|
+
declaration: result.helper.declaration,
|
|
326
|
+
onCallExpr,
|
|
327
|
+
reason: {
|
|
328
|
+
code: 'ambiguous-call-sites',
|
|
329
|
+
callSiteCount: result.helper.callSites.length,
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
return {
|
|
333
|
+
kind: 'rejected',
|
|
334
|
+
diagnostic: buildEnclosingHelperDiagnostic(rejection, sourceFile, ts.DiagnosticCategory.Error),
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
// ctx は EachScopeContext | null のいずれか(each 外確定 or 単一 context)
|
|
338
|
+
// Task 3.2: helper-aware 経路の paramSymbols をここで一括計算して返す。
|
|
339
|
+
// - context が単一 EachScopeContext のときのみ helperCallSites を伝播して
|
|
340
|
+
// `collectEachScopeParamSymbols` を呼ぶ
|
|
341
|
+
// - each 外確定 (context === null) の場合は paramSymbols も undefined
|
|
342
|
+
// - design Decision「helper-aware 経路の中央集約」に従い、helper 検出は
|
|
343
|
+
// 本関数内で 1 度だけ実施 (caller 側は再走査しない)
|
|
344
|
+
const paramSymbols = ctx === null
|
|
345
|
+
? undefined
|
|
346
|
+
: (0, each_state_rewriter_1.collectEachScopeParamSymbols)(onCallExpr, checker, {
|
|
347
|
+
helperCallSites: result.helper.callSites,
|
|
348
|
+
});
|
|
349
|
+
return { kind: 'inherited', context: ctx, paramSymbols };
|
|
350
|
+
}
|
|
351
|
+
// ---- Phase 1 delegate: runHelperAwarePreCheck -------------------------------
|
|
352
|
+
/**
|
|
353
|
+
* Phase 1 per-call delegate: helper-aware pre-check の outcome を構築する。
|
|
354
|
+
*
|
|
355
|
+
* 内部で `tryEnclosingHelperRecovery` を呼び、3 経路の discriminated union を
|
|
356
|
+
* `PreCheckOutcome` (flat shape) に変換する薄いラッパ。factory main loop は本関数を
|
|
357
|
+
* 呼んで `PreCheckOutcome` を受け取り、`diagnostics` に Error カテゴリが含まれる場合に
|
|
358
|
+
* 当該 .on() 呼出をスキップする。
|
|
359
|
+
*
|
|
360
|
+
* Mapping:
|
|
361
|
+
* - pass-through → { helperPathUsed: false, inheritedEachContext: null, ..., diagnostics: [] }
|
|
362
|
+
* - inherited → { helperPathUsed: true, inheritedEachContext: ctx, inheritedEachParamSymbols, diagnostics: [] }
|
|
363
|
+
* - rejected → { helperPathUsed: false, inheritedEachContext: null, ..., diagnostics: [diag] }
|
|
364
|
+
*
|
|
365
|
+
* relocated/added in transformer-index-pipeline-split task 3.1.
|
|
366
|
+
*/
|
|
367
|
+
function runHelperAwarePreCheck(base, callInfo) {
|
|
368
|
+
const r = tryEnclosingHelperRecovery(callInfo.callExpr, base.sourceFile, base.checker);
|
|
369
|
+
return {
|
|
370
|
+
helperPathUsed: r.kind === 'inherited',
|
|
371
|
+
inheritedEachContext: r.kind === 'inherited' ? r.context : null,
|
|
372
|
+
inheritedEachParamSymbols: r.kind === 'inherited' ? r.paramSymbols : undefined,
|
|
373
|
+
diagnostics: r.kind === 'rejected' ? [r.diagnostic] : [],
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=helper-context-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-context-resolver.js","sourceRoot":"","sources":["../../src/transformer/helper-context-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* helper-decl-utils — helper 宣言判定の共有ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* 仕様: `.kiro/specs/helper-inline-recovery-followups/design.md`
|
|
5
|
+
* - Components / `helper-decl-utils.ts`
|
|
6
|
+
* - Requirements 3.1, 3.2
|
|
7
|
+
*
|
|
8
|
+
* 単一責任:
|
|
9
|
+
* 1. Identifier の Symbol/alias 解決を `valueDeclaration` まで辿る
|
|
10
|
+
* 2. VariableDeclaration がモジュールトップレベル直下か判定する
|
|
11
|
+
* 3. VariableDeclarationList が `const` か判定する
|
|
12
|
+
*
|
|
13
|
+
* 副作用なしの純関数のみ。`ts.*` API のみ依存。
|
|
14
|
+
*
|
|
15
|
+
* 元実装は `helper-context-resolver.ts` の 3 関数(TXDX-2 時点でリファイン済)
|
|
16
|
+
* を採用し、`inline-recovery.ts` の旧コピーは本ファイルに置き換える。
|
|
17
|
+
*/
|
|
18
|
+
import * as ts from 'typescript';
|
|
19
|
+
/**
|
|
20
|
+
* Identifier から最終的な valueDeclaration を返す。
|
|
21
|
+
* import alias は `getAliasedSymbol` で再帰解決する。
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveValueDeclaration(ident: ts.Identifier, checker: ts.TypeChecker): ts.Declaration | undefined;
|
|
24
|
+
/** VariableDeclaration がモジュールトップレベル直下か判定する。 */
|
|
25
|
+
export declare function isModuleLevelVariableDeclaration(decl: ts.VariableDeclaration, sourceFile: ts.SourceFile): boolean;
|
|
26
|
+
/** VariableDeclarationList が `const` 宣言か判定する。 */
|
|
27
|
+
export declare function isConstDeclaration(decl: ts.VariableDeclaration): boolean;
|
|
28
|
+
//# sourceMappingURL=helper-decl-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-decl-utils.d.ts","sourceRoot":"","sources":["../../src/transformer/helper-decl-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,EAAE,CAAC,UAAU,EACpB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,EAAE,CAAC,WAAW,GAAG,SAAS,CAW5B;AAED,+CAA+C;AAC/C,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAC5B,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,OAAO,CAMT;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,GAAG,OAAO,CAIxE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* helper-decl-utils — helper 宣言判定の共有ユーティリティ
|
|
4
|
+
*
|
|
5
|
+
* 仕様: `.kiro/specs/helper-inline-recovery-followups/design.md`
|
|
6
|
+
* - Components / `helper-decl-utils.ts`
|
|
7
|
+
* - Requirements 3.1, 3.2
|
|
8
|
+
*
|
|
9
|
+
* 単一責任:
|
|
10
|
+
* 1. Identifier の Symbol/alias 解決を `valueDeclaration` まで辿る
|
|
11
|
+
* 2. VariableDeclaration がモジュールトップレベル直下か判定する
|
|
12
|
+
* 3. VariableDeclarationList が `const` か判定する
|
|
13
|
+
*
|
|
14
|
+
* 副作用なしの純関数のみ。`ts.*` API のみ依存。
|
|
15
|
+
*
|
|
16
|
+
* 元実装は `helper-context-resolver.ts` の 3 関数(TXDX-2 時点でリファイン済)
|
|
17
|
+
* を採用し、`inline-recovery.ts` の旧コピーは本ファイルに置き換える。
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.resolveValueDeclaration = resolveValueDeclaration;
|
|
54
|
+
exports.isModuleLevelVariableDeclaration = isModuleLevelVariableDeclaration;
|
|
55
|
+
exports.isConstDeclaration = isConstDeclaration;
|
|
56
|
+
const ts = __importStar(require("typescript"));
|
|
57
|
+
/**
|
|
58
|
+
* Identifier から最終的な valueDeclaration を返す。
|
|
59
|
+
* import alias は `getAliasedSymbol` で再帰解決する。
|
|
60
|
+
*/
|
|
61
|
+
function resolveValueDeclaration(ident, checker) {
|
|
62
|
+
let sym = checker.getSymbolAtLocation(ident);
|
|
63
|
+
if (sym === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
if ((sym.flags & ts.SymbolFlags.Alias) !== 0) {
|
|
66
|
+
try {
|
|
67
|
+
sym = checker.getAliasedSymbol(sym);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return sym.valueDeclaration;
|
|
74
|
+
}
|
|
75
|
+
/** VariableDeclaration がモジュールトップレベル直下か判定する。 */
|
|
76
|
+
function isModuleLevelVariableDeclaration(decl, sourceFile) {
|
|
77
|
+
const list = decl.parent;
|
|
78
|
+
if (list === undefined || !ts.isVariableDeclarationList(list))
|
|
79
|
+
return false;
|
|
80
|
+
const stmt = list.parent;
|
|
81
|
+
if (stmt === undefined || !ts.isVariableStatement(stmt))
|
|
82
|
+
return false;
|
|
83
|
+
return stmt.parent === sourceFile;
|
|
84
|
+
}
|
|
85
|
+
/** VariableDeclarationList が `const` 宣言か判定する。 */
|
|
86
|
+
function isConstDeclaration(decl) {
|
|
87
|
+
const list = decl.parent;
|
|
88
|
+
if (list === undefined || !ts.isVariableDeclarationList(list))
|
|
89
|
+
return false;
|
|
90
|
+
return (list.flags & ts.NodeFlags.Const) !== 0;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=helper-decl-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-decl-utils.js","sourceRoot":"","sources":["../../src/transformer/helper-decl-utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,0DAcC;AAGD,4EASC;AAGD,gDAIC;AAvCD,+CAAiC;AAEjC;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,KAAoB,EACpB,OAAuB;IAEvB,IAAI,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,gBAAgB,CAAC;AAC9B,CAAC;AAED,+CAA+C;AAC/C,SAAgB,gCAAgC,CAC9C,IAA4B,EAC5B,UAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;AACpC,CAAC;AAED,iDAAiD;AACjD,SAAgB,kBAAkB,CAAC,IAA4B;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* identifier-collector: `HandlerIR` → ルート識別子の `IdentifierRef[]`
|
|
3
|
+
*
|
|
4
|
+
* Task 4.3:
|
|
5
|
+
* - HandlerIR を入力にハンドラ本体内のルート識別子一覧を返す
|
|
6
|
+
* - プロパティアクセスはルートのみ拾い、チェーン先は収集しない
|
|
7
|
+
* - paramName に一致する識別子は `event-param`
|
|
8
|
+
* - localDecls に含まれる識別子は `local`
|
|
9
|
+
* - それ以外は `unknown`
|
|
10
|
+
* - 同名識別子は最初の出現のみ(dedupe)
|
|
11
|
+
*
|
|
12
|
+
* 対応 requirements: 2.3, 3.4
|
|
13
|
+
*/
|
|
14
|
+
import type { HandlerIR, IdentifierRef } from './handler-ir-extractor.ts';
|
|
15
|
+
/**
|
|
16
|
+
* `HandlerIR` からハンドラ本体内のルート識別子一覧を収集して返す。
|
|
17
|
+
*
|
|
18
|
+
* - プロパティアクセス(`a.b.c`)ではルート(`a`)のみ収集し、`b`・`c` は除外する
|
|
19
|
+
* - 同名識別子は最初の出現のみを返す(名前ベースで dedupe)
|
|
20
|
+
* - `HandlerIR.paramName` に一致するものは `event-param`
|
|
21
|
+
* - `HandlerIR.localDecls` に含まれるものは `local`
|
|
22
|
+
* - それ以外は `unknown`(`whitelist-validator` が後続で分類する)
|
|
23
|
+
*
|
|
24
|
+
* @param ir `extractHandlerIR` が返した `HandlerIR`
|
|
25
|
+
* @returns ルート識別子の `IdentifierRef[]`
|
|
26
|
+
*/
|
|
27
|
+
export declare function collectIdentifiers(ir: HandlerIR): IdentifierRef[];
|
|
28
|
+
//# sourceMappingURL=identifier-collector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier-collector.d.ts","sourceRoot":"","sources":["../../src/transformer/identifier-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAuF1E;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,GAAG,aAAa,EAAE,CAkDjE"}
|