@needle-tools/needle-component-compiler 2.4.0-pre → 3.0.0-68ab237
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/Changelog.md +183 -84
- package/Readme.md +134 -19
- package/dist/BaseWriter.d.ts +23 -0
- package/dist/BaseWriter.js +91 -0
- package/dist/Compiler.d.ts +22 -0
- package/{src/base-compiler.js → dist/Compiler.js} +461 -507
- package/dist/base-compiler.d.ts +56 -0
- package/dist/base-compiler.js +182 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +63 -0
- package/dist/commands.d.ts +3 -0
- package/{src → dist}/commands.js +15 -15
- package/dist/impl/blender-compiler.d.ts +14 -0
- package/dist/impl/blender-compiler.js +195 -0
- package/dist/impl/csharp-compiler.d.ts +16 -0
- package/dist/impl/csharp-compiler.js +307 -0
- package/dist/impl/react-three-fiber-compiler.d.ts +20 -0
- package/{src → dist/impl}/react-three-fiber-compiler.js +36 -34
- package/dist/index.d.ts +5 -0
- package/dist/index.js +16 -0
- package/dist/register-types.d.ts +8 -0
- package/{src → dist}/register-types.js +34 -34
- package/dist/watcher.d.ts +6 -0
- package/{src → dist}/watcher.js +79 -78
- package/package.json +63 -49
- package/src/blender-compiler.js +0 -180
- package/src/component-compiler.js +0 -699
- package/src/csharp-compiler.js +0 -58
- package/src/test.js +0 -194
- package/src/types.js +0 -51
- package/test/component.basic.test.js +0 -26
- package/test/component.methods.test.js +0 -82
- package/test/component.nonserialized.test.js +0 -20
- package/test/component.primitives.test.js +0 -47
- package/test/helpers.js +0 -54
|
@@ -1,507 +1,461 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Compiler =
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
function
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
return
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
//
|
|
323
|
-
//
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
var
|
|
380
|
-
if (
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
if (
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if (
|
|
417
|
-
var
|
|
418
|
-
if (
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
return
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
}
|
|
463
|
-
else if (ts.isPrefixUnaryExpression(node)) {
|
|
464
|
-
var operand = this.resolveExpression(node.operand, writer);
|
|
465
|
-
if (operand) {
|
|
466
|
-
return node.operator + operand;
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
else if (ts.isPostfixUnaryExpression(node)) {
|
|
470
|
-
var operand = this.resolveExpression(node.operand, writer);
|
|
471
|
-
if (operand) {
|
|
472
|
-
return operand + node.operator;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
else if (ts.isParenthesizedExpression(node)) {
|
|
476
|
-
return this.resolveExpression(node.expression, writer);
|
|
477
|
-
}
|
|
478
|
-
else if (ts.isArrayLiteralExpression(node)) {
|
|
479
|
-
var elements = node.elements.map(function (e) { return _this.resolveExpression(e, writer); }).filter(function (e) { return e; });
|
|
480
|
-
return "[" + elements.join(", ") + "]";
|
|
481
|
-
}
|
|
482
|
-
else if (ts.isObjectLiteralExpression(node)) {
|
|
483
|
-
var properties = node.properties.map(function (p) {
|
|
484
|
-
if (ts.isPropertyAssignment(p)) {
|
|
485
|
-
var name_2 = p.name.getText();
|
|
486
|
-
var value = _this.resolveExpression(p.initializer, writer);
|
|
487
|
-
if (value) {
|
|
488
|
-
return name_2 + ": " + value;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}).filter(function (p) { return p; });
|
|
492
|
-
return "{" + properties.join(", ") + "}";
|
|
493
|
-
}
|
|
494
|
-
else if (ts.isNewExpression(node)) {
|
|
495
|
-
var typeName = this.resolveTypeFromString(node.expression.getText(), writer);
|
|
496
|
-
if (typeName) {
|
|
497
|
-
var args = node.arguments.map(function (a) { return _this.resolveExpression(a, writer); }).filter(function (a) { return a; });
|
|
498
|
-
// writer.writeNewTypeExpression(typeName, args);
|
|
499
|
-
// return;
|
|
500
|
-
return "new " + typeName + "(" + args.join(", ") + ")";
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
console.error("!!!!! ----- Unknown expression", ts.SyntaxKind[node.kind], node.getText());
|
|
504
|
-
};
|
|
505
|
-
return Compiler;
|
|
506
|
-
}());
|
|
507
|
-
exports.Compiler = Compiler;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Compiler = void 0;
|
|
4
|
+
var ts = require("typescript");
|
|
5
|
+
var base_compiler_1 = require("./base-compiler");
|
|
6
|
+
/** Typescript Walker */
|
|
7
|
+
var Compiler = /** @class */ (function () {
|
|
8
|
+
function Compiler() {
|
|
9
|
+
}
|
|
10
|
+
Compiler.prototype.compile = function (writer, code, sourceFilePath) {
|
|
11
|
+
var file = "needle_compiled.ts";
|
|
12
|
+
var sourceFile = ts.createSourceFile(file, code, ts.ScriptTarget.ES2015, true, ts.ScriptKind.TS);
|
|
13
|
+
var prog = ts.createProgram([file], {});
|
|
14
|
+
this.run(prog, writer, sourceFile, sourceFilePath);
|
|
15
|
+
};
|
|
16
|
+
Compiler.prototype.run = function (prog, writer, sourceFile, filePath) {
|
|
17
|
+
var _this = this;
|
|
18
|
+
console.log("Starting compilation of " + filePath);
|
|
19
|
+
writer.begin(filePath);
|
|
20
|
+
// Pre-scan: collect enum declarations so type resolution works for class fields
|
|
21
|
+
ts.forEachChild(sourceFile, function (node) {
|
|
22
|
+
if (ts.isEnumDeclaration(node)) {
|
|
23
|
+
_this.visitEnumDeclaration(node, writer);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
ts.forEachChild(sourceFile, function (node) {
|
|
27
|
+
_this.visit(filePath, node, writer);
|
|
28
|
+
});
|
|
29
|
+
writer.end(filePath);
|
|
30
|
+
};
|
|
31
|
+
Compiler.prototype.visitEnumDeclaration = function (node, writer) {
|
|
32
|
+
var name = node.name.getText();
|
|
33
|
+
var members = [];
|
|
34
|
+
var nextValue = 0;
|
|
35
|
+
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
|
|
36
|
+
var member = _a[_i];
|
|
37
|
+
var memberName = member.name.getText();
|
|
38
|
+
var value = void 0;
|
|
39
|
+
if (member.initializer) {
|
|
40
|
+
if (ts.isNumericLiteral(member.initializer)) {
|
|
41
|
+
value = parseFloat(member.initializer.getText());
|
|
42
|
+
nextValue = value + 1;
|
|
43
|
+
}
|
|
44
|
+
else if (ts.isPrefixUnaryExpression(member.initializer) &&
|
|
45
|
+
ts.isNumericLiteral(member.initializer.operand)) {
|
|
46
|
+
value = parseFloat(ts.tokenToString(member.initializer.operator) + member.initializer.operand.getText());
|
|
47
|
+
nextValue = value + 1;
|
|
48
|
+
}
|
|
49
|
+
else if (ts.isStringLiteral(member.initializer)) {
|
|
50
|
+
// String enum value — use .text to get the raw string without surrounding quotes
|
|
51
|
+
value = member.initializer.text;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Other computed value — store as-is
|
|
55
|
+
value = member.initializer.getText();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
value = nextValue++;
|
|
60
|
+
}
|
|
61
|
+
members.push({ name: memberName, value: value });
|
|
62
|
+
}
|
|
63
|
+
this.debugLog("[COMPILER] ENUM", name, members);
|
|
64
|
+
writer.registerEnum(name, members);
|
|
65
|
+
};
|
|
66
|
+
Compiler.prototype.visit = function (filePath, node, writer) {
|
|
67
|
+
var _this = this;
|
|
68
|
+
if (ts.isClassDeclaration(node)) {
|
|
69
|
+
this.visitClassDeclaration(filePath, node, writer);
|
|
70
|
+
}
|
|
71
|
+
else if (ts.isPropertyDeclaration(node)) {
|
|
72
|
+
this.visitPropertyDeclaration(node, writer);
|
|
73
|
+
}
|
|
74
|
+
else if (ts.isMethodDeclaration(node)) {
|
|
75
|
+
this.visitMethodDeclaration(node, writer);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
ts.forEachChild(node, function (node) {
|
|
79
|
+
_this.visit(filePath, node, writer);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
Compiler.prototype.visitClassDeclaration = function (filePath, node, writer) {
|
|
84
|
+
var _this = this;
|
|
85
|
+
var name = node.name.text;
|
|
86
|
+
// get all parent types
|
|
87
|
+
var baseTypes = [];
|
|
88
|
+
if (node.heritageClauses) {
|
|
89
|
+
for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
|
|
90
|
+
var clause = _a[_i];
|
|
91
|
+
if (clause.token == ts.SyntaxKind.ExtendsKeyword || clause.token == ts.SyntaxKind.ImplementsKeyword) {
|
|
92
|
+
for (var _b = 0, _c = clause.types; _b < _c.length; _b++) {
|
|
93
|
+
var type = _c[_b];
|
|
94
|
+
var typeName = type.expression.getText();
|
|
95
|
+
baseTypes.push(typeName);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.debugLog("[COMPILER] CLASS START", name, baseTypes);
|
|
101
|
+
var res = writer.startNewType(filePath, name, baseTypes, this.getComments(node));
|
|
102
|
+
if (res === false) {
|
|
103
|
+
this.debugLog("CLASS SKIPPED", name);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
ts.forEachChild(node, function (node) {
|
|
107
|
+
_this.visit(filePath, node, writer);
|
|
108
|
+
});
|
|
109
|
+
writer.endNewType(filePath, name);
|
|
110
|
+
this.debugLog("[COMPILER] CLASS END", name, "\n");
|
|
111
|
+
};
|
|
112
|
+
Compiler.prototype.visitPropertyDeclaration = function (node, writer) {
|
|
113
|
+
// Skip static and abstract properties — they don't map to serialized fields
|
|
114
|
+
if (node.modifiers) {
|
|
115
|
+
for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
|
|
116
|
+
var modifier = _a[_i];
|
|
117
|
+
if (modifier.kind === ts.SyntaxKind.StaticKeyword ||
|
|
118
|
+
modifier.kind === ts.SyntaxKind.AbstractKeyword) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
var name = node.name.getText();
|
|
124
|
+
var type = this.resolveType(node.type, writer);
|
|
125
|
+
var visibility = this.getVisibility(node);
|
|
126
|
+
var initialValue = node.initializer && this.resolveExpression(node.initializer, writer);
|
|
127
|
+
var isArray = this.isArrayType(node.type);
|
|
128
|
+
if (!type && node.initializer) {
|
|
129
|
+
type = this.tryResolveTypeFromExpression(node.initializer, writer);
|
|
130
|
+
}
|
|
131
|
+
this.debugLog("[COMPILER] PROPERTY", base_compiler_1.Visibility[visibility], name, isArray, type, initialValue);
|
|
132
|
+
if (!type)
|
|
133
|
+
return; // cannot determine type — skip the field
|
|
134
|
+
writer.writeMember(visibility, name, isArray, type, initialValue, this.getComments(node));
|
|
135
|
+
};
|
|
136
|
+
Compiler.prototype.visitMethodDeclaration = function (node, writer) {
|
|
137
|
+
var _a;
|
|
138
|
+
var name = node.name.getText();
|
|
139
|
+
var visibility = this.getVisibility(node);
|
|
140
|
+
// Skip static and abstract methods — they don't map to Unity MonoBehaviour stubs
|
|
141
|
+
if (node.modifiers) {
|
|
142
|
+
for (var _i = 0, _b = node.modifiers; _i < _b.length; _i++) {
|
|
143
|
+
var modifier = _b[_i];
|
|
144
|
+
if (modifier.kind === ts.SyntaxKind.StaticKeyword ||
|
|
145
|
+
modifier.kind === ts.SyntaxKind.AbstractKeyword) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
var returnType = this.resolveType(node.type, writer);
|
|
151
|
+
var args;
|
|
152
|
+
if ((_a = node.parameters) === null || _a === void 0 ? void 0 : _a.length) {
|
|
153
|
+
args = this.resolveParameters(node.parameters, writer);
|
|
154
|
+
}
|
|
155
|
+
this.debugLog("[COMPILER] METHOD", base_compiler_1.Visibility[visibility], name, returnType, args);
|
|
156
|
+
writer.writeMethod(visibility, name, returnType, args, this.getComments(node));
|
|
157
|
+
};
|
|
158
|
+
Compiler.prototype.resolveParameters = function (parameters, writer) {
|
|
159
|
+
var result = [];
|
|
160
|
+
for (var _i = 0, parameters_1 = parameters; _i < parameters_1.length; _i++) {
|
|
161
|
+
var parameter = parameters_1[_i];
|
|
162
|
+
// Destructured parameters (e.g. { xr }) get a generic name
|
|
163
|
+
var name_1 = ts.isObjectBindingPattern(parameter.name) ? "obj" : parameter.name.getText();
|
|
164
|
+
var type = this.resolveType(parameter.type, writer);
|
|
165
|
+
var defaultValue = parameter.initializer && this.resolveExpression(parameter.initializer, writer);
|
|
166
|
+
result.push({ name: name_1, type: type, defaultValue: defaultValue });
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
};
|
|
170
|
+
Compiler.prototype.debugLog = function () {
|
|
171
|
+
var args = [];
|
|
172
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
173
|
+
args[_i] = arguments[_i];
|
|
174
|
+
}
|
|
175
|
+
console.log.apply(console, args);
|
|
176
|
+
};
|
|
177
|
+
Compiler.prototype.getComments = function (node) {
|
|
178
|
+
var commentRanges = ts.getLeadingCommentRanges(node.getFullText(), 0);
|
|
179
|
+
if (commentRanges) {
|
|
180
|
+
var comments = [];
|
|
181
|
+
var jsdocText = void 0;
|
|
182
|
+
for (var _i = 0, commentRanges_1 = commentRanges; _i < commentRanges_1.length; _i++) {
|
|
183
|
+
var range = commentRanges_1[_i];
|
|
184
|
+
var text = node.getFullText().substring(range.pos, range.end).trimStart();
|
|
185
|
+
// match only lines that starts with //@ or // @
|
|
186
|
+
var match = text.match(/\/\/\s*@(.+)/);
|
|
187
|
+
if (match) {
|
|
188
|
+
comments.push(text.substring(match.index + 2).trim());
|
|
189
|
+
}
|
|
190
|
+
// detect JSDoc block comments /** ... */
|
|
191
|
+
else {
|
|
192
|
+
var jsdocMatch = text.match(/^\/\*\*\s*([\s\S]*?)\s*\*\/$/);
|
|
193
|
+
if (jsdocMatch) {
|
|
194
|
+
jsdocText = jsdocMatch[1].replace(/^\s*\*\s?/gm, '').trim();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Synthesize @tooltip from JSDoc if no explicit @tooltip exists
|
|
199
|
+
if (jsdocText && !comments.some(function (c) { return c.startsWith("@tooltip "); })) {
|
|
200
|
+
jsdocText = Compiler.sanitizeJsdocForTooltip(jsdocText);
|
|
201
|
+
if (jsdocText) {
|
|
202
|
+
comments.push("@tooltip " + jsdocText);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return comments;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
/** Strip markdown/code/images/URLs/JSDoc tags to produce a plain-text tooltip */
|
|
209
|
+
Compiler.sanitizeJsdocForTooltip = function (text) {
|
|
210
|
+
var result = text;
|
|
211
|
+
// Remove fenced code blocks (```...```)
|
|
212
|
+
result = result.replace(/```[\s\S]*?```/g, '');
|
|
213
|
+
// Remove inline code (`...`)
|
|
214
|
+
result = result.replace(/`[^`]*`/g, '');
|
|
215
|
+
// Remove markdown image syntax 
|
|
216
|
+
result = result.replace(/!\[[^\]]*\]\([^)]*\)/g, '');
|
|
217
|
+
// Remove markdown links [text](url) → keep text
|
|
218
|
+
result = result.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1');
|
|
219
|
+
// Remove bare URLs (http/https)
|
|
220
|
+
result = result.replace(/https?:\/\/\S+/g, '');
|
|
221
|
+
// Remove JSDoc block tags (@param, @returns, @example, etc.) and everything after them on the same line
|
|
222
|
+
result = result.replace(/@\w+[^\n]*/g, '');
|
|
223
|
+
// Collapse whitespace
|
|
224
|
+
result = result.replace(/\s+/g, ' ').trim();
|
|
225
|
+
return result;
|
|
226
|
+
};
|
|
227
|
+
Compiler.prototype.getVisibility = function (node) {
|
|
228
|
+
if (node.modifiers) {
|
|
229
|
+
for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
|
|
230
|
+
var modifier = _a[_i];
|
|
231
|
+
if (modifier.kind === ts.SyntaxKind.PublicKeyword) {
|
|
232
|
+
return base_compiler_1.Visibility.Public;
|
|
233
|
+
}
|
|
234
|
+
else if (modifier.kind === ts.SyntaxKind.ProtectedKeyword) {
|
|
235
|
+
return base_compiler_1.Visibility.Protected;
|
|
236
|
+
}
|
|
237
|
+
else if (modifier.kind === ts.SyntaxKind.PrivateKeyword) {
|
|
238
|
+
return base_compiler_1.Visibility.Private;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return base_compiler_1.Visibility.Public;
|
|
243
|
+
};
|
|
244
|
+
Compiler.prototype.tryResolveTypeFromExpression = function (exp, write) {
|
|
245
|
+
var _a;
|
|
246
|
+
if (ts.isNewExpression(exp)) {
|
|
247
|
+
// try get generic type from expression
|
|
248
|
+
if ((_a = exp.typeArguments) === null || _a === void 0 ? void 0 : _a.length) {
|
|
249
|
+
for (var _i = 0, _b = exp.typeArguments; _i < _b.length; _i++) {
|
|
250
|
+
var arg = _b[_i];
|
|
251
|
+
var type = this.resolveType(arg, write);
|
|
252
|
+
if (type) {
|
|
253
|
+
return type;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
var typeName = exp.expression.getText();
|
|
258
|
+
return this.resolveTypeFromString(typeName, write);
|
|
259
|
+
}
|
|
260
|
+
// Infer type from literal initializers (no explicit type annotation)
|
|
261
|
+
if (ts.isNumericLiteral(exp)) {
|
|
262
|
+
// e.g. speed = 5 or ratio = 5.5 → number → float
|
|
263
|
+
return this.resolveTypeFromString("number", write);
|
|
264
|
+
}
|
|
265
|
+
if (ts.isStringLiteral(exp)) {
|
|
266
|
+
// e.g. label = "hello" → string
|
|
267
|
+
return this.resolveTypeFromString("string", write);
|
|
268
|
+
}
|
|
269
|
+
if (exp.kind === ts.SyntaxKind.TrueKeyword || exp.kind === ts.SyntaxKind.FalseKeyword) {
|
|
270
|
+
// e.g. active = true → boolean → bool
|
|
271
|
+
return this.resolveTypeFromString("boolean", write);
|
|
272
|
+
}
|
|
273
|
+
if (ts.isPrefixUnaryExpression(exp) && ts.isNumericLiteral(exp.operand)) {
|
|
274
|
+
// e.g. speed = -5 or ratio = -1.5 → number → float
|
|
275
|
+
return this.resolveTypeFromString("number", write);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
Compiler.prototype.resolveType = function (typeNode, writer) {
|
|
279
|
+
if (!typeNode)
|
|
280
|
+
return undefined;
|
|
281
|
+
// check if its an array
|
|
282
|
+
if (this.isArrayType(typeNode)) {
|
|
283
|
+
if (typeNode.kind === ts.SyntaxKind.ArrayType) {
|
|
284
|
+
var arrayType = typeNode;
|
|
285
|
+
return this.resolveType(arrayType.elementType, writer);
|
|
286
|
+
}
|
|
287
|
+
// check if its Array<> or Map
|
|
288
|
+
if (typeNode.kind === ts.SyntaxKind.TypeReference) {
|
|
289
|
+
var typeReference = typeNode;
|
|
290
|
+
if (typeReference.typeName.getText() === "Array") {
|
|
291
|
+
var typeArgument = typeReference.typeArguments && typeReference.typeArguments[0];
|
|
292
|
+
return this.resolveType(typeArgument, writer);
|
|
293
|
+
}
|
|
294
|
+
else if (typeReference.typeName.getText() === "Map") {
|
|
295
|
+
var typeArgument = typeReference.typeArguments && typeReference.typeArguments[0];
|
|
296
|
+
return this.resolveType(typeArgument, writer);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// check if its dictionary
|
|
300
|
+
if (typeNode.kind === ts.SyntaxKind.TypeLiteral) {
|
|
301
|
+
var typeLiteral = typeNode;
|
|
302
|
+
var members = typeLiteral.members;
|
|
303
|
+
if (members.length === 2) {
|
|
304
|
+
var firstMember = members[0];
|
|
305
|
+
var secondMember = members[1];
|
|
306
|
+
if (firstMember.kind === ts.SyntaxKind.IndexSignature && secondMember.kind === ts.SyntaxKind.IndexSignature) {
|
|
307
|
+
var firstIndexSignature = firstMember;
|
|
308
|
+
var secondIndexSignature = secondMember;
|
|
309
|
+
var firstIndexType = firstIndexSignature.parameters[0].type;
|
|
310
|
+
var secondIndexType = secondIndexSignature.parameters[0].type;
|
|
311
|
+
if (firstIndexType.kind === ts.SyntaxKind.StringKeyword && secondIndexType.kind === ts.SyntaxKind.NumberKeyword) {
|
|
312
|
+
var valueType = firstIndexSignature.type;
|
|
313
|
+
return this.resolveType(valueType, writer);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// is generic
|
|
319
|
+
// if (typeNode.kind === ts.SyntaxKind.TypeReference) {
|
|
320
|
+
// const typeReference = typeNode as ts.TypeReferenceNode;
|
|
321
|
+
// const typeArgument = typeReference.typeArguments && typeReference.typeArguments[0];
|
|
322
|
+
// return this.resolveType(typeArgument, writer);
|
|
323
|
+
// }
|
|
324
|
+
console.error("!!!!! ----- Unknown array type", typeNode.getText());
|
|
325
|
+
}
|
|
326
|
+
// Union types: Object3D | null | undefined → resolve the first concrete member
|
|
327
|
+
if (ts.isUnionTypeNode(typeNode)) {
|
|
328
|
+
for (var _i = 0, _a = typeNode.types; _i < _a.length; _i++) {
|
|
329
|
+
var member = _a[_i];
|
|
330
|
+
if (member.kind !== ts.SyntaxKind.NullKeyword &&
|
|
331
|
+
member.kind !== ts.SyntaxKind.UndefinedKeyword) {
|
|
332
|
+
return this.resolveType(member, writer);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return undefined;
|
|
336
|
+
}
|
|
337
|
+
// TypeReference: use base name only (strips generic args like EventList<void> → EventList)
|
|
338
|
+
if (typeNode.kind === ts.SyntaxKind.TypeReference) {
|
|
339
|
+
var typeReference = typeNode;
|
|
340
|
+
return this.resolveTypeFromString(typeReference.typeName.getText(), writer);
|
|
341
|
+
}
|
|
342
|
+
return this.resolveTypeFromString(typeNode.getText(), writer);
|
|
343
|
+
};
|
|
344
|
+
Compiler.prototype.resolveTypeFromString = function (type, writer) {
|
|
345
|
+
var resolved = writer.resolveCSharpTypeName(type);
|
|
346
|
+
return resolved || type;
|
|
347
|
+
};
|
|
348
|
+
Compiler.prototype.isArrayType = function (typeNode) {
|
|
349
|
+
if (!typeNode)
|
|
350
|
+
return false;
|
|
351
|
+
// check if its an array
|
|
352
|
+
if (typeNode.kind === ts.SyntaxKind.ArrayType) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
// check if its Array<> or map
|
|
356
|
+
if (typeNode.kind === ts.SyntaxKind.TypeReference) {
|
|
357
|
+
var typeReference = typeNode;
|
|
358
|
+
if (typeReference.typeName.getText() === "Array") {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
else if (typeReference.typeName.getText() === "Map") {
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// check if its array or dictionary
|
|
366
|
+
if (typeNode.kind === ts.SyntaxKind.TypeLiteral) {
|
|
367
|
+
var typeLiteral = typeNode;
|
|
368
|
+
if (typeLiteral.members.length === 2) {
|
|
369
|
+
var first = typeLiteral.members[0];
|
|
370
|
+
var second = typeLiteral.members[1];
|
|
371
|
+
if (first.kind === ts.SyntaxKind.IndexSignature && second.kind === ts.SyntaxKind.IndexSignature) {
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return false;
|
|
377
|
+
};
|
|
378
|
+
Compiler.prototype.resolveExpression = function (node, writer) {
|
|
379
|
+
var _this = this;
|
|
380
|
+
if (ts.isStringLiteral(node)) {
|
|
381
|
+
return this.resolveTypeFromString(node.text, writer);
|
|
382
|
+
}
|
|
383
|
+
else if (ts.isNumericLiteral(node)) {
|
|
384
|
+
return this.resolveTypeFromString(node.text, writer);
|
|
385
|
+
}
|
|
386
|
+
else if (ts.isIdentifier(node)) {
|
|
387
|
+
return this.resolveTypeFromString(node.text, writer);
|
|
388
|
+
}
|
|
389
|
+
else if (node.kind === ts.SyntaxKind.NullKeyword) {
|
|
390
|
+
return this.resolveTypeFromString(node.getText(), writer);
|
|
391
|
+
}
|
|
392
|
+
// is true or false
|
|
393
|
+
else if (node.kind === ts.SyntaxKind.TrueKeyword || node.kind === ts.SyntaxKind.FalseKeyword) {
|
|
394
|
+
return this.resolveTypeFromString(node.getText(), writer);
|
|
395
|
+
}
|
|
396
|
+
else if (ts.isPropertyAccessExpression(node)) {
|
|
397
|
+
var left = this.resolveExpression(node.expression, writer);
|
|
398
|
+
if (left) {
|
|
399
|
+
return left + "." + this.resolveTypeFromString(node.name.text, writer);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else if (ts.isCallExpression(node)) {
|
|
403
|
+
var left = this.resolveExpression(node.expression, writer);
|
|
404
|
+
if (left) {
|
|
405
|
+
var args = node.arguments.map(function (a) { return _this.resolveExpression(a, writer); }).filter(function (a) { return a; });
|
|
406
|
+
return left + "(" + args.join(", ") + ")";
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else if (ts.isBinaryExpression(node)) {
|
|
410
|
+
var left = this.resolveExpression(node.left, writer);
|
|
411
|
+
var right = this.resolveExpression(node.right, writer);
|
|
412
|
+
if (left && right) {
|
|
413
|
+
return left + " " + node.operatorToken.getText() + " " + right;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
else if (ts.isPrefixUnaryExpression(node)) {
|
|
417
|
+
var operand = this.resolveExpression(node.operand, writer);
|
|
418
|
+
if (operand) {
|
|
419
|
+
return ts.tokenToString(node.operator) + operand;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
else if (ts.isPostfixUnaryExpression(node)) {
|
|
423
|
+
var operand = this.resolveExpression(node.operand, writer);
|
|
424
|
+
if (operand) {
|
|
425
|
+
return operand + node.operator;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else if (ts.isParenthesizedExpression(node)) {
|
|
429
|
+
return this.resolveExpression(node.expression, writer);
|
|
430
|
+
}
|
|
431
|
+
else if (ts.isArrayLiteralExpression(node)) {
|
|
432
|
+
var elements = node.elements.map(function (e) { return _this.resolveExpression(e, writer); }).filter(function (e) { return e; });
|
|
433
|
+
return "[" + elements.join(", ") + "]";
|
|
434
|
+
}
|
|
435
|
+
else if (ts.isObjectLiteralExpression(node)) {
|
|
436
|
+
var properties = node.properties.map(function (p) {
|
|
437
|
+
if (ts.isPropertyAssignment(p)) {
|
|
438
|
+
var name_2 = p.name.getText();
|
|
439
|
+
var value = _this.resolveExpression(p.initializer, writer);
|
|
440
|
+
if (value) {
|
|
441
|
+
return name_2 + ": " + value;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}).filter(function (p) { return p; });
|
|
445
|
+
return "{" + properties.join(", ") + "}";
|
|
446
|
+
}
|
|
447
|
+
else if (ts.isNewExpression(node)) {
|
|
448
|
+
var typeName = this.resolveTypeFromString(node.expression.getText(), writer);
|
|
449
|
+
if (typeName) {
|
|
450
|
+
console.log("TODO: new expression");
|
|
451
|
+
var args = node.arguments.map(function (a) { return _this.resolveExpression(a, writer); }).filter(function (a) { return a; });
|
|
452
|
+
// writer.writeNewTypeExpression(typeName, args);
|
|
453
|
+
// return;
|
|
454
|
+
return "new " + typeName + "(" + args.join(", ") + ")";
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
console.error("!!!!! ----- Unknown expression", ts.SyntaxKind[node.kind], node.getText());
|
|
458
|
+
};
|
|
459
|
+
return Compiler;
|
|
460
|
+
}());
|
|
461
|
+
exports.Compiler = Compiler;
|