nadesiko3 3.3.45 → 3.3.49

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 (329) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +143 -132
  3. package/batch/browsers.template.md +3 -3
  4. package/batch/build_browsers.nako3 +72 -72
  5. package/batch/build_command.nako3 +44 -44
  6. package/batch/build_nako_version.nako3 +42 -42
  7. package/batch/calc_hash.nako3 +29 -29
  8. package/batch/cmd_txt2json.nako3 +74 -74
  9. package/batch/command.txt +270 -338
  10. package/batch/command_nakopad.txt +9 -69
  11. package/batch/download-extlib.nako3 +43 -43
  12. package/batch/gen_command_nakopad.nako3 +57 -57
  13. package/batch/jsplugin2text.nako3 +285 -285
  14. package/batch/pickup_command.nako3 +110 -110
  15. package/batch/pickup_reserved_words.nako3 +11 -11
  16. package/batch/publish_version.nako3 +46 -46
  17. package/batch/show_agents.js +14 -14
  18. package/batch/turtle2js.nako3 +21 -21
  19. package/bin/cnako3 +10 -10
  20. package/core/.editorconfig +6 -0
  21. package/core/.eslintrc.cjs +33 -0
  22. package/core/.github/dependabot.yml +7 -0
  23. package/core/.github/workflows/nodejs.yml +37 -0
  24. package/core/.github/workflows/super-linter.yml +61 -0
  25. package/core/.github/workflows/textlint.yml +199 -0
  26. package/core/LICENSE +21 -0
  27. package/core/README.md +66 -0
  28. package/core/batch/build_nako_version.nako3 +42 -0
  29. package/core/command/snako.mjs +105 -0
  30. package/core/command/snako.mts +116 -0
  31. package/core/index.mjs +21 -0
  32. package/core/index.mts +21 -0
  33. package/core/package.json +47 -0
  34. package/core/sample/hello.nako3 +7 -0
  35. package/core/sample/hoge.mjs +4 -0
  36. package/core/sample/hoge.mts +6 -0
  37. package/core/src/nako3.mjs +858 -0
  38. package/core/src/nako3.mts +967 -0
  39. package/core/src/nako_colors.mjs +78 -0
  40. package/core/src/nako_colors.mts +86 -0
  41. package/core/src/nako_core_version.mjs +8 -0
  42. package/core/src/nako_core_version.mts +19 -0
  43. package/core/src/nako_csv.mjs +185 -0
  44. package/core/src/nako_csv.mts +188 -0
  45. package/core/src/nako_errors.mjs +173 -0
  46. package/core/src/nako_errors.mts +197 -0
  47. package/core/src/nako_from_dncl.mjs +255 -0
  48. package/core/src/nako_from_dncl.mts +250 -0
  49. package/core/src/nako_gen.mjs +1648 -0
  50. package/core/src/nako_gen.mts +1719 -0
  51. package/core/src/nako_gen_async.mjs +1659 -0
  52. package/core/src/nako_gen_async.mts +1732 -0
  53. package/core/src/nako_global.mjs +107 -0
  54. package/core/src/nako_global.mts +138 -0
  55. package/core/src/nako_indent.mjs +445 -0
  56. package/core/src/nako_indent.mts +492 -0
  57. package/core/src/nako_josi_list.mjs +38 -0
  58. package/core/src/nako_josi_list.mts +45 -0
  59. package/core/src/nako_lex_rules.mjs +253 -0
  60. package/core/src/nako_lex_rules.mts +260 -0
  61. package/core/src/nako_lexer.mjs +609 -0
  62. package/core/src/nako_lexer.mts +612 -0
  63. package/core/src/nako_logger.mjs +199 -0
  64. package/core/src/nako_logger.mts +232 -0
  65. package/core/src/nako_parser3.mjs +2439 -0
  66. package/core/src/nako_parser3.mts +2195 -0
  67. package/core/src/nako_parser_base.mjs +370 -0
  68. package/core/src/nako_parser_base.mts +370 -0
  69. package/core/src/nako_parser_const.mjs +37 -0
  70. package/core/src/nako_parser_const.mts +37 -0
  71. package/core/src/nako_prepare.mjs +304 -0
  72. package/core/src/nako_prepare.mts +315 -0
  73. package/core/src/nako_reserved_words.mjs +38 -0
  74. package/core/src/nako_reserved_words.mts +38 -0
  75. package/core/src/nako_source_mapping.mjs +207 -0
  76. package/core/src/nako_source_mapping.mts +262 -0
  77. package/core/src/nako_test.mjs +37 -0
  78. package/core/src/nako_types.mjs +25 -0
  79. package/core/src/nako_types.mts +151 -0
  80. package/core/src/plugin_csv.mjs +49 -0
  81. package/core/src/plugin_csv.mts +50 -0
  82. package/core/src/plugin_math.mjs +328 -0
  83. package/core/src/plugin_math.mts +326 -0
  84. package/core/src/plugin_promise.mjs +91 -0
  85. package/core/src/plugin_promise.mts +91 -0
  86. package/core/src/plugin_system.mjs +2832 -0
  87. package/core/src/plugin_system.mts +2690 -0
  88. package/core/src/plugin_test.mjs +34 -0
  89. package/core/src/plugin_test.mts +34 -0
  90. package/core/test/array_test.mjs +34 -0
  91. package/core/test/basic_test.mjs +344 -0
  92. package/core/test/calc_test.mjs +140 -0
  93. package/core/test/core_module_test.mjs +23 -0
  94. package/core/test/debug_test.mjs +16 -0
  95. package/core/test/dncl_test.mjs +94 -0
  96. package/core/test/error_message_test.mjs +210 -0
  97. package/core/test/error_test.mjs +16 -0
  98. package/core/test/flow_test.mjs +373 -0
  99. package/core/test/func_call.mjs +160 -0
  100. package/core/test/func_test.mjs +149 -0
  101. package/core/test/indent_test.mjs +364 -0
  102. package/core/test/lex_test.mjs +168 -0
  103. package/core/test/literal_test.mjs +73 -0
  104. package/core/test/nako_lexer_test.mjs +35 -0
  105. package/core/test/nako_logger_test.mjs +76 -0
  106. package/core/test/nako_logger_test.mts +78 -0
  107. package/core/test/plugin_csv_test.mjs +38 -0
  108. package/core/test/plugin_promise_test.mjs +18 -0
  109. package/core/test/plugin_system_test.mjs +630 -0
  110. package/core/test/prepare_test.mjs +96 -0
  111. package/core/test/re_test.mjs +22 -0
  112. package/core/test/side_effects_test.mjs +92 -0
  113. package/core/test/variable_scope_test.mjs +149 -0
  114. package/core/tsconfig.json +101 -0
  115. package/demo/ace_editor.html +89 -89
  116. package/demo/ace_editor_tabs.html +161 -161
  117. package/demo/basic.html +71 -71
  118. package/demo/browsers.html +9 -10
  119. package/demo/css/basic.css +3 -3
  120. package/demo/css/common.css +157 -157
  121. package/demo/css/editor.css +8 -8
  122. package/demo/css/flow.css +3 -3
  123. package/demo/css/index.css +3 -3
  124. package/demo/flow.html +98 -98
  125. package/demo/graph.html +53 -53
  126. package/demo/image/nakopad-icon256.png +0 -0
  127. package/demo/index.html +133 -133
  128. package/demo/js/common.js +17 -17
  129. package/demo/js/turtle3d_test.js +44 -44
  130. package/demo/js/turtle_test.js +45 -45
  131. package/demo/nako3/calc.nako3 +4 -4
  132. package/demo/runscript.html +47 -47
  133. package/demo/runscript2.html +33 -33
  134. package/demo/runscript3.html +35 -35
  135. package/demo/runscript4.html +33 -33
  136. package/demo/turtle.html +58 -58
  137. package/demo/turtle2.html +141 -141
  138. package/demo/turtle3.html +279 -279
  139. package/demo/turtle3d.html +58 -58
  140. package/demo/turtle3d2.html +107 -107
  141. package/demo/version.html +24 -24
  142. package/doc/SETUP.md +157 -157
  143. package/doc/about.md +17 -17
  144. package/doc/browsers.md +26 -26
  145. package/doc/docgen.md +21 -21
  146. package/doc/editor.md +44 -44
  147. package/doc/files.md +39 -39
  148. package/doc/plugins.md +234 -234
  149. package/doc/release.md +79 -79
  150. package/doc/textlint.md +43 -43
  151. package/doc/win32.md +57 -57
  152. package/package.json +195 -192
  153. package/release/_hash.txt +28 -28
  154. package/release/_script-tags.txt +14 -14
  155. package/release/command.json +1 -1
  156. package/release/command.json.js +1 -1
  157. package/release/command_cnako3.json +1 -1
  158. package/release/command_list.json +1 -1
  159. package/release/editor.js +1 -1
  160. package/release/nako_gen_async.js +1 -1
  161. package/release/plugin_csv.js +1 -1
  162. package/release/stats.json +1 -1
  163. package/release/version.js +1 -1
  164. package/release/wnako3.js +1 -1
  165. package/release/wnako3webworker.js +1 -1
  166. package/src/browsers.txt +11 -12
  167. package/src/browsers_agents.json +2 -2
  168. package/src/browsers_agents.mjs +1 -1
  169. package/src/cnako3.mjs +17 -10
  170. package/src/cnako3.mts +18 -12
  171. package/src/cnako3mod.mjs +707 -687
  172. package/src/cnako3mod.mts +712 -696
  173. package/src/commander_ja.mjs +164 -164
  174. package/src/commander_ja.mts +161 -161
  175. package/src/enako3.mjs +68 -69
  176. package/src/era.mjs +22 -22
  177. package/src/image_turtle-elephant.mjs +2 -5
  178. package/src/image_turtle-panda.mjs +2 -5
  179. package/src/image_turtle64.mjs +2 -5
  180. package/src/index.mjs +9 -9
  181. package/src/index.mts +10 -11
  182. package/src/nako3editorfix.sfd +106 -106
  183. package/src/nako_version.mjs +8 -8
  184. package/src/nako_version.mts +2 -2
  185. package/src/plugin_browser.mjs +213 -212
  186. package/src/plugin_browser.mts +206 -205
  187. package/src/plugin_browser_ajax.mjs +399 -399
  188. package/src/plugin_browser_audio.mjs +109 -109
  189. package/src/plugin_browser_canvas.mjs +449 -449
  190. package/src/plugin_browser_chart.mjs +294 -294
  191. package/src/plugin_browser_color.mjs +49 -49
  192. package/src/plugin_browser_crypto.mjs +26 -26
  193. package/src/plugin_browser_dialog.mjs +53 -53
  194. package/src/plugin_browser_dom_basic.mjs +336 -336
  195. package/src/plugin_browser_dom_event.mjs +193 -193
  196. package/src/plugin_browser_dom_parts.mjs +396 -396
  197. package/src/plugin_browser_geolocation.mjs +51 -51
  198. package/src/plugin_browser_hotkey.mjs +25 -25
  199. package/src/plugin_browser_html.mjs +59 -59
  200. package/src/plugin_browser_in_worker.mjs +45 -45
  201. package/src/plugin_browser_location.mjs +21 -21
  202. package/src/plugin_browser_speech.mjs +111 -111
  203. package/src/plugin_browser_storage.mjs +121 -121
  204. package/src/plugin_browser_system.mjs +31 -31
  205. package/src/plugin_browser_websocket.mjs +73 -73
  206. package/src/plugin_caniuse.mjs +29 -29
  207. package/src/plugin_datetime.mjs +394 -394
  208. package/src/plugin_httpserver.mjs +277 -0
  209. package/src/plugin_httpserver.mts +286 -0
  210. package/src/plugin_kansuji.mjs +224 -224
  211. package/src/plugin_keigo.mjs +55 -55
  212. package/src/plugin_markup.mjs +32 -32
  213. package/src/plugin_node.mjs +1047 -1047
  214. package/src/plugin_node.mts +980 -980
  215. package/src/plugin_turtle.mjs +647 -647
  216. package/src/plugin_webworker.mjs +334 -334
  217. package/src/plugin_weykturtle3d.mjs +1214 -1214
  218. package/src/plugin_worker.mjs +95 -95
  219. package/src/repl.nako3 +63 -63
  220. package/src/wnako3.mjs +12 -12
  221. package/src/wnako3.mts +11 -11
  222. package/src/wnako3_editor.css +215 -215
  223. package/src/wnako3_editor.mjs +1542 -1542
  224. package/src/wnako3_editor.mts +1657 -1656
  225. package/src/wnako3mod.mjs +213 -213
  226. package/src/wnako3mod.mts +214 -214
  227. package/src/wnako3webworker.mjs +69 -68
  228. package/test/ace_editor/karma.config.js +94 -94
  229. package/test/ace_editor/test/.babelrc.json +3 -3
  230. package/test/ace_editor/test/ace_editor_test.js +178 -178
  231. package/test/ace_editor/test/html/custom_context.html +139 -139
  232. package/test/async/async_basic_test.mjs +122 -122
  233. package/test/browser/karma.config.js +221 -221
  234. package/test/browser/test/.babelrc.json +3 -3
  235. package/test/browser/test/compare_util.js +50 -50
  236. package/test/browser/test/html/div_basic.html +2 -2
  237. package/test/browser/test/html/event_dom_form.html +4 -4
  238. package/test/browser/test/html/event_dom_scrolldiv.html +5 -5
  239. package/test/browser/test/import_plugin_checker.js +24 -24
  240. package/test/browser/test/plugin_browser_test.js +51 -51
  241. package/test/browser/test/plugin_browser_test_ajax.js +123 -123
  242. package/test/browser/test/plugin_browser_test_color.js +18 -18
  243. package/test/browser/test/plugin_browser_test_dialog.js +72 -72
  244. package/test/browser/test/plugin_browser_test_dom_event.js +598 -598
  245. package/test/browser/test/plugin_browser_test_dom_parts.js +125 -125
  246. package/test/browser/test/plugin_browser_test_system.js +9 -9
  247. package/test/browser/test/plugin_turtle_test.js +817 -817
  248. package/test/browser/test/plugin_webworker_test.js +86 -86
  249. package/test/browser/test/require_test.js +68 -68
  250. package/test/bundled/karma.config.base.js +117 -117
  251. package/test/bundled/karma.config.js +86 -86
  252. package/test/bundled/test/.babelrc.json +3 -3
  253. package/test/bundled/test/bundled_test.js +69 -69
  254. package/test/bundled/test/html/custom_context.html +65 -65
  255. package/test/bundled/test/html/custom_debug.html +66 -66
  256. package/test/bundled/test4b.cmd +52 -52
  257. package/test/bundled/test_base/.babelrc.json +3 -3
  258. package/test/bundled/test_base/_checktool_test.js +25 -25
  259. package/test/bundled/test_base/basic_ajax_test.js +56 -56
  260. package/test/bundled/test_base/basic_async_test.js +18 -18
  261. package/test/bundled/test_base/basic_test.js +153 -153
  262. package/test/bundled/test_base/calc_test.js +132 -132
  263. package/test/bundled/test_base/css/browsers_box.css +114 -114
  264. package/test/bundled/test_base/html/custom_context.html +69 -69
  265. package/test/bundled/test_base/html/custom_debug.html +71 -71
  266. package/test/bundled/test_base/js/browsers_box.js +72 -72
  267. package/test/bundled/test_base/plugin_csv_test.js +37 -37
  268. package/test/bundled/test_base/plugin_datetime_test.js +115 -115
  269. package/test/bundled/test_base/plugin_kansuji_test.js +49 -49
  270. package/test/bundled/test_base/plugin_system_test.js +410 -410
  271. package/test/bundled/test_base/plugin_webworker_test.js +53 -53
  272. package/test/bundled/test_base/test_utils.js +191 -191
  273. package/test/common/plugin_browser_test.mjs +22 -24
  274. package/test/common/plugin_browser_ut_audio_test.mjs +108 -108
  275. package/test/common/plugin_browser_ut_color_test.mjs +21 -21
  276. package/test/common/plugin_browser_ut_dialog_test.mjs +100 -100
  277. package/test/common/plugin_browser_ut_html_test.mjs +13 -13
  278. package/test/common/plugin_browser_ut_system_test.mjs +10 -10
  279. package/test/common/plugin_markup_test.mjs +23 -23
  280. package/test/jsconfig.json +19 -19
  281. package/test/karma.config.js +91 -91
  282. package/test/node/async_test.mjs +96 -82
  283. package/test/node/commander_ja_test.mjs +89 -89
  284. package/test/node/error_message_test.mjs +243 -253
  285. package/test/node/kai_test.nako3 +6 -6
  286. package/test/node/node_test.mjs +60 -60
  287. package/test/node/plugin_broken.js.txt +3 -3
  288. package/test/node/plugin_browser_ut_ajax_test.mjs.todo +357 -357
  289. package/test/node/plugin_browser_ut_location_test.mjs +42 -42
  290. package/test/node/plugin_markup_test.mjs +47 -46
  291. package/test/node/plugin_math_test.mjs +45 -44
  292. package/test/node/plugin_node_test.mjs +98 -97
  293. package/test/node/plugin_test.mjs +44 -43
  294. package/test/node/relative_import_test_1.nako3 +1 -1
  295. package/test/node/relative_import_test_2.nako3 +2 -2
  296. package/test/node/require_nako3_test.mjs +67 -66
  297. package/test/node/requiretest.nako3 +4 -4
  298. package/test/node/requiretest_indirect.nako3 +1 -1
  299. package/test/node/requiretest_name.nako3 +5 -5
  300. package/test/node/runtime_error.nako3 +2 -2
  301. package/test/node/scope1.nako3 +10 -10
  302. package/test/node/scope2.nako3 +12 -12
  303. package/test/node/side_effects_test.mjs +39 -119
  304. package/test/node/sjis.txt +5 -5
  305. package/test/node/syntax_error.nako3 +1 -1
  306. package/test/node/wnako3_editor_test.mjs +384 -384
  307. package/tools/README.md +12 -7
  308. package/tools/check_new_version.nako3 +25 -25
  309. package/tools/nako3edit/html/daisyui/LICENSE +22 -22
  310. package/tools/nako3edit/html/daisyui/version_2.14.1 +1 -1
  311. package/tools/nako3edit/html/edit.html +170 -170
  312. package/tools/nako3edit/html/edit_plugin.js +6 -6
  313. package/tools/nako3edit/html/files.html +125 -125
  314. package/tools/nako3edit/html/nako3edit.css +65 -65
  315. package/tools/nako3edit/index.mjs +248 -244
  316. package/tools/nako3server/index.html +10 -0
  317. package/tools/nako3server/index.mjs +116 -116
  318. package/tools/nako3server/index.nako3 +34 -0
  319. package/release/nako_gen_async.js.LICENSE.txt +0 -35
  320. package/release/plugin_caniuse.js.LICENSE.txt +0 -11
  321. package/release/plugin_csv.js.LICENSE.txt +0 -15
  322. package/release/plugin_datetime.js.LICENSE.txt +0 -15
  323. package/release/plugin_kansuji.js.LICENSE.txt +0 -3
  324. package/release/plugin_markup.js.LICENSE.txt +0 -11
  325. package/release/plugin_turtle.js.LICENSE.txt +0 -15
  326. package/release/plugin_webworker.js.LICENSE.txt +0 -3
  327. package/release/plugin_weykturtle3d.js.LICENSE.txt +0 -3
  328. package/release/wnako3webworker.js.LICENSE.txt +0 -131
  329. package/tools/nako3edit/a.sqlite3 +0 -0
