diff options
Diffstat (limited to '')
| -rwxr-xr-x | doc/docs/doc/README.md | 4 | ||||
| -rwxr-xr-x | doc/docs/zh/doc/README.md | 4 | ||||
| -rw-r--r-- | spec/inputs/import.yue | 4 | ||||
| -rw-r--r-- | spec/outputs/import.lua | 23 | ||||
| -rw-r--r-- | src/yuescript/yue_ast.cpp | 2 | ||||
| -rw-r--r-- | src/yuescript/yue_ast.h | 4 | ||||
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 11 | ||||
| -rw-r--r-- | src/yuescript/yue_parser.cpp | 2 |
8 files changed, 47 insertions, 7 deletions
diff --git a/doc/docs/doc/README.md b/doc/docs/doc/README.md index 9b47d06..1087b9a 100755 --- a/doc/docs/doc/README.md +++ b/doc/docs/doc/README.md | |||
| @@ -687,6 +687,8 @@ do | |||
| 687 | import insert, concat from table | 687 | import insert, concat from table |
| 688 | -- report error when assigning to insert, concat | 688 | -- report error when assigning to insert, concat |
| 689 | import C, Ct, Cmt from require "lpeg" | 689 | import C, Ct, Cmt from require "lpeg" |
| 690 | -- shortcut for implicit requiring | ||
| 691 | import x, y, z from 'mymodule' | ||
| 690 | 692 | ||
| 691 | -- shortcut for requring a module | 693 | -- shortcut for requring a module |
| 692 | do | 694 | do |
| @@ -708,6 +710,8 @@ do | |||
| 708 | import insert, concat from table | 710 | import insert, concat from table |
| 709 | -- report error when assigning to insert, concat | 711 | -- report error when assigning to insert, concat |
| 710 | import C, Ct, Cmt from require "lpeg" | 712 | import C, Ct, Cmt from require "lpeg" |
| 713 | -- shortcut for implicit requiring | ||
| 714 | import x, y, z from 'mymodule' | ||
| 711 | 715 | ||
| 712 | -- shortcut for requring a module | 716 | -- shortcut for requring a module |
| 713 | do | 717 | do |
diff --git a/doc/docs/zh/doc/README.md b/doc/docs/zh/doc/README.md index 3ae6af7..472ac15 100755 --- a/doc/docs/zh/doc/README.md +++ b/doc/docs/zh/doc/README.md | |||
| @@ -685,6 +685,8 @@ do | |||
| 685 | import insert, concat from table | 685 | import insert, concat from table |
| 686 | -- 当给 insert, concat 变量赋值时,编译器会报告错误 | 686 | -- 当给 insert, concat 变量赋值时,编译器会报告错误 |
| 687 | import C, Ct, Cmt from require "lpeg" | 687 | import C, Ct, Cmt from require "lpeg" |
| 688 | -- 快捷写法引入模块的子项 | ||
| 689 | import x, y, z from 'mymodule' | ||
| 688 | 690 | ||
| 689 | -- 快捷地导入一个模块 | 691 | -- 快捷地导入一个模块 |
| 690 | do | 692 | do |
| @@ -706,6 +708,8 @@ do | |||
| 706 | import insert, concat from table | 708 | import insert, concat from table |
| 707 | -- 当给 insert, concat 变量赋值时,编译器会报告错误 | 709 | -- 当给 insert, concat 变量赋值时,编译器会报告错误 |
| 708 | import C, Ct, Cmt from require "lpeg" | 710 | import C, Ct, Cmt from require "lpeg" |
| 711 | -- 快捷写法引入模块的子项 | ||
| 712 | import x, y, z from 'mymodule' | ||
| 709 | 713 | ||
| 710 | -- 快捷地导入一个模块 | 714 | -- 快捷地导入一个模块 |
| 711 | do | 715 | do |
diff --git a/spec/inputs/import.yue b/spec/inputs/import.yue index 73e05d2..eb2a487 100644 --- a/spec/inputs/import.yue +++ b/spec/inputs/import.yue | |||
| @@ -41,6 +41,10 @@ do | |||
| 41 | c | 41 | c |
| 42 | from z | 42 | from z |
| 43 | 43 | ||
| 44 | do | ||
| 45 | import p from "yue" | ||
| 46 | import item from 'module.part' | ||
| 47 | import x1, y1, \z1 from "mymodule" | ||
| 44 | 48 | ||
| 45 | do | 49 | do |
| 46 | import 'module' | 50 | import 'module' |
diff --git a/spec/outputs/import.lua b/spec/outputs/import.lua index 02fe42a..b384d9d 100644 --- a/spec/outputs/import.lua +++ b/spec/outputs/import.lua | |||
| @@ -57,6 +57,29 @@ do | |||
| 57 | local a, b, c = z.a, z.b, z.c | 57 | local a, b, c = z.a, z.b, z.c |
| 58 | end | 58 | end |
| 59 | do | 59 | do |
| 60 | local p | ||
| 61 | do | ||
| 62 | local _obj_1 = require("yue") | ||
| 63 | p = _obj_1.p | ||
| 64 | end | ||
| 65 | local item | ||
| 66 | do | ||
| 67 | local _obj_1 = require('module.part') | ||
| 68 | item = _obj_1.item | ||
| 69 | end | ||
| 70 | local x1, y1, z1 | ||
| 71 | do | ||
| 72 | local _obj_1 = require("mymodule") | ||
| 73 | x1, y1, z1 = _obj_1.x1, _obj_1.y1, (function() | ||
| 74 | local _base_0 = _obj_1 | ||
| 75 | local _fn_0 = _base_0.z1 | ||
| 76 | return _fn_0 and function(...) | ||
| 77 | return _fn_0(_base_0, ...) | ||
| 78 | end | ||
| 79 | end)() | ||
| 80 | end | ||
| 81 | end | ||
| 82 | do | ||
| 60 | local module = require('module') | 83 | local module = require('module') |
| 61 | local module_x = require('module_x') | 84 | local module_x = require('module_x') |
| 62 | local d_a_s_h_e_s = require("d-a-s-h-e-s") | 85 | local d_a_s_h_e_s = require("d-a-s-h-e-s") |
diff --git a/src/yuescript/yue_ast.cpp b/src/yuescript/yue_ast.cpp index 105bd74..39f19ea 100644 --- a/src/yuescript/yue_ast.cpp +++ b/src/yuescript/yue_ast.cpp | |||
| @@ -269,7 +269,7 @@ std::string ImportFrom_t::to_string(void* ud) const { | |||
| 269 | for (auto name : names.objects()) { | 269 | for (auto name : names.objects()) { |
| 270 | temp.emplace_back(name->to_string(ud)); | 270 | temp.emplace_back(name->to_string(ud)); |
| 271 | } | 271 | } |
| 272 | return join(temp, ", "sv) + " from "s + exp->to_string(ud); | 272 | return join(temp, ", "sv) + " from "s + item->to_string(ud); |
| 273 | } | 273 | } |
| 274 | std::string MacroNamePair_t::to_string(void* ud) const { | 274 | std::string MacroNamePair_t::to_string(void* ud) const { |
| 275 | return key->to_string(ud) + ": "s + value->to_string(ud); | 275 | return key->to_string(ud) + ": "s + value->to_string(ud); |
diff --git a/src/yuescript/yue_ast.h b/src/yuescript/yue_ast.h index a7f897c..78f6c9f 100644 --- a/src/yuescript/yue_ast.h +++ b/src/yuescript/yue_ast.h | |||
| @@ -191,8 +191,8 @@ AST_END(ImportLiteral, "import_literal"sv) | |||
| 191 | AST_NODE(ImportFrom) | 191 | AST_NODE(ImportFrom) |
| 192 | ast_ptr<true, Seperator_t> sep; | 192 | ast_ptr<true, Seperator_t> sep; |
| 193 | ast_sel_list<true, ColonImportName_t, Variable_t> names; | 193 | ast_sel_list<true, ColonImportName_t, Variable_t> names; |
| 194 | ast_ptr<true, Exp_t> exp; | 194 | ast_sel<true, ImportLiteral_t, Exp_t> item; |
| 195 | AST_MEMBER(ImportFrom, &sep, &names, &exp) | 195 | AST_MEMBER(ImportFrom, &sep, &names, &item) |
| 196 | AST_END(ImportFrom, "import_from"sv) | 196 | AST_END(ImportFrom, "import_from"sv) |
| 197 | 197 | ||
| 198 | AST_NODE(MacroNamePair) | 198 | AST_NODE(MacroNamePair) |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 42b92a4..3c11429 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -74,7 +74,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
| 74 | "close"s // Lua 5.4 | 74 | "close"s // Lua 5.4 |
| 75 | }; | 75 | }; |
| 76 | 76 | ||
| 77 | const std::string_view version = "0.19.2"sv; | 77 | const std::string_view version = "0.19.3"sv; |
| 78 | const std::string_view extension = "yue"sv; | 78 | const std::string_view extension = "yue"sv; |
| 79 | 79 | ||
| 80 | class CompileError : public std::logic_error { | 80 | class CompileError : public std::logic_error { |
| @@ -8375,13 +8375,18 @@ private: | |||
| 8375 | void transformImportFrom(ImportFrom_t* import, str_list& out) { | 8375 | void transformImportFrom(ImportFrom_t* import, str_list& out) { |
| 8376 | str_list temp; | 8376 | str_list temp; |
| 8377 | auto x = import; | 8377 | auto x = import; |
| 8378 | auto objVar = singleVariableFrom(import->exp, true); | 8378 | auto objVar = singleVariableFrom(import->item, true); |
| 8379 | ast_ptr<false, ExpListAssign_t> objAssign; | 8379 | ast_ptr<false, ExpListAssign_t> objAssign; |
| 8380 | if (objVar.empty()) { | 8380 | if (objVar.empty()) { |
| 8381 | objVar = getUnusedName("_obj_"sv); | 8381 | objVar = getUnusedName("_obj_"sv); |
| 8382 | auto expList = toAst<ExpList_t>(objVar, x); | 8382 | auto expList = toAst<ExpList_t>(objVar, x); |
| 8383 | auto assign = x->new_ptr<Assign_t>(); | 8383 | auto assign = x->new_ptr<Assign_t>(); |
| 8384 | assign->values.push_back(import->exp); | 8384 | if (import->item.is<Exp_t>()) { |
| 8385 | assign->values.push_back(import->item); | ||
| 8386 | } else { | ||
| 8387 | auto exp = toAst<Exp_t>("require "s + _parser.toString(import->item.to<ImportLiteral_t>()), import->item); | ||
| 8388 | assign->values.push_back(exp); | ||
| 8389 | } | ||
| 8385 | auto assignment = x->new_ptr<ExpListAssign_t>(); | 8390 | auto assignment = x->new_ptr<ExpListAssign_t>(); |
| 8386 | assignment->expList.set(expList); | 8391 | assignment->expList.set(expList); |
| 8387 | assignment->action.set(assign); | 8392 | assignment->action.set(assign); |
diff --git a/src/yuescript/yue_parser.cpp b/src/yuescript/yue_parser.cpp index ff7660a..6ba9b13 100644 --- a/src/yuescript/yue_parser.cpp +++ b/src/yuescript/yue_parser.cpp | |||
| @@ -285,7 +285,7 @@ YueParser::YueParser() { | |||
| 285 | ColonImportName = '\\' >> space >> Variable; | 285 | ColonImportName = '\\' >> space >> Variable; |
| 286 | import_name = ColonImportName | Variable; | 286 | import_name = ColonImportName | Variable; |
| 287 | import_name_list = Seperator >> *space_break >> space >> import_name >> *((+space_break | space >> ',' >> *space_break) >> space >> import_name); | 287 | import_name_list = Seperator >> *space_break >> space >> import_name >> *((+space_break | space >> ',' >> *space_break) >> space >> import_name); |
| 288 | ImportFrom = import_name_list >> *space_break >> space >> key("from") >> space >> Exp; | 288 | ImportFrom = import_name_list >> *space_break >> space >> key("from") >> space >> (ImportLiteral | not_(String) >> Exp); |
| 289 | 289 | ||
| 290 | ImportLiteralInner = (range('a', 'z') | range('A', 'Z') | set("_-") | larger(255)) >> *(alpha_num | '-' | larger(255)); | 290 | ImportLiteralInner = (range('a', 'z') | range('A', 'Z') | set("_-") | larger(255)) >> *(alpha_num | '-' | larger(255)); |
| 291 | import_literal_chain = Seperator >> ImportLiteralInner >> *('.' >> ImportLiteralInner); | 291 | import_literal_chain = Seperator >> ImportLiteralInner >> *('.' >> ImportLiteralInner); |
