redscript-mc 1.2.29 → 2.0.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.
Files changed (274) hide show
  1. package/.claude/commands/build-test.md +10 -0
  2. package/.claude/commands/deploy-demo.md +12 -0
  3. package/.claude/commands/stage-status.md +13 -0
  4. package/.claude/settings.json +12 -0
  5. package/.github/workflows/ci.yml +1 -0
  6. package/CLAUDE.md +231 -0
  7. package/README.md +29 -28
  8. package/README.zh.md +28 -28
  9. package/demo.gif +0 -0
  10. package/dist/cli.js +2 -554
  11. package/dist/compile.js +2 -266
  12. package/dist/index.js +2 -159
  13. package/dist/lexer/index.js +9 -1
  14. package/dist/lowering/index.js +22 -5
  15. package/dist/src/__tests__/cli.test.d.ts +1 -0
  16. package/dist/src/__tests__/cli.test.js +104 -0
  17. package/dist/src/__tests__/codegen.test.d.ts +1 -0
  18. package/dist/src/__tests__/codegen.test.js +152 -0
  19. package/dist/src/__tests__/compile-all.test.d.ts +10 -0
  20. package/dist/src/__tests__/compile-all.test.js +108 -0
  21. package/dist/src/__tests__/dce.test.d.ts +1 -0
  22. package/dist/src/__tests__/dce.test.js +102 -0
  23. package/dist/src/__tests__/diagnostics.test.d.ts +4 -0
  24. package/dist/src/__tests__/diagnostics.test.js +177 -0
  25. package/dist/src/__tests__/e2e.test.d.ts +6 -0
  26. package/dist/src/__tests__/e2e.test.js +1789 -0
  27. package/dist/src/__tests__/entity-types.test.d.ts +1 -0
  28. package/dist/src/__tests__/entity-types.test.js +203 -0
  29. package/dist/src/__tests__/formatter.test.d.ts +1 -0
  30. package/dist/src/__tests__/formatter.test.js +40 -0
  31. package/dist/src/__tests__/lexer.test.d.ts +1 -0
  32. package/dist/src/__tests__/lexer.test.js +343 -0
  33. package/dist/src/__tests__/lowering.test.d.ts +1 -0
  34. package/dist/src/__tests__/lowering.test.js +1015 -0
  35. package/dist/src/__tests__/macro.test.d.ts +8 -0
  36. package/dist/src/__tests__/macro.test.js +306 -0
  37. package/dist/src/__tests__/mc-integration.test.d.ts +12 -0
  38. package/dist/src/__tests__/mc-integration.test.js +817 -0
  39. package/dist/src/__tests__/mc-syntax.test.d.ts +1 -0
  40. package/dist/src/__tests__/mc-syntax.test.js +124 -0
  41. package/dist/src/__tests__/nbt.test.d.ts +1 -0
  42. package/dist/src/__tests__/nbt.test.js +82 -0
  43. package/dist/src/__tests__/optimizer-advanced.test.d.ts +1 -0
  44. package/dist/src/__tests__/optimizer-advanced.test.js +124 -0
  45. package/dist/src/__tests__/optimizer.test.d.ts +1 -0
  46. package/dist/src/__tests__/optimizer.test.js +149 -0
  47. package/dist/src/__tests__/parser.test.d.ts +1 -0
  48. package/dist/src/__tests__/parser.test.js +807 -0
  49. package/dist/src/__tests__/repl.test.d.ts +1 -0
  50. package/dist/src/__tests__/repl.test.js +27 -0
  51. package/dist/src/__tests__/runtime.test.d.ts +1 -0
  52. package/dist/src/__tests__/runtime.test.js +289 -0
  53. package/dist/src/__tests__/stdlib-advanced.test.d.ts +4 -0
  54. package/dist/src/__tests__/stdlib-advanced.test.js +374 -0
  55. package/dist/src/__tests__/stdlib-bigint.test.d.ts +7 -0
  56. package/dist/src/__tests__/stdlib-bigint.test.js +426 -0
  57. package/dist/src/__tests__/stdlib-math.test.d.ts +7 -0
  58. package/dist/src/__tests__/stdlib-math.test.js +351 -0
  59. package/dist/src/__tests__/stdlib-vec.test.d.ts +4 -0
  60. package/dist/src/__tests__/stdlib-vec.test.js +263 -0
  61. package/dist/src/__tests__/structure-optimizer.test.d.ts +1 -0
  62. package/dist/src/__tests__/structure-optimizer.test.js +33 -0
  63. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  64. package/dist/src/__tests__/typechecker.test.js +552 -0
  65. package/dist/src/__tests__/var-allocator.test.d.ts +1 -0
  66. package/dist/src/__tests__/var-allocator.test.js +69 -0
  67. package/dist/src/ast/types.d.ts +515 -0
  68. package/dist/src/ast/types.js +9 -0
  69. package/dist/src/builtins/metadata.d.ts +36 -0
  70. package/dist/src/builtins/metadata.js +1014 -0
  71. package/dist/src/cli.d.ts +11 -0
  72. package/dist/src/cli.js +443 -0
  73. package/dist/src/codegen/cmdblock/index.d.ts +26 -0
  74. package/dist/src/codegen/cmdblock/index.js +45 -0
  75. package/dist/src/codegen/mcfunction/index.d.ts +40 -0
  76. package/dist/src/codegen/mcfunction/index.js +606 -0
  77. package/dist/src/codegen/structure/index.d.ts +24 -0
  78. package/dist/src/codegen/structure/index.js +279 -0
  79. package/dist/src/codegen/var-allocator.d.ts +45 -0
  80. package/dist/src/codegen/var-allocator.js +104 -0
  81. package/dist/src/compile.d.ts +37 -0
  82. package/dist/src/compile.js +165 -0
  83. package/dist/src/diagnostics/index.d.ts +44 -0
  84. package/dist/src/diagnostics/index.js +140 -0
  85. package/dist/src/events/types.d.ts +35 -0
  86. package/dist/src/events/types.js +59 -0
  87. package/dist/src/formatter/index.d.ts +1 -0
  88. package/dist/src/formatter/index.js +26 -0
  89. package/dist/src/index.d.ts +22 -0
  90. package/dist/src/index.js +45 -0
  91. package/dist/src/ir/builder.d.ts +33 -0
  92. package/dist/src/ir/builder.js +99 -0
  93. package/dist/src/ir/types.d.ts +132 -0
  94. package/dist/src/ir/types.js +15 -0
  95. package/dist/src/lexer/index.d.ts +37 -0
  96. package/dist/src/lexer/index.js +569 -0
  97. package/dist/src/lowering/index.d.ts +188 -0
  98. package/dist/src/lowering/index.js +3405 -0
  99. package/dist/src/mc-test/client.d.ts +128 -0
  100. package/dist/src/mc-test/client.js +174 -0
  101. package/dist/src/mc-test/runner.d.ts +28 -0
  102. package/dist/src/mc-test/runner.js +151 -0
  103. package/dist/src/mc-test/setup.d.ts +11 -0
  104. package/dist/src/mc-test/setup.js +98 -0
  105. package/dist/src/mc-validator/index.d.ts +17 -0
  106. package/dist/src/mc-validator/index.js +322 -0
  107. package/dist/src/nbt/index.d.ts +86 -0
  108. package/dist/src/nbt/index.js +250 -0
  109. package/dist/src/optimizer/commands.d.ts +38 -0
  110. package/dist/src/optimizer/commands.js +451 -0
  111. package/dist/src/optimizer/dce.d.ts +34 -0
  112. package/dist/src/optimizer/dce.js +639 -0
  113. package/dist/src/optimizer/passes.d.ts +34 -0
  114. package/dist/src/optimizer/passes.js +243 -0
  115. package/dist/src/optimizer/structure.d.ts +9 -0
  116. package/dist/src/optimizer/structure.js +356 -0
  117. package/dist/src/parser/index.d.ts +93 -0
  118. package/dist/src/parser/index.js +1687 -0
  119. package/dist/src/repl.d.ts +16 -0
  120. package/dist/src/repl.js +165 -0
  121. package/dist/src/runtime/index.d.ts +107 -0
  122. package/dist/src/runtime/index.js +1409 -0
  123. package/dist/src/typechecker/index.d.ts +61 -0
  124. package/dist/src/typechecker/index.js +1034 -0
  125. package/dist/src/types/entity-hierarchy.d.ts +29 -0
  126. package/dist/src/types/entity-hierarchy.js +107 -0
  127. package/dist/src2/__tests__/e2e/basic.test.d.ts +8 -0
  128. package/dist/src2/__tests__/e2e/basic.test.js +140 -0
  129. package/dist/src2/__tests__/e2e/macros.test.d.ts +9 -0
  130. package/dist/src2/__tests__/e2e/macros.test.js +182 -0
  131. package/dist/src2/__tests__/e2e/migrate.test.d.ts +13 -0
  132. package/dist/src2/__tests__/e2e/migrate.test.js +2739 -0
  133. package/dist/src2/__tests__/hir/desugar.test.d.ts +1 -0
  134. package/dist/src2/__tests__/hir/desugar.test.js +234 -0
  135. package/dist/src2/__tests__/lir/lower.test.d.ts +1 -0
  136. package/dist/src2/__tests__/lir/lower.test.js +559 -0
  137. package/dist/src2/__tests__/lir/types.test.d.ts +1 -0
  138. package/dist/src2/__tests__/lir/types.test.js +185 -0
  139. package/dist/src2/__tests__/lir/verify.test.d.ts +1 -0
  140. package/dist/src2/__tests__/lir/verify.test.js +221 -0
  141. package/dist/src2/__tests__/mir/arithmetic.test.d.ts +1 -0
  142. package/dist/src2/__tests__/mir/arithmetic.test.js +130 -0
  143. package/dist/src2/__tests__/mir/control-flow.test.d.ts +1 -0
  144. package/dist/src2/__tests__/mir/control-flow.test.js +205 -0
  145. package/dist/src2/__tests__/mir/verify.test.d.ts +1 -0
  146. package/dist/src2/__tests__/mir/verify.test.js +223 -0
  147. package/dist/src2/__tests__/optimizer/block_merge.test.d.ts +1 -0
  148. package/dist/src2/__tests__/optimizer/block_merge.test.js +78 -0
  149. package/dist/src2/__tests__/optimizer/branch_simplify.test.d.ts +1 -0
  150. package/dist/src2/__tests__/optimizer/branch_simplify.test.js +58 -0
  151. package/dist/src2/__tests__/optimizer/constant_fold.test.d.ts +1 -0
  152. package/dist/src2/__tests__/optimizer/constant_fold.test.js +131 -0
  153. package/dist/src2/__tests__/optimizer/copy_prop.test.d.ts +1 -0
  154. package/dist/src2/__tests__/optimizer/copy_prop.test.js +91 -0
  155. package/dist/src2/__tests__/optimizer/dce.test.d.ts +1 -0
  156. package/dist/src2/__tests__/optimizer/dce.test.js +76 -0
  157. package/dist/src2/__tests__/optimizer/pipeline.test.d.ts +1 -0
  158. package/dist/src2/__tests__/optimizer/pipeline.test.js +102 -0
  159. package/dist/src2/emit/compile.d.ts +19 -0
  160. package/dist/src2/emit/compile.js +80 -0
  161. package/dist/src2/emit/index.d.ts +17 -0
  162. package/dist/src2/emit/index.js +172 -0
  163. package/dist/src2/hir/lower.d.ts +15 -0
  164. package/dist/src2/hir/lower.js +378 -0
  165. package/dist/src2/hir/types.d.ts +373 -0
  166. package/dist/src2/hir/types.js +16 -0
  167. package/dist/src2/lir/lower.d.ts +15 -0
  168. package/dist/src2/lir/lower.js +453 -0
  169. package/dist/src2/lir/types.d.ts +136 -0
  170. package/dist/src2/lir/types.js +11 -0
  171. package/dist/src2/lir/verify.d.ts +14 -0
  172. package/dist/src2/lir/verify.js +113 -0
  173. package/dist/src2/mir/lower.d.ts +9 -0
  174. package/dist/src2/mir/lower.js +1030 -0
  175. package/dist/src2/mir/macro.d.ts +22 -0
  176. package/dist/src2/mir/macro.js +168 -0
  177. package/dist/src2/mir/types.d.ts +183 -0
  178. package/dist/src2/mir/types.js +11 -0
  179. package/dist/src2/mir/verify.d.ts +16 -0
  180. package/dist/src2/mir/verify.js +216 -0
  181. package/dist/src2/optimizer/block_merge.d.ts +12 -0
  182. package/dist/src2/optimizer/block_merge.js +84 -0
  183. package/dist/src2/optimizer/branch_simplify.d.ts +9 -0
  184. package/dist/src2/optimizer/branch_simplify.js +28 -0
  185. package/dist/src2/optimizer/constant_fold.d.ts +10 -0
  186. package/dist/src2/optimizer/constant_fold.js +85 -0
  187. package/dist/src2/optimizer/copy_prop.d.ts +9 -0
  188. package/dist/src2/optimizer/copy_prop.js +113 -0
  189. package/dist/src2/optimizer/dce.d.ts +8 -0
  190. package/dist/src2/optimizer/dce.js +155 -0
  191. package/dist/src2/optimizer/pipeline.d.ts +10 -0
  192. package/dist/src2/optimizer/pipeline.js +42 -0
  193. package/dist/tsconfig.tsbuildinfo +1 -0
  194. package/docs/compiler-pipeline-redesign.md +2243 -0
  195. package/docs/optimization-ideas.md +1076 -0
  196. package/editors/vscode/package-lock.json +3 -3
  197. package/editors/vscode/package.json +1 -1
  198. package/examples/readme-demo.mcrs +44 -66
  199. package/jest.config.js +1 -1
  200. package/package.json +6 -5
  201. package/scripts/postbuild.js +15 -0
  202. package/src/__tests__/cli.test.ts +8 -220
  203. package/src/__tests__/dce.test.ts +11 -56
  204. package/src/__tests__/diagnostics.test.ts +59 -38
  205. package/src/__tests__/mc-integration.test.ts +1 -2
  206. package/src/ast/types.ts +6 -1
  207. package/src/cli.ts +29 -156
  208. package/src/compile.ts +6 -162
  209. package/src/index.ts +14 -178
  210. package/src/lexer/index.ts +9 -1
  211. package/src/mc-test/runner.ts +4 -3
  212. package/src/parser/index.ts +1 -1
  213. package/src/repl.ts +1 -1
  214. package/src/runtime/index.ts +1 -1
  215. package/src2/__tests__/e2e/basic.test.ts +154 -0
  216. package/src2/__tests__/e2e/macros.test.ts +199 -0
  217. package/src2/__tests__/e2e/migrate.test.ts +3008 -0
  218. package/src2/__tests__/hir/desugar.test.ts +263 -0
  219. package/src2/__tests__/lir/lower.test.ts +619 -0
  220. package/src2/__tests__/lir/types.test.ts +207 -0
  221. package/src2/__tests__/lir/verify.test.ts +249 -0
  222. package/src2/__tests__/mir/arithmetic.test.ts +156 -0
  223. package/src2/__tests__/mir/control-flow.test.ts +242 -0
  224. package/src2/__tests__/mir/verify.test.ts +254 -0
  225. package/src2/__tests__/optimizer/block_merge.test.ts +84 -0
  226. package/src2/__tests__/optimizer/branch_simplify.test.ts +64 -0
  227. package/src2/__tests__/optimizer/constant_fold.test.ts +145 -0
  228. package/src2/__tests__/optimizer/copy_prop.test.ts +99 -0
  229. package/src2/__tests__/optimizer/dce.test.ts +83 -0
  230. package/src2/__tests__/optimizer/pipeline.test.ts +116 -0
  231. package/src2/emit/compile.ts +99 -0
  232. package/src2/emit/index.ts +222 -0
  233. package/src2/hir/lower.ts +428 -0
  234. package/src2/hir/types.ts +216 -0
  235. package/src2/lir/lower.ts +556 -0
  236. package/src2/lir/types.ts +109 -0
  237. package/src2/lir/verify.ts +129 -0
  238. package/src2/mir/lower.ts +1160 -0
  239. package/src2/mir/macro.ts +167 -0
  240. package/src2/mir/types.ts +106 -0
  241. package/src2/mir/verify.ts +218 -0
  242. package/src2/optimizer/block_merge.ts +93 -0
  243. package/src2/optimizer/branch_simplify.ts +27 -0
  244. package/src2/optimizer/constant_fold.ts +88 -0
  245. package/src2/optimizer/copy_prop.ts +106 -0
  246. package/src2/optimizer/dce.ts +133 -0
  247. package/src2/optimizer/pipeline.ts +44 -0
  248. package/tsconfig.json +2 -2
  249. package/src/__tests__/codegen.test.ts +0 -161
  250. package/src/__tests__/e2e.test.ts +0 -2039
  251. package/src/__tests__/entity-types.test.ts +0 -236
  252. package/src/__tests__/lowering.test.ts +0 -1185
  253. package/src/__tests__/macro.test.ts +0 -343
  254. package/src/__tests__/nbt.test.ts +0 -58
  255. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  256. package/src/__tests__/optimizer.test.ts +0 -162
  257. package/src/__tests__/runtime.test.ts +0 -305
  258. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  259. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  260. package/src/__tests__/stdlib-math.test.ts +0 -374
  261. package/src/__tests__/stdlib-vec.test.ts +0 -259
  262. package/src/__tests__/structure-optimizer.test.ts +0 -38
  263. package/src/__tests__/var-allocator.test.ts +0 -75
  264. package/src/codegen/cmdblock/index.ts +0 -63
  265. package/src/codegen/mcfunction/index.ts +0 -662
  266. package/src/codegen/structure/index.ts +0 -346
  267. package/src/codegen/var-allocator.ts +0 -104
  268. package/src/ir/builder.ts +0 -116
  269. package/src/ir/types.ts +0 -134
  270. package/src/lowering/index.ts +0 -3860
  271. package/src/optimizer/commands.ts +0 -534
  272. package/src/optimizer/dce.ts +0 -679
  273. package/src/optimizer/passes.ts +0 -250
  274. package/src/optimizer/structure.ts +0 -450
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript Diagnostics
4
+ *
5
+ * Error reporting with file path, line, column, and formatted error messages.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DiagnosticCollector = exports.DiagnosticError = void 0;
9
+ exports.parseErrorMessage = parseErrorMessage;
10
+ exports.formatError = formatError;
11
+ function formatSourcePointer(sourceLines, line, col) {
12
+ const lineIdx = line - 1;
13
+ if (lineIdx < 0 || lineIdx >= sourceLines.length) {
14
+ return [];
15
+ }
16
+ const sourceLine = sourceLines[lineIdx];
17
+ const safeCol = Math.max(1, Math.min(col, sourceLine.length + 1));
18
+ const pointer = ` ${' '.repeat(safeCol - 1)}^`;
19
+ return [` ${sourceLine}`, pointer];
20
+ }
21
+ class DiagnosticError extends Error {
22
+ constructor(kind, message, location, sourceLines) {
23
+ super(message);
24
+ this.name = 'DiagnosticError';
25
+ this.kind = kind;
26
+ this.location = location;
27
+ this.sourceLines = sourceLines;
28
+ }
29
+ /**
30
+ * Format the error for display:
31
+ * ```
32
+ * Error: [ParseError] line 5, col 12: Expected ';' after statement
33
+ * 5 | let x = 42
34
+ * ^ expected ';'
35
+ * ```
36
+ */
37
+ format() {
38
+ const { kind, message, location, sourceLines } = this;
39
+ const filePart = location.file ? `${location.file}:` : '';
40
+ const header = `Error: [${kind}] ${filePart}line ${location.line}, col ${location.col}: ${message}`;
41
+ if (!sourceLines || sourceLines.length === 0) {
42
+ return header;
43
+ }
44
+ const pointerLines = formatSourcePointer(sourceLines, location.line, location.col);
45
+ if (pointerLines.length === 0) {
46
+ return header;
47
+ }
48
+ const lineNum = String(location.line).padStart(3);
49
+ const prefix = `${lineNum} | `;
50
+ const sourceLine = sourceLines[location.line - 1];
51
+ const safeCol = Math.max(1, Math.min(location.col, sourceLine.length + 1));
52
+ const pointer = ' '.repeat(prefix.length + safeCol - 1) + '^';
53
+ const hint = message.toLowerCase().includes('expected')
54
+ ? message.split(':').pop()?.trim() || ''
55
+ : '';
56
+ return [
57
+ header,
58
+ `${prefix}${sourceLine}`,
59
+ `${pointer}${hint ? ` ${hint}` : ''}`,
60
+ ].join('\n');
61
+ }
62
+ toString() {
63
+ return this.format();
64
+ }
65
+ }
66
+ exports.DiagnosticError = DiagnosticError;
67
+ // ---------------------------------------------------------------------------
68
+ // Diagnostic Collection
69
+ // ---------------------------------------------------------------------------
70
+ class DiagnosticCollector {
71
+ constructor(source, filePath) {
72
+ this.diagnostics = [];
73
+ this.sourceLines = [];
74
+ if (source) {
75
+ this.sourceLines = source.split('\n');
76
+ }
77
+ this.filePath = filePath;
78
+ }
79
+ error(kind, message, line, col) {
80
+ const diagnostic = new DiagnosticError(kind, message, { file: this.filePath, line, col }, this.sourceLines);
81
+ this.diagnostics.push(diagnostic);
82
+ }
83
+ hasErrors() {
84
+ return this.diagnostics.length > 0;
85
+ }
86
+ getErrors() {
87
+ return this.diagnostics;
88
+ }
89
+ formatAll() {
90
+ return this.diagnostics.map(d => d.format()).join('\n\n');
91
+ }
92
+ throwFirst() {
93
+ if (this.diagnostics.length > 0) {
94
+ throw this.diagnostics[0];
95
+ }
96
+ throw new Error('No diagnostics to throw');
97
+ }
98
+ }
99
+ exports.DiagnosticCollector = DiagnosticCollector;
100
+ // ---------------------------------------------------------------------------
101
+ // Helper Functions
102
+ // ---------------------------------------------------------------------------
103
+ /**
104
+ * Create a DiagnosticError from a raw error message that includes line/col info
105
+ * e.g., "Expected ';' at line 5, col 12"
106
+ */
107
+ function parseErrorMessage(kind, rawMessage, sourceLines, filePath) {
108
+ // Try to extract line and col from message
109
+ const match = rawMessage.match(/at line (\d+), col (\d+)/);
110
+ if (match) {
111
+ const line = parseInt(match[1], 10);
112
+ const col = parseInt(match[2], 10);
113
+ const message = rawMessage.replace(/ at line \d+, col \d+$/, '').trim();
114
+ return new DiagnosticError(kind, message, { file: filePath, line, col }, sourceLines);
115
+ }
116
+ // Fallback: line 1, col 1
117
+ return new DiagnosticError(kind, rawMessage, { file: filePath, line: 1, col: 1 }, sourceLines);
118
+ }
119
+ function formatError(error, source) {
120
+ if (error instanceof DiagnosticError) {
121
+ const sourceLines = source?.split('\n') ?? error.sourceLines ?? [];
122
+ const { file, line, col } = error.location;
123
+ const locationPart = file
124
+ ? ` in ${file} at line ${line}, col ${col}`
125
+ : ` at line ${line}, col ${col}`;
126
+ const lines = [`Error${locationPart}:`];
127
+ const pointerLines = formatSourcePointer(sourceLines, line, col);
128
+ if (pointerLines.length > 0) {
129
+ lines.push(...pointerLines);
130
+ }
131
+ lines.push(error.message);
132
+ return lines.join('\n');
133
+ }
134
+ if (!source) {
135
+ return error.message;
136
+ }
137
+ const parsed = parseErrorMessage('ParseError', error.message, source.split('\n'));
138
+ return formatError(parsed, source);
139
+ }
140
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,35 @@
1
+ import type { TypeNode } from '../ast/types';
2
+ export declare const EVENT_TYPES: {
3
+ readonly PlayerDeath: {
4
+ readonly tag: "rs.just_died";
5
+ readonly params: readonly ["player: Player"];
6
+ readonly detection: "scoreboard";
7
+ };
8
+ readonly PlayerJoin: {
9
+ readonly tag: "rs.just_joined";
10
+ readonly params: readonly ["player: Player"];
11
+ readonly detection: "tag";
12
+ };
13
+ readonly BlockBreak: {
14
+ readonly tag: "rs.just_broke_block";
15
+ readonly params: readonly ["player: Player", "block: string"];
16
+ readonly detection: "advancement";
17
+ };
18
+ readonly EntityKill: {
19
+ readonly tag: "rs.just_killed";
20
+ readonly params: readonly ["player: Player"];
21
+ readonly detection: "scoreboard";
22
+ };
23
+ readonly ItemUse: {
24
+ readonly tag: "rs.just_used_item";
25
+ readonly params: readonly ["player: Player"];
26
+ readonly detection: "scoreboard";
27
+ };
28
+ };
29
+ export type EventTypeName = keyof typeof EVENT_TYPES;
30
+ export interface EventParamSpec {
31
+ name: string;
32
+ type: TypeNode;
33
+ }
34
+ export declare function isEventTypeName(value: string): value is EventTypeName;
35
+ export declare function getEventParamSpecs(eventType: EventTypeName): EventParamSpec[];
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EVENT_TYPES = void 0;
4
+ exports.isEventTypeName = isEventTypeName;
5
+ exports.getEventParamSpecs = getEventParamSpecs;
6
+ exports.EVENT_TYPES = {
7
+ PlayerDeath: {
8
+ tag: 'rs.just_died',
9
+ params: ['player: Player'],
10
+ detection: 'scoreboard',
11
+ },
12
+ PlayerJoin: {
13
+ tag: 'rs.just_joined',
14
+ params: ['player: Player'],
15
+ detection: 'tag',
16
+ },
17
+ BlockBreak: {
18
+ tag: 'rs.just_broke_block',
19
+ params: ['player: Player', 'block: string'],
20
+ detection: 'advancement',
21
+ },
22
+ EntityKill: {
23
+ tag: 'rs.just_killed',
24
+ params: ['player: Player'],
25
+ detection: 'scoreboard',
26
+ },
27
+ ItemUse: {
28
+ tag: 'rs.just_used_item',
29
+ params: ['player: Player'],
30
+ detection: 'scoreboard',
31
+ },
32
+ };
33
+ function isEventTypeName(value) {
34
+ return value in exports.EVENT_TYPES;
35
+ }
36
+ function getEventParamSpecs(eventType) {
37
+ return exports.EVENT_TYPES[eventType].params.map(parseEventParam);
38
+ }
39
+ function parseEventParam(spec) {
40
+ const match = spec.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*:\s*([A-Za-z_][A-Za-z0-9_]*)$/);
41
+ if (!match) {
42
+ throw new Error(`Invalid event parameter spec: ${spec}`);
43
+ }
44
+ const [, name, typeName] = match;
45
+ return {
46
+ name,
47
+ type: toTypeNode(typeName),
48
+ };
49
+ }
50
+ function toTypeNode(typeName) {
51
+ if (typeName === 'Player') {
52
+ return { kind: 'entity', entityType: 'Player' };
53
+ }
54
+ if (typeName === 'string' || typeName === 'int' || typeName === 'bool' || typeName === 'float' || typeName === 'void' || typeName === 'BlockPos' || typeName === 'byte' || typeName === 'short' || typeName === 'long' || typeName === 'double') {
55
+ return { kind: 'named', name: typeName };
56
+ }
57
+ return { kind: 'struct', name: typeName };
58
+ }
59
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ export declare function format(source: string): string;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.format = format;
4
+ function format(source) {
5
+ const lines = source.split("\n");
6
+ let indent = 0;
7
+ const result = [];
8
+ for (let line of lines) {
9
+ line = line.trim();
10
+ if (!line) {
11
+ result.push("");
12
+ continue;
13
+ }
14
+ // Decrease indent before }
15
+ if (line.startsWith("}"))
16
+ indent = Math.max(0, indent - 1);
17
+ // Add indentation
18
+ result.push(" ".repeat(indent) + line);
19
+ // Increase indent after {
20
+ if (line.endsWith("{"))
21
+ indent++;
22
+ }
23
+ // Ensure single newline at end
24
+ return result.join("\n").trimEnd() + "\n";
25
+ }
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * RedScript Compiler
3
+ *
4
+ * Main entry point for programmatic usage.
5
+ */
6
+ export declare const version = "2.0.0";
7
+ export { compile, CompileOptions, CompileResult } from '../src2/emit/compile';
8
+ export type { DatapackFile } from '../src2/emit/index';
9
+ export { Lexer } from './lexer';
10
+ export { Parser } from './parser';
11
+ export { preprocessSource, preprocessSourceWithMetadata } from './compile';
12
+ export { MCCommandValidator } from './mc-validator';
13
+ export type { Program, FnDecl, Expr, Stmt, Span } from './ast/types';
14
+ export type { DiagnosticError } from './diagnostics';
15
+ /**
16
+ * Check RedScript source code for errors without generating output.
17
+ *
18
+ * @param source - The RedScript source code
19
+ * @param namespace - Optional namespace
20
+ * @returns null if no errors, or an error object
21
+ */
22
+ export declare function check(source: string, namespace?: string, filePath?: string): Error | null;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript Compiler
4
+ *
5
+ * Main entry point for programmatic usage.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.MCCommandValidator = exports.preprocessSourceWithMetadata = exports.preprocessSource = exports.Parser = exports.Lexer = exports.compile = exports.version = void 0;
9
+ exports.check = check;
10
+ exports.version = '2.0.0';
11
+ const lexer_1 = require("./lexer");
12
+ const parser_1 = require("./parser");
13
+ const compile_1 = require("./compile");
14
+ // Re-export v2 compile API
15
+ var compile_2 = require("../src2/emit/compile");
16
+ Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_2.compile; } });
17
+ // Re-export utilities
18
+ var lexer_2 = require("./lexer");
19
+ Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_2.Lexer; } });
20
+ var parser_2 = require("./parser");
21
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_2.Parser; } });
22
+ var compile_3 = require("./compile");
23
+ Object.defineProperty(exports, "preprocessSource", { enumerable: true, get: function () { return compile_3.preprocessSource; } });
24
+ Object.defineProperty(exports, "preprocessSourceWithMetadata", { enumerable: true, get: function () { return compile_3.preprocessSourceWithMetadata; } });
25
+ var mc_validator_1 = require("./mc-validator");
26
+ Object.defineProperty(exports, "MCCommandValidator", { enumerable: true, get: function () { return mc_validator_1.MCCommandValidator; } });
27
+ /**
28
+ * Check RedScript source code for errors without generating output.
29
+ *
30
+ * @param source - The RedScript source code
31
+ * @param namespace - Optional namespace
32
+ * @returns null if no errors, or an error object
33
+ */
34
+ function check(source, namespace = 'redscript', filePath) {
35
+ try {
36
+ const preprocessedSource = (0, compile_1.preprocessSource)(source, { filePath });
37
+ const tokens = new lexer_1.Lexer(preprocessedSource, filePath).tokenize();
38
+ new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
39
+ return null;
40
+ }
41
+ catch (err) {
42
+ return err;
43
+ }
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,33 @@
1
+ /**
2
+ * IRBuilder — helper for constructing IR programmatically.
3
+ * AST → IR lowering uses this.
4
+ */
5
+ import type { IRFunction, IRInstr, IRModule, Operand } from './types';
6
+ export declare class IRBuilder {
7
+ private tempCount;
8
+ private labelCount;
9
+ private currentBlock;
10
+ private blocks;
11
+ private locals;
12
+ freshTemp(): string;
13
+ freshLabel(hint?: string): string;
14
+ startBlock(label: string): void;
15
+ private get block();
16
+ private sealBlock;
17
+ emitAssign(dst: string, src: Operand): void;
18
+ emitBinop(dst: string, lhs: Operand, bop: IRInstr & {
19
+ op: 'binop';
20
+ } extends {
21
+ bop: infer B;
22
+ } ? B : never, rhs: Operand): void;
23
+ emitCmp(dst: string, lhs: Operand, cop: '==' | '!=' | '<' | '<=' | '>' | '>=', rhs: Operand): void;
24
+ emitCall(fn: string, args: Operand[], dst?: string): void;
25
+ emitRaw(cmd: string): void;
26
+ emitJump(target: string): void;
27
+ emitJumpIf(cond: string, then: string, else_: string): void;
28
+ emitReturn(value?: Operand): void;
29
+ emitTickYield(continuation: string): void;
30
+ build(name: string, params: string[], isTickLoop?: boolean): IRFunction;
31
+ }
32
+ import type { GlobalVar } from './types';
33
+ export declare function buildModule(namespace: string, fns: IRFunction[], globals?: GlobalVar[]): IRModule;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * IRBuilder — helper for constructing IR programmatically.
4
+ * AST → IR lowering uses this.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.IRBuilder = void 0;
8
+ exports.buildModule = buildModule;
9
+ class IRBuilder {
10
+ constructor() {
11
+ this.tempCount = 0;
12
+ this.labelCount = 0;
13
+ this.currentBlock = null;
14
+ this.blocks = [];
15
+ this.locals = new Set();
16
+ }
17
+ // -------------------------------------------------------------------------
18
+ // Names
19
+ // -------------------------------------------------------------------------
20
+ freshTemp() {
21
+ const name = `$t${this.tempCount++}`;
22
+ this.locals.add(name);
23
+ return name;
24
+ }
25
+ freshLabel(hint = 'L') {
26
+ return `${hint}_${this.labelCount++}`;
27
+ }
28
+ // -------------------------------------------------------------------------
29
+ // Block management
30
+ // -------------------------------------------------------------------------
31
+ startBlock(label) {
32
+ this.currentBlock = { label, instrs: [], term: { op: 'return' } };
33
+ }
34
+ get block() {
35
+ if (!this.currentBlock)
36
+ throw new Error('No active block');
37
+ return this.currentBlock;
38
+ }
39
+ sealBlock(term) {
40
+ this.block.term = term;
41
+ this.blocks.push(this.block);
42
+ this.currentBlock = null;
43
+ }
44
+ // -------------------------------------------------------------------------
45
+ // Emit instructions
46
+ // -------------------------------------------------------------------------
47
+ emitAssign(dst, src) {
48
+ this.locals.add(dst);
49
+ this.block.instrs.push({ op: 'assign', dst, src });
50
+ }
51
+ emitBinop(dst, lhs, bop, rhs) {
52
+ this.locals.add(dst);
53
+ this.block.instrs.push({ op: 'binop', dst, lhs, bop, rhs });
54
+ }
55
+ emitCmp(dst, lhs, cop, rhs) {
56
+ this.locals.add(dst);
57
+ this.block.instrs.push({ op: 'cmp', dst, lhs, cop, rhs });
58
+ }
59
+ emitCall(fn, args, dst) {
60
+ if (dst)
61
+ this.locals.add(dst);
62
+ this.block.instrs.push({ op: 'call', fn, args, dst });
63
+ }
64
+ emitRaw(cmd) {
65
+ this.block.instrs.push({ op: 'raw', cmd });
66
+ }
67
+ // -------------------------------------------------------------------------
68
+ // Terminators
69
+ // -------------------------------------------------------------------------
70
+ emitJump(target) {
71
+ this.sealBlock({ op: 'jump', target });
72
+ }
73
+ emitJumpIf(cond, then, else_) {
74
+ this.sealBlock({ op: 'jump_if', cond, then, else_ });
75
+ }
76
+ emitReturn(value) {
77
+ this.sealBlock({ op: 'return', value });
78
+ }
79
+ emitTickYield(continuation) {
80
+ this.sealBlock({ op: 'tick_yield', continuation });
81
+ }
82
+ // -------------------------------------------------------------------------
83
+ // Build
84
+ // -------------------------------------------------------------------------
85
+ build(name, params, isTickLoop = false) {
86
+ return {
87
+ name,
88
+ params,
89
+ locals: Array.from(this.locals),
90
+ blocks: this.blocks,
91
+ isTickLoop,
92
+ };
93
+ }
94
+ }
95
+ exports.IRBuilder = IRBuilder;
96
+ function buildModule(namespace, fns, globals = []) {
97
+ return { namespace, functions: fns, globals };
98
+ }
99
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1,132 @@
1
+ /**
2
+ * RedScript IR — Three-Address Code (TAC)
3
+ *
4
+ * Compilation pipeline:
5
+ * Source → AST → IR → (optimize) → CodeGen → mcfunction / cmdblock
6
+ *
7
+ * Variable storage in MC Java Edition:
8
+ * - Integer vars → scoreboard fake player ($name on objective "rs_vars")
9
+ * - Complex data → NBT storage (redscript:stack / redscript:heap)
10
+ * - Return value → fake player $ret
11
+ * - Temporaries → $_0, $_1, ...
12
+ */
13
+ export type Operand = {
14
+ kind: 'var';
15
+ name: string;
16
+ } | {
17
+ kind: 'const';
18
+ value: number;
19
+ } | {
20
+ kind: 'storage';
21
+ path: string;
22
+ } | {
23
+ kind: 'param';
24
+ index: number;
25
+ };
26
+ export type BinOp = '+' | '-' | '*' | '/' | '%';
27
+ export type CmpOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
28
+ export type IRInstr = {
29
+ op: 'assign';
30
+ dst: string;
31
+ src: Operand;
32
+ } | {
33
+ op: 'binop';
34
+ dst: string;
35
+ lhs: Operand;
36
+ bop: BinOp;
37
+ rhs: Operand;
38
+ } | {
39
+ op: 'cmp';
40
+ dst: string;
41
+ lhs: Operand;
42
+ cop: CmpOp;
43
+ rhs: Operand;
44
+ } | {
45
+ op: 'jump';
46
+ target: string;
47
+ } | {
48
+ op: 'jump_if';
49
+ cond: string;
50
+ target: string;
51
+ } | {
52
+ op: 'jump_unless';
53
+ cond: string;
54
+ target: string;
55
+ } | {
56
+ op: 'call';
57
+ fn: string;
58
+ args: Operand[];
59
+ dst?: string;
60
+ } | {
61
+ op: 'return';
62
+ value?: Operand;
63
+ } | {
64
+ op: 'label';
65
+ id: string;
66
+ } | {
67
+ op: 'raw';
68
+ cmd: string;
69
+ } | {
70
+ op: 'tick_yield';
71
+ };
72
+ export type Terminator = {
73
+ op: 'jump';
74
+ target: string;
75
+ } | {
76
+ op: 'jump_if';
77
+ cond: string;
78
+ then: string;
79
+ else_: string;
80
+ } | {
81
+ op: 'jump_unless';
82
+ cond: string;
83
+ then: string;
84
+ else_: string;
85
+ } | {
86
+ op: 'return';
87
+ value?: Operand;
88
+ } | {
89
+ op: 'tick_yield';
90
+ continuation: string;
91
+ };
92
+ export interface IRBlock {
93
+ label: string;
94
+ instrs: IRInstr[];
95
+ term: Terminator;
96
+ }
97
+ export interface IRCommand {
98
+ cmd: string;
99
+ conditional?: boolean;
100
+ label?: string;
101
+ }
102
+ export interface IRFunction {
103
+ name: string;
104
+ params: string[];
105
+ locals: string[];
106
+ blocks: IRBlock[];
107
+ commands?: IRCommand[];
108
+ isTickLoop?: boolean;
109
+ isLoadInit?: boolean;
110
+ requiredLoads?: string[];
111
+ isTriggerHandler?: boolean;
112
+ triggerName?: string;
113
+ eventTrigger?: {
114
+ kind: 'advancement' | 'craft' | 'death' | 'login' | 'join_team';
115
+ value?: string;
116
+ };
117
+ eventHandler?: {
118
+ eventType: string;
119
+ tag: string;
120
+ };
121
+ isMacroFunction?: boolean;
122
+ macroParamNames?: string[];
123
+ }
124
+ export interface GlobalVar {
125
+ name: string;
126
+ init: number;
127
+ }
128
+ export interface IRModule {
129
+ namespace: string;
130
+ functions: IRFunction[];
131
+ globals: GlobalVar[];
132
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /**
3
+ * RedScript IR — Three-Address Code (TAC)
4
+ *
5
+ * Compilation pipeline:
6
+ * Source → AST → IR → (optimize) → CodeGen → mcfunction / cmdblock
7
+ *
8
+ * Variable storage in MC Java Edition:
9
+ * - Integer vars → scoreboard fake player ($name on objective "rs_vars")
10
+ * - Complex data → NBT storage (redscript:stack / redscript:heap)
11
+ * - Return value → fake player $ret
12
+ * - Temporaries → $_0, $_1, ...
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * RedScript Lexer
3
+ *
4
+ * Tokenizes RedScript source code into a stream of tokens.
5
+ * Handles special cases like entity selectors vs decorators,
6
+ * range literals, and raw commands.
7
+ */
8
+ export type TokenKind = 'fn' | 'let' | 'const' | 'if' | 'else' | 'while' | 'for' | 'foreach' | 'match' | 'return' | 'break' | 'continue' | 'as' | 'at' | 'in' | 'is' | 'struct' | 'impl' | 'enum' | 'trigger' | 'namespace' | 'module' | 'execute' | 'run' | 'unless' | 'declare' | 'int' | 'bool' | 'float' | 'string' | 'void' | 'BlockPos' | 'true' | 'false' | 'selector' | 'decorator' | 'int_lit' | 'float_lit' | 'byte_lit' | 'short_lit' | 'long_lit' | 'double_lit' | 'string_lit' | 'f_string' | 'range_lit' | 'rel_coord' | 'local_coord' | '+' | '-' | '*' | '/' | '%' | '~' | '^' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '&&' | '||' | '!' | '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '{' | '}' | '(' | ')' | '[' | ']' | ',' | ';' | ':' | '::' | '->' | '=>' | '.' | 'ident' | 'mc_name' | 'raw_cmd' | 'eof';
9
+ export interface Token {
10
+ kind: TokenKind;
11
+ value: string;
12
+ line: number;
13
+ col: number;
14
+ }
15
+ export declare class Lexer {
16
+ private source;
17
+ private sourceLines;
18
+ private pos;
19
+ private line;
20
+ private col;
21
+ private tokens;
22
+ private filePath?;
23
+ constructor(source: string, filePath?: string);
24
+ private error;
25
+ tokenize(): Token[];
26
+ private isAtEnd;
27
+ private peek;
28
+ private advance;
29
+ private addToken;
30
+ private scanToken;
31
+ private scanAtToken;
32
+ private scanSelectorParams;
33
+ private scanString;
34
+ private scanFString;
35
+ private scanNumber;
36
+ private scanIdentifier;
37
+ }