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