From cf2e784581df4d24b03b85f0ac02514a166150b6 Mon Sep 17 00:00:00 2001 From: Li Jin <dragon-fly@qq.com> Date: Fri, 22 Sep 2023 11:53:24 +0800 Subject: fixing issue #149. --- doc/docs/doc/README.md | 4 ++++ doc/docs/zh/doc/README.md | 4 ++++ spec/inputs/import.yue | 4 ++++ spec/outputs/import.lua | 23 +++++++++++++++++++++++ src/yuescript/yue_ast.cpp | 2 +- src/yuescript/yue_ast.h | 4 ++-- src/yuescript/yue_compiler.cpp | 11 ++++++++--- 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 import insert, concat from table -- report error when assigning to insert, concat import C, Ct, Cmt from require "lpeg" + -- shortcut for implicit requiring + import x, y, z from 'mymodule' -- shortcut for requring a module do @@ -708,6 +710,8 @@ do import insert, concat from table -- report error when assigning to insert, concat import C, Ct, Cmt from require "lpeg" + -- shortcut for implicit requiring + import x, y, z from 'mymodule' -- shortcut for requring a module 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 import insert, concat from table -- 当给 insert, concat 变量赋值时,编译器会报告错误 import C, Ct, Cmt from require "lpeg" + -- 快捷写法引入模块的子项 + import x, y, z from 'mymodule' -- 快捷地导入一个模块 do @@ -706,6 +708,8 @@ do import insert, concat from table -- 当给 insert, concat 变量赋值时,编译器会报告错误 import C, Ct, Cmt from require "lpeg" + -- 快捷写法引入模块的子项 + import x, y, z from 'mymodule' -- 快捷地导入一个模块 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 c from z +do + import p from "yue" + import item from 'module.part' + import x1, y1, \z1 from "mymodule" do 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 @@ -56,6 +56,29 @@ end do local a, b, c = z.a, z.b, z.c end +do + local p + do + local _obj_1 = require("yue") + p = _obj_1.p + end + local item + do + local _obj_1 = require('module.part') + item = _obj_1.item + end + local x1, y1, z1 + do + local _obj_1 = require("mymodule") + x1, y1, z1 = _obj_1.x1, _obj_1.y1, (function() + local _base_0 = _obj_1 + local _fn_0 = _base_0.z1 + return _fn_0 and function(...) + return _fn_0(_base_0, ...) + end + end)() + end +end do local module = require('module') local module_x = require('module_x') 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 { for (auto name : names.objects()) { temp.emplace_back(name->to_string(ud)); } - return join(temp, ", "sv) + " from "s + exp->to_string(ud); + return join(temp, ", "sv) + " from "s + item->to_string(ud); } std::string MacroNamePair_t::to_string(void* ud) const { 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) AST_NODE(ImportFrom) ast_ptr<true, Seperator_t> sep; ast_sel_list<true, ColonImportName_t, Variable_t> names; - ast_ptr<true, Exp_t> exp; - AST_MEMBER(ImportFrom, &sep, &names, &exp) + ast_sel<true, ImportLiteral_t, Exp_t> item; + AST_MEMBER(ImportFrom, &sep, &names, &item) AST_END(ImportFrom, "import_from"sv) 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 = { "close"s // Lua 5.4 }; -const std::string_view version = "0.19.2"sv; +const std::string_view version = "0.19.3"sv; const std::string_view extension = "yue"sv; class CompileError : public std::logic_error { @@ -8375,13 +8375,18 @@ private: void transformImportFrom(ImportFrom_t* import, str_list& out) { str_list temp; auto x = import; - auto objVar = singleVariableFrom(import->exp, true); + auto objVar = singleVariableFrom(import->item, true); ast_ptr<false, ExpListAssign_t> objAssign; if (objVar.empty()) { objVar = getUnusedName("_obj_"sv); auto expList = toAst<ExpList_t>(objVar, x); auto assign = x->new_ptr<Assign_t>(); - assign->values.push_back(import->exp); + if (import->item.is<Exp_t>()) { + assign->values.push_back(import->item); + } else { + auto exp = toAst<Exp_t>("require "s + _parser.toString(import->item.to<ImportLiteral_t>()), import->item); + assign->values.push_back(exp); + } auto assignment = x->new_ptr<ExpListAssign_t>(); assignment->expList.set(expList); 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() { ColonImportName = '\\' >> space >> Variable; import_name = ColonImportName | Variable; import_name_list = Seperator >> *space_break >> space >> import_name >> *((+space_break | space >> ',' >> *space_break) >> space >> import_name); - ImportFrom = import_name_list >> *space_break >> space >> key("from") >> space >> Exp; + ImportFrom = import_name_list >> *space_break >> space >> key("from") >> space >> (ImportLiteral | not_(String) >> Exp); ImportLiteralInner = (range('a', 'z') | range('A', 'Z') | set("_-") | larger(255)) >> *(alpha_num | '-' | larger(255)); import_literal_chain = Seperator >> ImportLiteralInner >> *('.' >> ImportLiteralInner); -- cgit v1.2.3-55-g6feb