aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2021-02-18 11:54:14 +0800
committerLi Jin <dragon-fly@qq.com>2021-02-18 11:54:14 +0800
commit3ea3f9b1c42eae103c370a986f539a0f1550db9f (patch)
treea3e742d8dbae652c240db20b3a40d3532f387d20
parentcca77d89903fc3a28f8500d5621dc9ca7697ae1d (diff)
downloadyuescript-3ea3f9b1c42eae103c370a986f539a0f1550db9f.tar.gz
yuescript-3ea3f9b1c42eae103c370a986f539a0f1550db9f.tar.bz2
yuescript-3ea3f9b1c42eae103c370a986f539a0f1550db9f.zip
prevent inserting global or local statements with wildcard operators from macro. update changelog.
-rw-r--r--CHANGELOG.md59
-rw-r--r--src/yuescript/yue_compiler.cpp16
2 files changed, 57 insertions, 18 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf8a24e..3e1be05 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,15 +1,40 @@
1# Changelog 1# Changelog
2 2
3The implementation for original Moonscript language 0.5.0 can be found in the `0.5.0` branch of MoonPlus. The Moonscript with fixes and new features is in the master branch of MoonPlus. Here are the changelogs for each MoonPlus version. 3The implementation for original Moonscript language 0.5.0 can be found in the `0.5.0` branch of Yuescript. The Moonscript with fixes and new features is in the main branch of Yuescript. Here are the changelogs for each Yuescript version.
4 4
5 5
6## v0.6.6
7
8### Fixed Issues
9
10* Simplify macro syntax. Macro function can either return a code string or a config table.
11
12```moonscript
13macro local = (var)-> "global *"
14
15$local x
16x = 1
17y = 2
18z = 3
19
20macro local = (var)->
21 {
22 codes: "local #{var}"
23 type: "lua"
24 locals: {var}
25 }
26
27$local y
28y = 1
29```
30
31* Change Yuescript file extension to '.yue' because some of the Moonscript syntax are no longer supported and some codes written in Yuescript syntax won't be accepted by Moonscript compiler.
32*
6 33
7## v0.4.16 34## v0.4.16
8 35
9### Fixed Issues 36### Fixed Issues
10 37
11* Change MoonPlus file extension to '.mp' because some of the Moonscript syntax are no longer supported and some codes written in MoonPlus syntax won't be accepted by Moonscript compiler.
12
13* Remove support for escape new line symbol, binary operator expressions can now be written multiline without escape new line symbol. 38* Remove support for escape new line symbol, binary operator expressions can now be written multiline without escape new line symbol.
14 39
15* Fix an issue when extending class without name. 40* Fix an issue when extending class without name.
@@ -37,7 +62,7 @@ The implementation for original Moonscript language 0.5.0 can be found in the `0
37 okay = yeah, 62 okay = yeah,
38 fine = alright 63 fine = alright
39 }) 64 })
40 -- compiled in fixed MoonPlus compiler 65 -- compiled in fixed Yuescript compiler
41 -- get one table as argument 66 -- get one table as argument
42 another(hello, one, two, three, four, { 67 another(hello, one, two, three, four, {
43 yeah = man, 68 yeah = man,
@@ -163,13 +188,13 @@ The implementation for original Moonscript language 0.5.0 can be found in the `0
163 188
164* Add variadic arguments declaration check. 189* Add variadic arguments declaration check.
165 190
166* `moonp` now supports recursively traversing any directory and compiling any moon file in the path. 191* `yue` now supports recursively traversing any directory and compiling any moon file in the path.
167 192
168* `moonp` now supports REPL functions for Moonscript. 193* `yue` now supports REPL functions for Moonscript.
169 194
170* Add `useSpaceOverTab` function to `moonp`. 195* Add `useSpaceOverTab` function to `yue`.
171 196
172* Add Lua codes minify function to `moonp`. 197* Add Lua codes minify function to `yue`.
173 198
174 199
175 200
@@ -186,14 +211,14 @@ The implementation for original Moonscript language 0.5.0 can be found in the `0
186* Add macro functions. 211* Add macro functions.
187```Moonscript 212```Moonscript
188-- file 'macro.mp' 213-- file 'macro.mp'
189export macro block config = (debugging = true)-> 214export macro config = (debugging = true)->
190 global debugMode = debugging == "true" 215 global debugMode = debugging == "true"
191 "" 216 ""
192 217
193export macro block asserts = (cond)-> 218export macro asserts = (cond)->
194 debugMode and "assert #{cond}" or "" 219 debugMode and "assert #{cond}" or ""
195 220
196export macro expr assert = (cond)-> 221export macro assert = (cond)->
197 debugMode and "assert #{cond}" or "#{cond}" 222 debugMode and "assert #{cond}" or "#{cond}"
198 223
199$config! 224$config!
@@ -201,7 +226,7 @@ $config!
201-- file 'main.mp' 226-- file 'main.mp'
202import 'macro' as {:$config, :$assert, :$asserts} 227import 'macro' as {:$config, :$assert, :$asserts}
203 228
204macro expr and = (...)-> "#{ table.concat {...}, ' and ' }" 229macro and = (...)-> "#{ table.concat {...}, ' and ' }"
205 230
206$asserts item ~= nil 231$asserts item ~= nil
207$config false 232$config false
@@ -243,11 +268,11 @@ From original Moonscript compiler:
243### Added Features 268### Added Features
244 269
245* Allow value lists in for and local statement to be multiline. 270* Allow value lists in for and local statement to be multiline.
246* `moonp` now compiles source files in multiple threads to speed up compilation. 271* `yue` now compiles source files in multiple threads to speed up compilation.
247* Add placeholder support for backcall operator. 272* Add placeholder support for backcall operator.
248* Add placeholder support for backcall statement. 273* Add placeholder support for backcall statement.
249* Add fat arrow support for backcall statement. 274* Add fat arrow support for backcall statement.
250* Add option to compile MoonPlus as a Lua C lib. Got MoonPlus released to `Luarocks`. 275* Add option to compile Yuescript as a Lua C lib. Got Yuescript released to `Luarocks`.
251* Move old `export` statement functions to `global` statement to match the `local` statement. 276* Move old `export` statement functions to `global` statement to match the `local` statement.
252* Change `export` statement behavier to support module management. Moon codes with `export` statement can not explicit return values in root scope. And codes with `export default` can export only one value as the module content. Use cases: 277* Change `export` statement behavier to support module management. Moon codes with `export` statement can not explicit return values in root scope. And codes with `export default` can export only one value as the module content. Use cases:
253```Moonscript 278```Moonscript
@@ -459,7 +484,7 @@ in original Moonscript compiles to:
459```Lua 484```Lua
460local f 485local f
461f = function(x) 486f = function(x)
462 local _ = "abc", 123 -- report error in MoonPlus 487 local _ = "abc", 123 -- report error in Yuescript
463 return x + 1 488 return x + 1
464end 489end
465``` 490```
@@ -491,7 +516,7 @@ tree:addChild((function()
491end)()) 516end)())
492 517
493-- codes added with a break will still run 518-- codes added with a break will still run
494local _ -- report error in MoonPlus instead of creating 519local _ -- report error in Yuescript instead of creating
495do -- an anonymous function to bind the object method 520do -- an anonymous function to bind the object method
496 local _base_0 = tree 521 local _base_0 = tree
497 local _fn_0 = _base_0.addChild 522 local _fn_0 = _base_0.addChild
@@ -506,7 +531,7 @@ end
506``` 531```
507 532
508* Reusing variables which helps generate reduced Lua codes. 533* Reusing variables which helps generate reduced Lua codes.
509 For example, MoonPlus will generate codes from: 534 For example, Yuescript will generate codes from:
510 535
511```Moonscript 536```Moonscript
512with leaf 537with leaf
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 4917e4e..7be0c84 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -58,7 +58,7 @@ inline std::string s(std::string_view sv) {
58 return std::string(sv); 58 return std::string(sv);
59} 59}
60 60
61const std::string_view version = "0.6.6"sv; 61const std::string_view version = "0.6.7"sv;
62const std::string_view extension = "yue"sv; 62const std::string_view extension = "yue"sv;
63 63
64class YueCompilerImpl { 64class YueCompilerImpl {
@@ -3460,6 +3460,20 @@ private:
3460 info.node.set(exp); 3460 info.node.set(exp);
3461 } 3461 }
3462 } 3462 }
3463 if (auto block = info.node.as<Block_t>()) {
3464 for (auto stmt_ : block->statements.objects()) {
3465 auto stmt = static_cast<Statement_t*>(stmt_);
3466 if (auto global = stmt->content.as<Global_t>()) {
3467 if (global->item.is<global_op_t>()) {
3468 throw std::logic_error(_info.errorMessage(s("can not insert global statement with wildcard operator from macro"sv), x));
3469 }
3470 } else if (auto local = stmt->content.as<Local_t>()) {
3471 if (local->item.is<local_flag_t>()) {
3472 throw std::logic_error(_info.errorMessage(s("can not insert local statement with wildcard operator from macro"sv), x));
3473 }
3474 }
3475 }
3476 }
3463 return {info.node, std::move(info.codes), Empty, std::move(localVars)}; 3477 return {info.node, std::move(info.codes), Empty, std::move(localVars)};
3464 } else { 3478 } else {
3465 if (!isBlock) throw std::logic_error(_info.errorMessage(s("failed to expanded empty macro as expr"sv), x)); 3479 if (!isBlock) throw std::logic_error(_info.errorMessage(s("failed to expanded empty macro as expr"sv), x));