freelang-v4 4.3.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 (261) hide show
  1. package/README.md +548 -0
  2. package/dist/ast.d.ts +367 -0
  3. package/dist/ast.js +4 -0
  4. package/dist/ast.js.map +1 -0
  5. package/dist/async-basic.test.d.ts +1 -0
  6. package/dist/async-basic.test.js +88 -0
  7. package/dist/async-basic.test.js.map +1 -0
  8. package/dist/async-jest.test.d.ts +1 -0
  9. package/dist/async-jest.test.js +99 -0
  10. package/dist/async-jest.test.js.map +1 -0
  11. package/dist/channel-jest.test.d.ts +1 -0
  12. package/dist/channel-jest.test.js +148 -0
  13. package/dist/channel-jest.test.js.map +1 -0
  14. package/dist/checker-jest.test.d.ts +1 -0
  15. package/dist/checker-jest.test.js +160 -0
  16. package/dist/checker-jest.test.js.map +1 -0
  17. package/dist/checker.d.ts +149 -0
  18. package/dist/checker.js +1565 -0
  19. package/dist/checker.js.map +1 -0
  20. package/dist/checker.test.d.ts +1 -0
  21. package/dist/checker.test.js +217 -0
  22. package/dist/checker.test.js.map +1 -0
  23. package/dist/compiler-jest.test.d.ts +1 -0
  24. package/dist/compiler-jest.test.js +233 -0
  25. package/dist/compiler-jest.test.js.map +1 -0
  26. package/dist/compiler.d.ts +127 -0
  27. package/dist/compiler.js +1588 -0
  28. package/dist/compiler.js.map +1 -0
  29. package/dist/compiler.test.d.ts +1 -0
  30. package/dist/compiler.test.js +313 -0
  31. package/dist/compiler.test.js.map +1 -0
  32. package/dist/db-100m-full.d.ts +5 -0
  33. package/dist/db-100m-full.js +78 -0
  34. package/dist/db-100m-full.js.map +1 -0
  35. package/dist/db-100m-no-index.d.ts +12 -0
  36. package/dist/db-100m-no-index.js +119 -0
  37. package/dist/db-100m-no-index.js.map +1 -0
  38. package/dist/db-100m-real.d.ts +5 -0
  39. package/dist/db-100m-real.js +131 -0
  40. package/dist/db-100m-real.js.map +1 -0
  41. package/dist/db-100m-streaming.d.ts +15 -0
  42. package/dist/db-100m-streaming.js +164 -0
  43. package/dist/db-100m-streaming.js.map +1 -0
  44. package/dist/db-100m-test.d.ts +5 -0
  45. package/dist/db-100m-test.js +111 -0
  46. package/dist/db-100m-test.js.map +1 -0
  47. package/dist/db-jest.test.d.ts +1 -0
  48. package/dist/db-jest.test.js +182 -0
  49. package/dist/db-jest.test.js.map +1 -0
  50. package/dist/db-runtime.d.ts +24 -0
  51. package/dist/db-runtime.js +204 -0
  52. package/dist/db-runtime.js.map +1 -0
  53. package/dist/db.d.ts +249 -0
  54. package/dist/db.js +593 -0
  55. package/dist/db.js.map +1 -0
  56. package/dist/file-io-jest.test.d.ts +1 -0
  57. package/dist/file-io-jest.test.js +225 -0
  58. package/dist/file-io-jest.test.js.map +1 -0
  59. package/dist/for-of-jest.test.d.ts +1 -0
  60. package/dist/for-of-jest.test.js +230 -0
  61. package/dist/for-of-jest.test.js.map +1 -0
  62. package/dist/for-of.test.d.ts +1 -0
  63. package/dist/for-of.test.js +305 -0
  64. package/dist/for-of.test.js.map +1 -0
  65. package/dist/function-literal-jest.test.d.ts +1 -0
  66. package/dist/function-literal-jest.test.js +180 -0
  67. package/dist/function-literal-jest.test.js.map +1 -0
  68. package/dist/function-literal.test.d.ts +1 -0
  69. package/dist/function-literal.test.js +245 -0
  70. package/dist/function-literal.test.js.map +1 -0
  71. package/dist/generics-jest.test.d.ts +1 -0
  72. package/dist/generics-jest.test.js +93 -0
  73. package/dist/generics-jest.test.js.map +1 -0
  74. package/dist/ir-gen.d.ts +15 -0
  75. package/dist/ir-gen.js +400 -0
  76. package/dist/ir-gen.js.map +1 -0
  77. package/dist/ir.d.ts +114 -0
  78. package/dist/ir.js +5 -0
  79. package/dist/ir.js.map +1 -0
  80. package/dist/lexer.d.ts +110 -0
  81. package/dist/lexer.js +467 -0
  82. package/dist/lexer.js.map +1 -0
  83. package/dist/lexer.test.d.ts +1 -0
  84. package/dist/lexer.test.js +426 -0
  85. package/dist/lexer.test.js.map +1 -0
  86. package/dist/main.d.ts +2 -0
  87. package/dist/main.js +241 -0
  88. package/dist/main.js.map +1 -0
  89. package/dist/module-jest.test.d.ts +1 -0
  90. package/dist/module-jest.test.js +123 -0
  91. package/dist/module-jest.test.js.map +1 -0
  92. package/dist/parser.d.ts +56 -0
  93. package/dist/parser.js +1060 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/parser.test.d.ts +1 -0
  96. package/dist/parser.test.js +461 -0
  97. package/dist/parser.test.js.map +1 -0
  98. package/dist/pattern-matching-jest.test.d.ts +1 -0
  99. package/dist/pattern-matching-jest.test.js +158 -0
  100. package/dist/pattern-matching-jest.test.js.map +1 -0
  101. package/dist/pkg/init.d.ts +1 -0
  102. package/dist/pkg/init.js +118 -0
  103. package/dist/pkg/init.js.map +1 -0
  104. package/dist/pkg/install.d.ts +1 -0
  105. package/dist/pkg/install.js +77 -0
  106. package/dist/pkg/install.js.map +1 -0
  107. package/dist/pkg/registry.d.ts +23 -0
  108. package/dist/pkg/registry.js +106 -0
  109. package/dist/pkg/registry.js.map +1 -0
  110. package/dist/pkg/run.d.ts +1 -0
  111. package/dist/pkg/run.js +76 -0
  112. package/dist/pkg/run.js.map +1 -0
  113. package/dist/pkg/toml.d.ts +5 -0
  114. package/dist/pkg/toml.js +117 -0
  115. package/dist/pkg/toml.js.map +1 -0
  116. package/dist/repl.d.ts +15 -0
  117. package/dist/repl.js +197 -0
  118. package/dist/repl.js.map +1 -0
  119. package/dist/runtime/bytecode.d.ts +92 -0
  120. package/dist/runtime/bytecode.js +253 -0
  121. package/dist/runtime/bytecode.js.map +1 -0
  122. package/dist/runtime/value.d.ts +102 -0
  123. package/dist/runtime/value.js +302 -0
  124. package/dist/runtime/value.js.map +1 -0
  125. package/dist/runtime/vm.d.ts +65 -0
  126. package/dist/runtime/vm.js +293 -0
  127. package/dist/runtime/vm.js.map +1 -0
  128. package/dist/struct-instance-jest.test.d.ts +1 -0
  129. package/dist/struct-instance-jest.test.js +209 -0
  130. package/dist/struct-instance-jest.test.js.map +1 -0
  131. package/dist/struct-instance.test.d.ts +1 -0
  132. package/dist/struct-instance.test.js +291 -0
  133. package/dist/struct-instance.test.js.map +1 -0
  134. package/dist/struct-jest.test.d.ts +1 -0
  135. package/dist/struct-jest.test.js +176 -0
  136. package/dist/struct-jest.test.js.map +1 -0
  137. package/dist/struct.test.d.ts +1 -0
  138. package/dist/struct.test.js +231 -0
  139. package/dist/struct.test.js.map +1 -0
  140. package/dist/trait-jest.test.d.ts +1 -0
  141. package/dist/trait-jest.test.js +120 -0
  142. package/dist/trait-jest.test.js.map +1 -0
  143. package/dist/vm-jest.test.d.ts +1 -0
  144. package/dist/vm-jest.test.js +569 -0
  145. package/dist/vm-jest.test.js.map +1 -0
  146. package/dist/vm.d.ts +81 -0
  147. package/dist/vm.js +1956 -0
  148. package/dist/vm.js.map +1 -0
  149. package/dist/vm.test.d.ts +1 -0
  150. package/dist/vm.test.js +337 -0
  151. package/dist/vm.test.js.map +1 -0
  152. package/dist/web-repl/sandbox.d.ts +11 -0
  153. package/dist/web-repl/sandbox.js +76 -0
  154. package/dist/web-repl/sandbox.js.map +1 -0
  155. package/dist/web-repl/server.d.ts +1 -0
  156. package/dist/web-repl/server.js +111 -0
  157. package/dist/web-repl/server.js.map +1 -0
  158. package/dist/while-loop-jest.test.d.ts +1 -0
  159. package/dist/while-loop-jest.test.js +201 -0
  160. package/dist/while-loop-jest.test.js.map +1 -0
  161. package/dist/while-loop.test.d.ts +1 -0
  162. package/dist/while-loop.test.js +262 -0
  163. package/dist/while-loop.test.js.map +1 -0
  164. package/docs/EXPERIENCE.md +787 -0
  165. package/docs/README.md +175 -0
  166. package/docs/V1_V2_V3_ANALYSIS.md +107 -0
  167. package/docs/_config.yml +36 -0
  168. package/docs/api-reference.md +459 -0
  169. package/docs/architecture.md +470 -0
  170. package/docs/benchmarks.md +295 -0
  171. package/docs/comparison.md +454 -0
  172. package/docs/index.md +335 -0
  173. package/docs/language-completeness.md +228 -0
  174. package/docs/learning-guide.md +651 -0
  175. package/package.json +65 -0
  176. package/src/api/deploy_key.fl +294 -0
  177. package/src/api/issue.fl +302 -0
  178. package/src/api/org.fl +356 -0
  179. package/src/api/repo.fl +394 -0
  180. package/src/api/team.fl +299 -0
  181. package/src/api/user.fl +385 -0
  182. package/src/api/webhook.fl +273 -0
  183. package/src/ast.ts +158 -0
  184. package/src/async-basic.test.ts +94 -0
  185. package/src/async-jest.test.ts +107 -0
  186. package/src/channel-jest.test.ts +158 -0
  187. package/src/checker-jest.test.ts +189 -0
  188. package/src/checker.test.ts +279 -0
  189. package/src/checker.ts +1861 -0
  190. package/src/commands/analyze.fl +227 -0
  191. package/src/commands/auth.fl +315 -0
  192. package/src/commands/batch.fl +349 -0
  193. package/src/commands/config.fl +199 -0
  194. package/src/commands/deploy_key.fl +352 -0
  195. package/src/commands/issue.fl +275 -0
  196. package/src/commands/main.fl +492 -0
  197. package/src/commands/org.fl +425 -0
  198. package/src/commands/repo.fl +581 -0
  199. package/src/commands/team.fl +244 -0
  200. package/src/commands/user.fl +423 -0
  201. package/src/commands/webhook.fl +400 -0
  202. package/src/compiler-jest.test.ts +275 -0
  203. package/src/compiler.test.ts +375 -0
  204. package/src/compiler.ts +1770 -0
  205. package/src/config.fl +175 -0
  206. package/src/core/batch.fl +355 -0
  207. package/src/core/cache.fl +284 -0
  208. package/src/core/ensure.fl +324 -0
  209. package/src/db-100m-full.ts +96 -0
  210. package/src/db-100m-no-index.ts +133 -0
  211. package/src/db-100m-real.ts +152 -0
  212. package/src/db-100m-streaming.ts +154 -0
  213. package/src/db-100m-test.ts +136 -0
  214. package/src/db-jest.test.ts +161 -0
  215. package/src/db-runtime.ts +242 -0
  216. package/src/db.ts +676 -0
  217. package/src/errors.fl +134 -0
  218. package/src/for-of-jest.test.ts +246 -0
  219. package/src/for-of.test.ts +308 -0
  220. package/src/function-literal-jest.test.ts +193 -0
  221. package/src/function-literal.test.ts +248 -0
  222. package/src/generics-jest.test.ts +104 -0
  223. package/src/http/client.fl +327 -0
  224. package/src/ir-gen.ts +459 -0
  225. package/src/ir.ts +80 -0
  226. package/src/lexer.test.ts +499 -0
  227. package/src/lexer.ts +522 -0
  228. package/src/main.ts +223 -0
  229. package/src/models.fl +162 -0
  230. package/src/module-jest.test.ts +145 -0
  231. package/src/parser.test.ts +542 -0
  232. package/src/parser.ts +1211 -0
  233. package/src/pattern-matching-jest.test.ts +170 -0
  234. package/src/pkg/init.ts +91 -0
  235. package/src/pkg/install.ts +56 -0
  236. package/src/pkg/registry.ts +103 -0
  237. package/src/pkg/run.ts +49 -0
  238. package/src/pkg/toml.ts +129 -0
  239. package/src/repl.ts +190 -0
  240. package/src/runtime/bytecode.ts +291 -0
  241. package/src/runtime/value.ts +322 -0
  242. package/src/runtime/vm.ts +354 -0
  243. package/src/self-host/bootstrap.fl +68 -0
  244. package/src/self-host/interpreter.fl +361 -0
  245. package/src/self-host/lexer-simple.fl +22 -0
  246. package/src/self-host/lexer.fl +305 -0
  247. package/src/self-host/parser.fl +580 -0
  248. package/src/struct-instance-jest.test.ts +221 -0
  249. package/src/struct-instance.test.ts +293 -0
  250. package/src/struct-jest.test.ts +187 -0
  251. package/src/struct.test.ts +234 -0
  252. package/src/trait-jest.test.ts +136 -0
  253. package/src/vm-jest.test.ts +754 -0
  254. package/src/vm.ts +1976 -0
  255. package/src/web-repl/public/index.html +50 -0
  256. package/src/web-repl/public/main.js +105 -0
  257. package/src/web-repl/public/style.css +225 -0
  258. package/src/web-repl/sandbox.ts +88 -0
  259. package/src/web-repl/server.ts +97 -0
  260. package/src/while-loop-jest.test.ts +218 -0
  261. package/src/while-loop.test.ts +267 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ // FreeLang v4 — 채널/Actor 통합 테스트
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const lexer_1 = require("./lexer");
5
+ const parser_1 = require("./parser");
6
+ const checker_1 = require("./checker");
7
+ const compiler_1 = require("./compiler");
8
+ const vm_1 = require("./vm");
9
+ async function runCode(code) {
10
+ const lexer = new lexer_1.Lexer(code);
11
+ const { tokens, errors: lexErrors } = lexer.tokenize();
12
+ if (lexErrors.length > 0) {
13
+ throw new Error(`Lex errors: ${lexErrors.map((e) => e.message).join(", ")}`);
14
+ }
15
+ const parser = new parser_1.Parser(tokens);
16
+ const { program, errors: parseErrors } = parser.parse();
17
+ if (parseErrors.length > 0) {
18
+ throw new Error(`Parse errors: ${parseErrors.map((e) => e.message).join(", ")}`);
19
+ }
20
+ const checker = new checker_1.TypeChecker();
21
+ const checkErrors = checker.check(program);
22
+ if (checkErrors.length > 0) {
23
+ throw new Error(`Type errors: ${checkErrors.map((e) => e.message).join(", ")}`);
24
+ }
25
+ const compiler = new compiler_1.Compiler();
26
+ const bytecode = compiler.compile(program);
27
+ const vm = new vm_1.VM();
28
+ const { output, error } = await vm.run(bytecode);
29
+ if (error) {
30
+ throw new Error(`Runtime error: ${error}`);
31
+ }
32
+ return output;
33
+ }
34
+ describe("Channel/Actor 기본 테스트", () => {
35
+ // 테스트 1: 채널 생성
36
+ test("T1: 채널 생성 (chan_new)", async () => {
37
+ const code = `
38
+ var ch = channel<i32>();
39
+ println(str(1));
40
+ `;
41
+ const output = await runCode(code);
42
+ expect(output).toContain("1");
43
+ });
44
+ // 테스트 2: 채널 송수신 (기본)
45
+ test("T2: 채널 송수신 (spawn에서 송신, 메인에서 수신)", async () => {
46
+ const code = `
47
+ var ch = channel<i32>();
48
+
49
+ spawn {
50
+ ch <- 42;
51
+ }
52
+
53
+ var x = <- ch;
54
+ println(str(x));
55
+ `;
56
+ const output = await runCode(code);
57
+ expect(output).toContain("42");
58
+ });
59
+ // 테스트 3: 다중 메시지
60
+ test("T3: 채널을 통한 다중 메시지 송수신", async () => {
61
+ const code = `
62
+ var ch = channel<i32>();
63
+
64
+ spawn {
65
+ ch <- 10;
66
+ ch <- 20;
67
+ ch <- 30;
68
+ }
69
+
70
+ var a = <- ch;
71
+ var b = <- ch;
72
+ var c = <- ch;
73
+ println(str(a));
74
+ println(str(b));
75
+ println(str(c));
76
+ `;
77
+ const output = await runCode(code);
78
+ expect(output).toContain("10");
79
+ expect(output).toContain("20");
80
+ expect(output).toContain("30");
81
+ });
82
+ // 테스트 4: 다중 Actor (2개)
83
+ test("T4: 다중 Actor 간 통신 (2 spawns)", async () => {
84
+ const code = `
85
+ var ch1 = channel<i32>();
86
+
87
+ spawn {
88
+ ch1 <- 100;
89
+ }
90
+
91
+ var y = <- ch1;
92
+ println(str(y));
93
+ `;
94
+ const output = await runCode(code);
95
+ expect(output).toContain("100");
96
+ });
97
+ // 테스트 5: 채널 타입 체크 (mismatch 감지)
98
+ test("T5: 채널 타입 미스매치 감지", async () => {
99
+ const code = `
100
+ var ch = channel<i32>();
101
+ ch <- "hello";
102
+ `;
103
+ await expect(runCode(code)).rejects.toThrow();
104
+ });
105
+ // 테스트 6: Actor 스케줄링 (순서 검증)
106
+ test("T6: Actor 스케줄링 순서 검증", async () => {
107
+ const code = `
108
+ var ch = channel<i32>();
109
+
110
+ spawn {
111
+ ch <- 1;
112
+ ch <- 2;
113
+ }
114
+
115
+ var x = <- ch;
116
+ var y = <- ch;
117
+ println(str(x));
118
+ println(str(y));
119
+ `;
120
+ const output = await runCode(code);
121
+ expect(output[0]).toBe("1");
122
+ expect(output[1]).toBe("2");
123
+ });
124
+ // 테스트 7: 복잡한 채널 패턴
125
+ test("T7: 복잡한 채널 패턴 (2개 채널)", async () => {
126
+ const code = `
127
+ var ch_a = channel<i32>();
128
+ var ch_b = channel<i32>();
129
+
130
+ spawn {
131
+ ch_a <- 1;
132
+ }
133
+
134
+ spawn {
135
+ ch_b <- 2;
136
+ }
137
+
138
+ var a = <- ch_a;
139
+ var b = <- ch_b;
140
+ println(str(a));
141
+ println(str(b));
142
+ `;
143
+ const output = await runCode(code);
144
+ expect(output).toContain("1");
145
+ expect(output).toContain("2");
146
+ });
147
+ });
148
+ //# sourceMappingURL=channel-jest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-jest.test.js","sourceRoot":"","sources":["../src/channel-jest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ // FreeLang v4 — TypeChecker 테스트 - Jest Format
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const lexer_1 = require("./lexer");
5
+ const parser_1 = require("./parser");
6
+ const checker_1 = require("./checker");
7
+ function check(source) {
8
+ const { tokens, errors: lexErrors } = new lexer_1.Lexer(source).tokenize();
9
+ if (lexErrors.length > 0)
10
+ throw new Error(`Lex: ${lexErrors[0].message}`);
11
+ const { program, errors: parseErrors } = new parser_1.Parser(tokens).parse();
12
+ if (parseErrors.length > 0)
13
+ throw new Error(`Parse: ${parseErrors[0].message}`);
14
+ return new checker_1.TypeChecker().check(program);
15
+ }
16
+ // ============================================================
17
+ // Jest Tests
18
+ // ============================================================
19
+ describe("TypeChecker Tests", () => {
20
+ describe("타입 추론", () => {
21
+ it("var x = 42 (i32 추론)", () => {
22
+ const errors = check("var x = 42");
23
+ expect(errors.length).toBe(0);
24
+ });
25
+ it("var x = 3.14 (f64 추론)", () => {
26
+ const errors = check("var x = 3.14");
27
+ expect(errors.length).toBe(0);
28
+ });
29
+ it('var x = "hello" (string 추론)', () => {
30
+ const errors = check('var x = "hello"');
31
+ expect(errors.length).toBe(0);
32
+ });
33
+ it("var x = true (bool 추론)", () => {
34
+ const errors = check("var x = true");
35
+ expect(errors.length).toBe(0);
36
+ });
37
+ it("var x: i32 = 42", () => {
38
+ const errors = check("var x: i32 = 42");
39
+ expect(errors.length).toBe(0);
40
+ });
41
+ it("var x: f64 = 3.14", () => {
42
+ const errors = check("var x: f64 = 3.14");
43
+ expect(errors.length).toBe(0);
44
+ });
45
+ });
46
+ describe("타입 불일치", () => {
47
+ it("i32 = string 불일치", () => {
48
+ const errors = check('var x: i32 = "hello"');
49
+ expect(errors.length).toBeGreaterThan(0);
50
+ expect(errors[0].message).toContain("type mismatch");
51
+ });
52
+ it("bool = i32 불일치", () => {
53
+ const errors = check("var x: bool = 42");
54
+ expect(errors.length).toBeGreaterThan(0);
55
+ expect(errors[0].message).toContain("type mismatch");
56
+ });
57
+ });
58
+ describe("void 제약", () => {
59
+ it("void 변수 금지", () => {
60
+ const errors = check("var x: void = println()");
61
+ expect(errors.length).toBeGreaterThan(0);
62
+ expect(errors[0].message).toContain("void");
63
+ });
64
+ });
65
+ describe("산술 연산", () => {
66
+ it("i32 + i32", () => {
67
+ const errors = check("fn f() -> i32 { return 1 + 2 }");
68
+ expect(errors.length).toBe(0);
69
+ });
70
+ it("f64 + f64", () => {
71
+ const errors = check("fn f() -> f64 { return 1.0 + 2.0 }");
72
+ expect(errors.length).toBe(0);
73
+ });
74
+ it("i32 + f64 불일치", () => {
75
+ const errors = check("fn f() -> i32 { return 1 + 1.0 }");
76
+ expect(errors.length).toBeGreaterThan(0);
77
+ });
78
+ it("string + string", () => {
79
+ const errors = check('fn f() -> string { return "a" + "b" }');
80
+ expect(errors.length).toBe(0);
81
+ });
82
+ });
83
+ describe("비교 연산", () => {
84
+ it("== → bool", () => {
85
+ const errors = check("fn f() -> bool { return 1 == 2 }");
86
+ expect(errors.length).toBe(0);
87
+ });
88
+ it("< → bool", () => {
89
+ const errors = check("fn f() -> bool { return 1 < 2 }");
90
+ expect(errors.length).toBe(0);
91
+ });
92
+ });
93
+ describe("논리 연산", () => {
94
+ it("&& bool", () => {
95
+ const errors = check("fn f() -> bool { return true && false }");
96
+ expect(errors.length).toBe(0);
97
+ });
98
+ it("&& 에 i32 사용", () => {
99
+ const errors = check("fn f() -> bool { return 1 && 2 }");
100
+ expect(errors.length).toBeGreaterThan(0);
101
+ expect(errors[0].message).toContain("requires bool");
102
+ });
103
+ });
104
+ describe("단항 연산", () => {
105
+ it("unary -", () => {
106
+ const errors = check("fn f() -> i32 { return -42 }");
107
+ expect(errors.length).toBe(0);
108
+ });
109
+ it("unary !", () => {
110
+ const errors = check("fn f() -> bool { return !true }");
111
+ expect(errors.length).toBe(0);
112
+ });
113
+ it("! 에 i32 사용", () => {
114
+ const errors = check("fn f() -> bool { return !42 }");
115
+ expect(errors.length).toBeGreaterThan(0);
116
+ expect(errors[0].message).toContain("requires bool");
117
+ });
118
+ });
119
+ describe("함수 검사", () => {
120
+ it("반환 타입 불일치", () => {
121
+ const errors = check('fn f() -> i32 { return "hello" }');
122
+ expect(errors.length).toBeGreaterThan(0);
123
+ expect(errors[0].message).toContain("return type mismatch");
124
+ });
125
+ it("인자 수 부족", () => {
126
+ const errors = check(`fn add(a: i32, b: i32) -> i32 { return a + b }
127
+ add(1)`);
128
+ expect(errors.length).toBeGreaterThan(0);
129
+ });
130
+ it("인자 타입 불일치", () => {
131
+ const errors = check(`fn add(a: i32, b: i32) -> i32 { return a + b }
132
+ add(1, "two")`);
133
+ expect(errors.length).toBeGreaterThan(0);
134
+ });
135
+ it("함수 전방참조", () => {
136
+ const errors = check(`
137
+ fn main() -> void { println(str(add(1, 2))) }
138
+ fn add(a: i32, b: i32) -> i32 { return a + b }
139
+ `);
140
+ expect(errors.length).toBe(0);
141
+ });
142
+ it("함수 중복 선언", () => {
143
+ const errors = check(`fn f() -> void { }
144
+ fn f() -> void { }`);
145
+ expect(errors.length).toBeGreaterThan(0);
146
+ });
147
+ });
148
+ describe("불변성", () => {
149
+ it("var 재할당 허용", () => {
150
+ const errors = check("var x = 1\nx = 2");
151
+ expect(errors.length).toBe(0);
152
+ });
153
+ it("let 재할당 금지", () => {
154
+ const errors = check("let x = 1\nx = 2");
155
+ expect(errors.length).toBeGreaterThan(0);
156
+ expect(errors[0].message).toContain("immutable");
157
+ });
158
+ });
159
+ });
160
+ //# sourceMappingURL=checker-jest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker-jest.test.js","sourceRoot":"","sources":["../src/checker-jest.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ import { Program, Expr } from "./ast";
2
+ export type Type = {
3
+ kind: "i32";
4
+ } | {
5
+ kind: "i64";
6
+ } | {
7
+ kind: "f64";
8
+ } | {
9
+ kind: "bool";
10
+ } | {
11
+ kind: "string";
12
+ } | {
13
+ kind: "void";
14
+ } | {
15
+ kind: "array";
16
+ element: Type;
17
+ } | {
18
+ kind: "channel";
19
+ element: Type;
20
+ } | {
21
+ kind: "option";
22
+ element: Type;
23
+ } | {
24
+ kind: "result";
25
+ ok: Type;
26
+ err: Type;
27
+ } | {
28
+ kind: "promise";
29
+ element: Type;
30
+ } | {
31
+ kind: "struct";
32
+ fields: Map<string, Type>;
33
+ } | {
34
+ kind: "fn";
35
+ params: Type[];
36
+ returnType: Type;
37
+ } | {
38
+ kind: "type_param";
39
+ name: string;
40
+ } | {
41
+ kind: "generic_ref";
42
+ name: string;
43
+ typeArgs: Type[];
44
+ } | {
45
+ kind: "trait";
46
+ name: string;
47
+ methods: Map<string, {
48
+ params: Type[];
49
+ returnType: Type;
50
+ }>;
51
+ } | {
52
+ kind: "unknown";
53
+ };
54
+ export type CheckError = {
55
+ message: string;
56
+ line: number;
57
+ col: number;
58
+ };
59
+ type FnInfo = {
60
+ params: {
61
+ name: string;
62
+ type: Type;
63
+ }[];
64
+ returnType: Type;
65
+ };
66
+ type GenericFnDef = {
67
+ typeParams: string[];
68
+ params: {
69
+ name: string;
70
+ type: Type;
71
+ }[];
72
+ returnType: Type;
73
+ };
74
+ type GenericStructDef = {
75
+ typeParams: string[];
76
+ fields: Map<string, Type>;
77
+ };
78
+ export declare class TypeChecker {
79
+ private errors;
80
+ private functions;
81
+ private structs;
82
+ private traits;
83
+ private impls;
84
+ private genericFunctions;
85
+ private genericStructs;
86
+ private instantiatedFunctions;
87
+ private instantiatedStructs;
88
+ private scope;
89
+ private currentReturnType;
90
+ constructor();
91
+ check(program: Program): CheckError[];
92
+ private registerFunction;
93
+ private registerBuiltinFunctions;
94
+ private registerStruct;
95
+ private registerTrait;
96
+ private registerImpl;
97
+ private checkStmt;
98
+ private checkVarDecl;
99
+ private checkFnDecl;
100
+ private checkIfStmt;
101
+ private checkMatchStmt;
102
+ private checkMatchArm;
103
+ private checkPattern;
104
+ private checkForStmt;
105
+ private checkForOfStmt;
106
+ private checkWhileStmt;
107
+ private checkBreakStmt;
108
+ private checkContinueStmt;
109
+ private checkSpawnStmt;
110
+ private checkReturnStmt;
111
+ private checkExprStmt;
112
+ private checkImportDecl;
113
+ private checkExportDecl;
114
+ checkExpr(expr: Expr): Type;
115
+ private checkIdent;
116
+ private checkBinary;
117
+ private checkUnary;
118
+ private checkAwait;
119
+ private checkCall;
120
+ private checkIndex;
121
+ private checkFieldAccess;
122
+ private findStructName;
123
+ private findImplMethod;
124
+ private checkAssign;
125
+ private checkTry;
126
+ private checkIfExpr;
127
+ private checkMatchExpr;
128
+ private checkArrayLit;
129
+ private checkStructLit;
130
+ private checkFnLit;
131
+ private checkBlockExpr;
132
+ private coerceNumeric;
133
+ private isBuiltin;
134
+ private getBuiltinReturnType;
135
+ private checkChanNew;
136
+ private checkChanSend;
137
+ private checkChanRecv;
138
+ private error;
139
+ getInstantiatedFunctions(): Map<string, FnInfo>;
140
+ getInstantiatedStructs(): Map<string, Type>;
141
+ getGenericFunctions(): Map<string, GenericFnDef>;
142
+ getGenericStructs(): Map<string, GenericStructDef>;
143
+ getStructs(): Map<string, Type>;
144
+ private typeToMangledName;
145
+ private mangleFunctionName;
146
+ instantiateFunction(name: string, typeArgs: Type[]): FnInfo | null;
147
+ instantiateStruct(name: string, typeArgs: Type[]): Type;
148
+ }
149
+ export {};