@@ -0,0 +1,207 @@
1
+ /** prepareとtokenizeのソースマッピング */
2
+ export class SourceMappingOfTokenization {
3
+ /**
4
+ * @param {number} sourceCodeLength
5
+ * @param {PreprocessItem[]} preprocessed
6
+ */
7
+ constructor(sourceCodeLength, preprocessed) {
8
+ /** @private @readonly */
9
+ this.sourceCodeLength = sourceCodeLength;
10
+ /** @private @readonly */
11
+ this.preprocessed = preprocessed;
12
+ let i = 0;
13
+ /** @private @readonly @type {number[]} */
14
+ this.cumulativeSum = [];
15
+ for (const el of preprocessed) {
16
+ this.cumulativeSum.push(i);
17
+ i += el.text.length;
18
+ }
19
+ /** @private */
20
+ this.lastIndex = 0;
21
+ /** @private */
22
+ this.lastPreprocessedCodePosition = 0;
23
+ }
24
+ /**
25
+ * preprocess後の文字列上のoffsetからソースコード上のoffsetへ変換
26
+ * @param {number} preprocessedCodePosition
27
+ * @returns {number}
28
+ */
29
+ map(preprocessedCodePosition) {
30
+ const i = this.findIndex(preprocessedCodePosition);
31
+ return Math.min(this.preprocessed[i].sourcePosition + (preprocessedCodePosition - this.cumulativeSum[i]), i === this.preprocessed.length - 1 ? this.sourceCodeLength : this.preprocessed[i + 1].sourcePosition - 1);
32
+ }
33
+ /**
34
+ * @param {number} preprocessedCodePosition
35
+ * @returns {number}
36
+ */
37
+ findIndex(preprocessedCodePosition) {
38
+ // 連続アクセスに対する高速化
39
+ if (preprocessedCodePosition < this.lastPreprocessedCodePosition) {
40
+ this.lastIndex = 0;
41
+ }
42
+ this.lastPreprocessedCodePosition = preprocessedCodePosition;
43
+ for (let i = this.lastIndex; i < this.preprocessed.length - 1; i++) {
44
+ if (preprocessedCodePosition < this.cumulativeSum[i + 1]) {
45
+ this.lastIndex = i;
46
+ return i;
47
+ }
48
+ }
49
+ this.lastIndex = this.preprocessed.length - 1;
50
+ return this.preprocessed.length - 1;
51
+ }
52
+ }
53
+ export class SourceMappingOfIndentSyntax {
54
+ /**
55
+ * @param {string} codeAfterProcessingIndentationSyntax
56
+ * @param {readonly number[]} linesInsertedByIndentationSyntax
57
+ * @param {readonly { lineNumber: number, len: number }[]} linesDeletedByIndentationSyntax
58
+ */
59
+ constructor(codeAfterProcessingIndentationSyntax, linesInsertedByIndentationSyntax, linesDeletedByIndentationSyntax) {
60
+ /** @private @type {{ offset: number, len: number }[]} */
61
+ this.lines = [];
62
+ /** @private @readonly */
63
+ this.linesInsertedByIndentationSyntax = linesInsertedByIndentationSyntax;
64
+ /** @private @readonly */
65
+ this.linesDeletedByIndentationSyntax = linesDeletedByIndentationSyntax;
66
+ let offset = 0;
67
+ for (const line of codeAfterProcessingIndentationSyntax.split('\n')) {
68
+ this.lines.push({ offset, len: line.length });
69
+ offset += line.length + 1;
70
+ }
71
+ /** @private */
72
+ this.lastLineNumber = 0;
73
+ /** @private */
74
+ this.lastOffset = 0;
75
+ }
76
+ /**
77
+ * @param {number | null} startOffset
78
+ * @param {number | null} endOffset
79
+ * @returns {{ startOffset: number | null, endOffset: number | null }}
80
+ */
81
+ map(startOffset, endOffset) {
82
+ if (startOffset === null) {
83
+ return { startOffset, endOffset };
84
+ }
85
+ // 何行目かを判定
86
+ const tokenLine = this.getLineNumber(startOffset);
87
+ for (const insertedLine of this.linesInsertedByIndentationSyntax) {
88
+ // インデント構文の処理後のソースコードの `insertedLine` 行目にあるトークンのソースマップ情報を削除する。
89
+ if (tokenLine === insertedLine) {
90
+ startOffset = null;
91
+ endOffset = null;
92
+ break;
93
+ }
94
+ // インデント構文の処理後のソースコードの `insertedLine` 行目以降にあるトークンのoffsetから
95
+ // `linesInsertedByIndentationSyntax[i]` 行目の文字数(\rを含む) を引く。
96
+ if (tokenLine > insertedLine) {
97
+ // "\n"の分1足す
98
+ startOffset -= this.lines[insertedLine].len + 1;
99
+ if (endOffset !== null) {
100
+ endOffset -= this.lines[insertedLine].len + 1;
101
+ }
102
+ }
103
+ }
104
+ for (const deletedLine of this.linesDeletedByIndentationSyntax) {
105
+ if (tokenLine >= deletedLine.lineNumber) {
106
+ // "\n"の分1足す
107
+ if (startOffset !== null) {
108
+ startOffset += deletedLine.len + 1;
109
+ }
110
+ if (endOffset !== null) {
111
+ endOffset += deletedLine.len + 1;
112
+ }
113
+ }
114
+ }
115
+ return { startOffset, endOffset };
116
+ }
117
+ /**
118
+ * @param {number} offset
119
+ * @returns {number}
120
+ * @private
121
+ */
122
+ getLineNumber(offset) {
123
+ // 連続アクセスに対する高速化
124
+ if (offset < this.lastOffset) {
125
+ this.lastLineNumber = 0;
126
+ }
127
+ this.lastOffset = offset;
128
+ for (let i = this.lastLineNumber; i < this.lines.length - 1; i++) {
129
+ if (offset < this.lines[i + 1].offset) {
130
+ this.lastLineNumber = i;
131
+ return i;
132
+ }
133
+ }
134
+ this.lastLineNumber = this.lines.length - 1;
135
+ return this.lines.length - 1;
136
+ }
137
+ }
138
+ /** offsetから (line, column) へ変換する。 */
139
+ export class OffsetToLineColumn {
140
+ /**
141
+ * @param {string} code
142
+ */
143
+ constructor(code) {
144
+ /** @private @type {number[]} */
145
+ this.lineOffsets = [];
146
+ // 各行の先頭位置を先に計算しておく
147
+ let offset = 0;
148
+ for (const line of code.split('\n')) {
149
+ this.lineOffsets.push(offset);
150
+ offset += line.length + 1;
151
+ }
152
+ /** @private */
153
+ this.lastLineNumber = 0;
154
+ /** @private */
155
+ this.lastOffset = 0;
156
+ }
157
+ /**
158
+ * @param {number} offset
159
+ * @param {boolean} oneBasedLineNumber trueのときlineを1から始める
160
+ * @returns {{ line: number, column: number }}
161
+ */
162
+ map(offset, oneBasedLineNumber) {
163
+ // 連続アクセスに対する高速化
164
+ if (offset < this.lastOffset) {
165
+ this.lastLineNumber = 0;
166
+ }
167
+ this.lastOffset = offset;
168
+ for (let i = this.lastLineNumber; i < this.lineOffsets.length - 1; i++) {
169
+ if (offset < this.lineOffsets[i + 1]) {
170
+ this.lastLineNumber = i;
171
+ return {
172
+ line: i + (oneBasedLineNumber ? 1 : 0),
173
+ column: offset - this.lineOffsets[i]
174
+ };
175
+ }
176
+ }
177
+ this.lastLineNumber = this.lineOffsets.length - 1;
178
+ return {
179
+ line: this.lineOffsets.length - 1 + (oneBasedLineNumber ? 1 : 0),
180
+ column: offset - this.lineOffsets[this.lineOffsets.length - 1]
181
+ };
182
+ }
183
+ }
184
+ /**
185
+ * preCodeの分、ソースマップのoffset、行数、列数を減らす。
186
+ * @type {<T extends {line?: number, column?: number, startOffset: number | null, endOffset: number | null }>(sourceMap: T, preCode: string) => T}
187
+ */
188
+ export function subtractSourceMapByPreCodeLength(sourceMap, preCode) {
189
+ // offsetは単純に引くだけでよい
190
+ if (typeof sourceMap.startOffset === 'number') {
191
+ sourceMap.startOffset -= preCode.length;
192
+ }
193
+ if (typeof sourceMap.endOffset === 'number') {
194
+ sourceMap.endOffset -= preCode.length;
195
+ }
196
+ // たとえば preCode = 'abc\ndef\nghi' のとき、line -= 2 して、先頭行なら column -= 3 もする。
197
+ if (preCode !== '') {
198
+ const lines = preCode.split('\n');
199
+ if (typeof sourceMap.line === 'number') {
200
+ sourceMap.line -= lines.length - 1;
201
+ }
202
+ if (sourceMap.line === 0 && typeof sourceMap.column === 'number') {
203
+ sourceMap.column -= lines[lines.length - 1].length;
204
+ }
205
+ }
206
+ return sourceMap;
207
+ }
@@ -0,0 +1,262 @@
1
+
2
+ interface PreprocessItem {
3
+ text: string;
4
+ sourcePosition: number
5
+ }
6
+
7
+ /** prepareとtokenizeのソースマッピング */
8
+ export class SourceMappingOfTokenization {
9
+ private readonly sourceCodeLength: number;
10
+ private readonly preprocessed: PreprocessItem[];
11
+ private readonly cumulativeSum: number[];
12
+ private lastIndex: number;
13
+ private lastPreprocessedCodePosition: number;
14
+ /**
15
+ * @param {number} sourceCodeLength
16
+ * @param {PreprocessItem[]} preprocessed
17
+ */
18
+ constructor (sourceCodeLength: number, preprocessed: PreprocessItem[]) {
19
+ /** @private @readonly */
20
+ this.sourceCodeLength = sourceCodeLength
21
+
22
+ /** @private @readonly */
23
+ this.preprocessed = preprocessed
24
+
25
+ let i = 0
26
+ /** @private @readonly @type {number[]} */
27
+ this.cumulativeSum = []
28
+ for (const el of preprocessed) {
29
+ this.cumulativeSum.push(i)
30
+ i += el.text.length
31
+ }
32
+
33
+ /** @private */
34
+ this.lastIndex = 0
35
+ /** @private */
36
+ this.lastPreprocessedCodePosition = 0
37
+ }
38
+
39
+ /**
40
+ * preprocess後の文字列上のoffsetからソースコード上のoffsetへ変換
41
+ * @param {number} preprocessedCodePosition
42
+ * @returns {number}
43
+ */
44
+ map (preprocessedCodePosition: number): number {
45
+ const i = this.findIndex(preprocessedCodePosition)
46
+ return Math.min(
47
+ this.preprocessed[i].sourcePosition + (preprocessedCodePosition - this.cumulativeSum[i]),
48
+ i === this.preprocessed.length - 1 ? this.sourceCodeLength : this.preprocessed[i + 1].sourcePosition - 1
49
+ )
50
+ }
51
+
52
+ /**
53
+ * @param {number} preprocessedCodePosition
54
+ * @returns {number}
55
+ */
56
+ findIndex (preprocessedCodePosition: number): number {
57
+ // 連続アクセスに対する高速化
58
+ if (preprocessedCodePosition < this.lastPreprocessedCodePosition) {
59
+ this.lastIndex = 0
60
+ }
61
+ this.lastPreprocessedCodePosition = preprocessedCodePosition
62
+
63
+ for (let i = this.lastIndex; i < this.preprocessed.length - 1; i++) {
64
+ if (preprocessedCodePosition < this.cumulativeSum[i + 1]) {
65
+ this.lastIndex = i
66
+ return i
67
+ }
68
+ }
69
+
70
+ this.lastIndex = this.preprocessed.length - 1
71
+ return this.preprocessed.length - 1
72
+ }
73
+ }
74
+
75
+ export class SourceMappingOfIndentSyntax {
76
+ private lines: { offset: number, len: number }[];
77
+ private readonly linesInsertedByIndentationSyntax: number[];
78
+ private readonly linesDeletedByIndentationSyntax: { lineNumber: number, len: number }[];
79
+ lastLineNumber: number;
80
+ lastOffset: number;
81
+ /**
82
+ * @param {string} codeAfterProcessingIndentationSyntax
83
+ * @param {readonly number[]} linesInsertedByIndentationSyntax
84
+ * @param {readonly { lineNumber: number, len: number }[]} linesDeletedByIndentationSyntax
85
+ */
86
+ constructor (
87
+ codeAfterProcessingIndentationSyntax: string,
88
+ linesInsertedByIndentationSyntax: number[],
89
+ linesDeletedByIndentationSyntax: { lineNumber: number, len: number }[]
90
+ ) {
91
+ /** @private @type {{ offset: number, len: number }[]} */
92
+ this.lines = []
93
+
94
+ /** @private @readonly */
95
+ this.linesInsertedByIndentationSyntax = linesInsertedByIndentationSyntax
96
+
97
+ /** @private @readonly */
98
+ this.linesDeletedByIndentationSyntax = linesDeletedByIndentationSyntax
99
+
100
+ let offset = 0
101
+ for (const line of codeAfterProcessingIndentationSyntax.split('\n')) {
102
+ this.lines.push({ offset, len: line.length })
103
+ offset += line.length + 1
104
+ }
105
+
106
+ /** @private */
107
+ this.lastLineNumber = 0
108
+ /** @private */
109
+ this.lastOffset = 0
110
+ }
111
+
112
+ /**
113
+ * @param {number | null} startOffset
114
+ * @param {number | null} endOffset
115
+ * @returns {{ startOffset: number | null, endOffset: number | null }}
116
+ */
117
+ map (startOffset: number | null, endOffset:number | null): { startOffset: number | null, endOffset: number | null } {
118
+ if (startOffset === null) {
119
+ return { startOffset, endOffset }
120
+ }
121
+
122
+ // 何行目かを判定
123
+ const tokenLine = this.getLineNumber(startOffset)
124
+
125
+ for (const insertedLine of this.linesInsertedByIndentationSyntax) {
126
+ // インデント構文の処理後のソースコードの `insertedLine` 行目にあるトークンのソースマップ情報を削除する。
127
+ if (tokenLine === insertedLine) {
128
+ startOffset = null
129
+ endOffset = null
130
+ break
131
+ }
132
+
133
+ // インデント構文の処理後のソースコードの `insertedLine` 行目以降にあるトークンのoffsetから
134
+ // `linesInsertedByIndentationSyntax[i]` 行目の文字数(\rを含む) を引く。
135
+ if (tokenLine > insertedLine) {
136
+ // "\n"の分1足す
137
+ startOffset -= this.lines[insertedLine].len + 1
138
+ if (endOffset !== null) {
139
+ endOffset -= this.lines[insertedLine].len + 1
140
+ }
141
+ }
142
+ }
143
+ for (const deletedLine of this.linesDeletedByIndentationSyntax) {
144
+ if (tokenLine >= deletedLine.lineNumber) {
145
+ // "\n"の分1足す
146
+ if (startOffset !== null) {
147
+ startOffset += deletedLine.len + 1
148
+ }
149
+ if (endOffset !== null) {
150
+ endOffset += deletedLine.len + 1
151
+ }
152
+ }
153
+ }
154
+
155
+ return { startOffset, endOffset }
156
+ }
157
+
158
+ /**
159
+ * @param {number} offset
160
+ * @returns {number}
161
+ * @private
162
+ */
163
+ getLineNumber (offset: number): number {
164
+ // 連続アクセスに対する高速化
165
+ if (offset < this.lastOffset) {
166
+ this.lastLineNumber = 0
167
+ }
168
+ this.lastOffset = offset
169
+
170
+ for (let i = this.lastLineNumber; i < this.lines.length - 1; i++) {
171
+ if (offset < this.lines[i + 1].offset) {
172
+ this.lastLineNumber = i
173
+ return i
174
+ }
175
+ }
176
+
177
+ this.lastLineNumber = this.lines.length - 1
178
+ return this.lines.length - 1
179
+ }
180
+ }
181
+
182
+ /** offsetから (line, column) へ変換する。 */
183
+ export class OffsetToLineColumn {
184
+ private lineOffsets: number[];
185
+ private lastLineNumber: number;
186
+ private lastOffset: number;
187
+ /**
188
+ * @param {string} code
189
+ */
190
+ constructor (code: string) {
191
+ /** @private @type {number[]} */
192
+ this.lineOffsets = []
193
+
194
+ // 各行の先頭位置を先に計算しておく
195
+ let offset = 0
196
+ for (const line of code.split('\n')) {
197
+ this.lineOffsets.push(offset)
198
+ offset += line.length + 1
199
+ }
200
+
201
+ /** @private */
202
+ this.lastLineNumber = 0
203
+ /** @private */
204
+ this.lastOffset = 0
205
+ }
206
+
207
+ /**
208
+ * @param {number} offset
209
+ * @param {boolean} oneBasedLineNumber trueのときlineを1から始める
210
+ * @returns {{ line: number, column: number }}
211
+ */
212
+ map (offset: number, oneBasedLineNumber: boolean):{ line: number, column: number } {
213
+ // 連続アクセスに対する高速化
214
+ if (offset < this.lastOffset) {
215
+ this.lastLineNumber = 0
216
+ }
217
+ this.lastOffset = offset
218
+
219
+ for (let i = this.lastLineNumber; i < this.lineOffsets.length - 1; i++) {
220
+ if (offset < this.lineOffsets[i + 1]) {
221
+ this.lastLineNumber = i
222
+ return {
223
+ line: i + (oneBasedLineNumber ? 1 : 0),
224
+ column: offset - this.lineOffsets[i]
225
+ }
226
+ }
227
+ }
228
+
229
+ this.lastLineNumber = this.lineOffsets.length - 1
230
+ return {
231
+ line: this.lineOffsets.length - 1 + (oneBasedLineNumber ? 1 : 0),
232
+ column: offset - this.lineOffsets[this.lineOffsets.length - 1]
233
+ }
234
+ }
235
+ }
236
+
237
+ /**
238
+ * preCodeの分、ソースマップのoffset、行数、列数を減らす。
239
+ * @type {<T extends {line?: number, column?: number, startOffset: number | null, endOffset: number | null }>(sourceMap: T, preCode: string) => T}
240
+ */
241
+ export function subtractSourceMapByPreCodeLength (sourceMap: any, preCode: string) {
242
+ // offsetは単純に引くだけでよい
243
+ if (typeof sourceMap.startOffset === 'number') {
244
+ sourceMap.startOffset -= preCode.length
245
+ }
246
+ if (typeof sourceMap.endOffset === 'number') {
247
+ sourceMap.endOffset -= preCode.length
248
+ }
249
+
250
+ // たとえば preCode = 'abc\ndef\nghi' のとき、line -= 2 して、先頭行なら column -= 3 もする。
251
+ if (preCode !== '') {
252
+ const lines = preCode.split('\n')
253
+ if (typeof sourceMap.line === 'number') {
254
+ sourceMap.line -= lines.length - 1
255
+ }
256
+ if (sourceMap.line === 0 && typeof sourceMap.column === 'number') {
257
+ sourceMap.column -= lines[lines.length - 1].length
258
+ }
259
+ }
260
+
261
+ return sourceMap
262
+ }
@@ -0,0 +1,37 @@
1
+ class NakoTest {
2
+ constructor () {
3
+ /** @type {{ name: string, f: () => void }[]} */
4
+ this.tests = []
5
+ }
6
+
7
+ /** @param {any} a, @param {any} b */
8
+ static assertStrictEqual (a, b) {
9
+ if (a !== b) {
10
+ throw new Error('')
11
+ }
12
+ }
13
+
14
+ /** @param {unknown} a */
15
+ static inspect (a) {
16
+ switch (typeof a) {
17
+ case 'bigint': return `bigint値『${a}』`
18
+ case 'boolean': return a + ''
19
+ case 'function': return `関数『${a.name}』`
20
+ case 'number': return `数値${a}`
21
+ case 'object':
22
+ if (a === null) {
23
+ return a + ''
24
+ }
25
+ try {
26
+ return `オブジェクト『${JSON.stringify(a)}』`
27
+ } catch (e) { // 循環参照など
28
+ return `オブジェクト『${a}』`
29
+ }
30
+ case 'string': return `文字列『${a}』`
31
+ case 'symbol': return `シンボル『${a.toString()}』`
32
+ case 'undefined': return a + ''
33
+ }
34
+ }
35
+ }
36
+
37
+ module.exports = NakoTest
@@ -0,0 +1,25 @@
1
+ /**
2
+ * なでしこ3 の TypeScript のための型定義
3
+ */
4
+ export function NewEmptyToken(type = '?', value = {}, line = 0, file = 'main.nako3') {
5
+ return {
6
+ type,
7
+ value,
8
+ line,
9
+ column: 0,
10
+ file,
11
+ josi: ''
12
+ };
13
+ }
14
+ /**
15
+ * コンパイルオプション
16
+ */
17
+ export class CompilerOptions {
18
+ constructor(initObj = {}) {
19
+ this.testOnly = initObj.testOnly || false;
20
+ this.resetEnv = initObj.resetEnv || false;
21
+ this.resetAll = initObj.resetAll || false;
22
+ this.preCode = initObj.preCode || '';
23
+ this.nakoGlobal = initObj.nakoGlobal || null;
24
+ }
25
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * なでしこ3 の TypeScript のための型定義
3
+ */
4
+
5
+ import { NakoGlobal } from './nako_global.mjs'
6
+
7
+ // 関数に関する定義
8
+ export type FuncArgs = string[][]
9
+
10
+ // FuncListの定義
11
+ export interface FuncListItem {
12
+ type: 'func' | 'var' | 'const' | 'test_func';
13
+ value?: any;
14
+ josi?: FuncArgs;
15
+ isVariableJosi?: boolean;
16
+ fn?: null | ((...args: any[]) => any) | string;
17
+ varnames?: string[];
18
+ funcPointers?: any[];
19
+ asyncFn?: boolean;
20
+ // eslint-disable-next-line camelcase
21
+ return_none?: boolean;
22
+ pure?: boolean;
23
+ name?: string;
24
+ }
25
+
26
+ // 関数の一覧
27
+ export type FuncList = {[key: string]: FuncListItem};
28
+
29
+ // トークンのメタ情報
30
+ export interface TokenMeta {
31
+ josi: FuncArgs | undefined;
32
+ varnames: string[] | undefined;
33
+ funcPointers: any[] | undefined;
34
+ }
35
+
36
+ // トークン
37
+ export interface Token {
38
+ type: string;
39
+ value: any;
40
+ line: number;
41
+ column: number;
42
+ file: string;
43
+ josi: string;
44
+ meta?: FuncListItem;
45
+ rawJosi?: string;
46
+ startOffset?: number | undefined;
47
+ endOffset?: number | undefined;
48
+ isDefinition?: boolean;
49
+ funcPointer?: boolean;
50
+ tag?: string;
51
+ preprocessedCodeOffset?: number | undefined;
52
+ preprocessedCodeLength?: number | undefined;
53
+ // eslint-disable-next-line no-use-before-define
54
+ name?: Token | Ast; // NakoPaserBase.nodeToStrの問題を回避するため
55
+ start?: number;
56
+ end?: number;
57
+ firstToken?: Token;
58
+ lastToken?: Token;
59
+ }
60
+
61
+ export function NewEmptyToken (type = '?', value: any = {}, line = 0, file = 'main.nako3'): Token {
62
+ return {
63
+ type,
64
+ value,
65
+ line,
66
+ column: 0,
67
+ file,
68
+ josi: ''
69
+ }
70
+ }
71
+
72
+ export interface Ast {
73
+ type: string;
74
+ cond?: Ast[] | Ast;
75
+ expr?: Ast[] | Ast; // todo: cond と共通化できそう
76
+ block?: Ast[] | Ast;
77
+ target?: Ast[] | Ast | null; // 反復
78
+ blocks?: Ast[]; // todo: 逐次実行でのみ使われるので、今後削除可能
79
+ errorBlock?: Ast[] | Ast; // todo: 逐次実行でのみ使われるので、今後削除可能
80
+ errBlock?: Ast[] | Ast; // todo: エラー監視の中でのみ使われる
81
+ cases?: any[]; // 条件分岐
82
+ operator?: string; // 演算子の場合
83
+ left?: Ast | Ast[]; // 演算子の場合
84
+ right?: Ast | Ast[]; // 演算子の場合
85
+ // eslint-disable-next-line camelcase
86
+ false_block?: Ast[] | Ast; // if
87
+ from?: Ast[] | Ast; // for
88
+ to?: Ast[] | Ast; // for
89
+ inc?: Ast[] | Ast | null; // for
90
+ word?: Ast | null; // for
91
+ name?: Token | Ast | null | string;
92
+ names?: Ast[];
93
+ args?: Ast[]; // 関数の引数
94
+ asyncFn?: boolean; // 関数の定義
95
+ meta?: any; // 関数の定義
96
+ setter?: boolean; // 関数の定義
97
+ index?: Ast[]; // 配列へのアクセスに利用
98
+ josi?: string;
99
+ value?: any;
100
+ mode?: string; // 文字列の展開などで利用
101
+ line: number;
102
+ column?: number;
103
+ file?: string;
104
+ startOffset?: number | undefined;
105
+ endOffset?: number | undefined;
106
+ rawJosi?: string;
107
+ vartype?: string;
108
+ end?: {
109
+ startOffset: number | undefined;
110
+ endOffset: number | undefined;
111
+ line?: number;
112
+ column?: number;
113
+ }
114
+ tag?: string;
115
+ genMode?: string;
116
+ checkInit?: boolean;
117
+ options?: { [key: string]: boolean };
118
+ }
119
+
120
+ export interface SourceMap {
121
+ startOffset: number | undefined;
122
+ endOffset: number | undefined;
123
+ file: string | undefined;
124
+ line: number;
125
+ column: number;
126
+ }
127
+
128
+ /**
129
+ * コンパイルオプション
130
+ */
131
+ export class CompilerOptions {
132
+ resetEnv: boolean; // 現在の環境をリセット
133
+ testOnly: boolean; // テストだけを実行する
134
+ resetAll: boolean; // 全ての環境をリセット
135
+ preCode: string; // 環境を構築するためのコード
136
+ nakoGlobal: NakoGlobal | null; // 実行に使う環境
137
+ constructor (initObj: any = {}) {
138
+ this.testOnly = initObj.testOnly || false
139
+ this.resetEnv = initObj.resetEnv || false
140
+ this.resetAll = initObj.resetAll || false
141
+ this.preCode = initObj.preCode || ''
142
+ this.nakoGlobal = initObj.nakoGlobal || null
143
+ }
144
+ }
145
+
146
+ export type NakoComEventName = 'finish' | 'beforeRun' | 'beforeGenerate' | 'afterGenerate' | 'beforeParse'
147
+
148
+ export interface NakoEvent {
149
+ eventName: NakoComEventName
150
+ callback: (event: any) => void
151
+ }