diff options
-rw-r--r-- | MoonPlus.vcxproj | 4 | ||||
-rw-r--r-- | src/MoonP/moon_compiler.cpp | 8 | ||||
-rw-r--r-- | src/MoonP/moon_compiler.h | 2 | ||||
-rw-r--r-- | src/linenoise.hpp | 9 | ||||
-rw-r--r-- | src/moonp.cpp | 64 |
5 files changed, 73 insertions, 14 deletions
diff --git a/MoonPlus.vcxproj b/MoonPlus.vcxproj index b6b7d1a..a42ccbf 100644 --- a/MoonPlus.vcxproj +++ b/MoonPlus.vcxproj | |||
@@ -73,21 +73,25 @@ | |||
73 | <LinkIncremental>true</LinkIncremental> | 73 | <LinkIncremental>true</LinkIncremental> |
74 | <IntDir>$(SolutionDir)\build\windows\$(Configuration)\</IntDir> | 74 | <IntDir>$(SolutionDir)\build\windows\$(Configuration)\</IntDir> |
75 | <OutDir>$(SolutionDir)\bin\windows\$(Configuration)\</OutDir> | 75 | <OutDir>$(SolutionDir)\bin\windows\$(Configuration)\</OutDir> |
76 | <TargetName>moonp</TargetName> | ||
76 | </PropertyGroup> | 77 | </PropertyGroup> |
77 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | 78 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
78 | <LinkIncremental>true</LinkIncremental> | 79 | <LinkIncremental>true</LinkIncremental> |
79 | <OutDir>$(SolutionDir)\bin\windows\$(Platform)\$(Configuration)\</OutDir> | 80 | <OutDir>$(SolutionDir)\bin\windows\$(Platform)\$(Configuration)\</OutDir> |
80 | <IntDir>$(SolutionDir)\build\windows\$(Platform)\$(Configuration)\</IntDir> | 81 | <IntDir>$(SolutionDir)\build\windows\$(Platform)\$(Configuration)\</IntDir> |
82 | <TargetName>moonp</TargetName> | ||
81 | </PropertyGroup> | 83 | </PropertyGroup> |
82 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | 84 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
83 | <LinkIncremental>false</LinkIncremental> | 85 | <LinkIncremental>false</LinkIncremental> |
84 | <IntDir>$(SolutionDir)\build\windows\$(Configuration)\</IntDir> | 86 | <IntDir>$(SolutionDir)\build\windows\$(Configuration)\</IntDir> |
85 | <OutDir>$(SolutionDir)\bin\windows\$(Configuration)\</OutDir> | 87 | <OutDir>$(SolutionDir)\bin\windows\$(Configuration)\</OutDir> |
88 | <TargetName>moonp</TargetName> | ||
86 | </PropertyGroup> | 89 | </PropertyGroup> |
87 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | 90 | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
88 | <LinkIncremental>false</LinkIncremental> | 91 | <LinkIncremental>false</LinkIncremental> |
89 | <OutDir>$(SolutionDir)\bin\windows\$(Platform)\$(Configuration)\</OutDir> | 92 | <OutDir>$(SolutionDir)\bin\windows\$(Platform)\$(Configuration)\</OutDir> |
90 | <IntDir>$(SolutionDir)\build\windows\$(Platform)\$(Configuration)\</IntDir> | 93 | <IntDir>$(SolutionDir)\build\windows\$(Platform)\$(Configuration)\</IntDir> |
94 | <TargetName>moonp</TargetName> | ||
91 | </PropertyGroup> | 95 | </PropertyGroup> |
92 | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | 96 | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
93 | <ClCompile> | 97 | <ClCompile> |
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp index e961a92..d036645 100644 --- a/src/MoonP/moon_compiler.cpp +++ b/src/MoonP/moon_compiler.cpp | |||
@@ -42,12 +42,12 @@ inline std::string s(std::string_view sv) { | |||
42 | return std::string(sv); | 42 | return std::string(sv); |
43 | } | 43 | } |
44 | 44 | ||
45 | const char* moonScriptVersion() { | 45 | const char* version() { |
46 | return "0.5.0-r0.3.6"; | 46 | return "0.3.6"; |
47 | } | 47 | } |
48 | 48 | ||
49 | // name of table stored in lua registry | 49 | // name of table stored in lua registry |
50 | #define MOONP_MODULE "_modules_" | 50 | #define MOONP_MODULE "__moon_modules__" |
51 | 51 | ||
52 | class MoonCompilerImpl { | 52 | class MoonCompilerImpl { |
53 | public: | 53 | public: |
@@ -61,6 +61,7 @@ public: | |||
61 | BLOCK_START | 61 | BLOCK_START |
62 | BREAK_IF(!sameModule); | 62 | BREAK_IF(!sameModule); |
63 | BREAK_IF(!L); | 63 | BREAK_IF(!L); |
64 | _sameModule = true; | ||
64 | int top = lua_gettop(L); | 65 | int top = lua_gettop(L); |
65 | DEFER(lua_settop(L, top)); | 66 | DEFER(lua_settop(L, top)); |
66 | lua_pushliteral(L, MOONP_MODULE); // MOONP_MODULE | 67 | lua_pushliteral(L, MOONP_MODULE); // MOONP_MODULE |
@@ -69,7 +70,6 @@ public: | |||
69 | int idx = static_cast<int>(lua_objlen(L, -1)); // idx = #tb, tb | 70 | int idx = static_cast<int>(lua_objlen(L, -1)); // idx = #tb, tb |
70 | BREAK_IF(idx == 0); | 71 | BREAK_IF(idx == 0); |
71 | _useModule = true; | 72 | _useModule = true; |
72 | _sameModule = true; | ||
73 | BLOCK_END | 73 | BLOCK_END |
74 | } | 74 | } |
75 | 75 | ||
diff --git a/src/MoonP/moon_compiler.h b/src/MoonP/moon_compiler.h index 573f130..d22a95a 100644 --- a/src/MoonP/moon_compiler.h +++ b/src/MoonP/moon_compiler.h | |||
@@ -17,7 +17,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI | |||
17 | 17 | ||
18 | namespace MoonP { | 18 | namespace MoonP { |
19 | 19 | ||
20 | const char* moonScriptVersion(); | 20 | const char* version(); |
21 | 21 | ||
22 | struct MoonConfig { | 22 | struct MoonConfig { |
23 | bool lintGlobalVariable = false; | 23 | bool lintGlobalVariable = false; |
diff --git a/src/linenoise.hpp b/src/linenoise.hpp index 923a006..b680141 100644 --- a/src/linenoise.hpp +++ b/src/linenoise.hpp | |||
@@ -1864,13 +1864,14 @@ inline void refreshSingleLine(struct linenoiseState *l) { | |||
1864 | /* Write the prompt and the current buffer content */ | 1864 | /* Write the prompt and the current buffer content */ |
1865 | ab += l->prompt; | 1865 | ab += l->prompt; |
1866 | ab.append(buf, len); | 1866 | ab.append(buf, len); |
1867 | if (ab.empty()) return; | ||
1868 | /* Erase to right */ | 1867 | /* Erase to right */ |
1869 | snprintf(seq,64,"\x1b[0K"); | 1868 | snprintf(seq,64,"\x1b[0K"); |
1870 | ab += seq; | 1869 | ab += seq; |
1871 | /* Move cursor to original position. */ | 1870 | if (!l->prompt.empty() || len != 0) { |
1872 | snprintf(seq,64,"\r\x1b[%dC", (int)(unicodeColumnPos(buf, pos)+pcolwid)); | 1871 | /* Move cursor to original position. */ |
1873 | ab += seq; | 1872 | snprintf(seq,64,"\r\x1b[%dC", (int)(unicodeColumnPos(buf, pos)+pcolwid)); |
1873 | ab += seq; | ||
1874 | } | ||
1874 | if (write(fd,ab.c_str(), static_cast<int>(ab.length())) == -1) {} /* Can't recover from write error. */ | 1875 | if (write(fd,ab.c_str(), static_cast<int>(ab.length())) == -1) {} /* Can't recover from write error. */ |
1875 | } | 1876 | } |
1876 | 1877 | ||
diff --git a/src/moonp.cpp b/src/moonp.cpp index a67a5a7..18eb059 100644 --- a/src/moonp.cpp +++ b/src/moonp.cpp | |||
@@ -96,17 +96,66 @@ int main(int narg, const char** args) { | |||
96 | return 1; | 96 | return 1; |
97 | } | 97 | } |
98 | int count = 0; | 98 | int count = 0; |
99 | bool quit = false; | ||
100 | linenoise::SetMultiLine(false); | 99 | linenoise::SetMultiLine(false); |
101 | while (!quit) { | 100 | linenoise::SetCompletionCallback([](const char* editBuffer, std::vector<std::string>& completions) { |
101 | std::string buf = editBuffer; | ||
102 | std::string tmp = buf; | ||
103 | MoonP::Utils::trim(tmp); | ||
104 | if (tmp.empty()) return; | ||
105 | std::string pre; | ||
106 | auto pos = buf.find_first_not_of(" \t\n"); | ||
107 | if (pos != std::string::npos) { | ||
108 | pre = buf.substr(0, pos); | ||
109 | } | ||
110 | switch (tmp[0]) { | ||
111 | case 'b': | ||
112 | completions.push_back(pre + "break"); | ||
113 | break; | ||
114 | case 'c': | ||
115 | completions.push_back(pre + "class "); | ||
116 | completions.push_back(pre + "continue"); | ||
117 | break; | ||
118 | case 'e': | ||
119 | completions.push_back(pre + "else"); | ||
120 | completions.push_back(pre + "export "); | ||
121 | break; | ||
122 | case 'i': | ||
123 | completions.push_back(pre + "import \""); | ||
124 | break; | ||
125 | case 'g': | ||
126 | completions.push_back(pre + "global "); | ||
127 | break; | ||
128 | case 'l': | ||
129 | completions.push_back(pre + "local "); | ||
130 | break; | ||
131 | case 'm': | ||
132 | completions.push_back(pre + "macro expr "); | ||
133 | completions.push_back(pre + "macro block "); | ||
134 | completions.push_back(pre + "macro lua "); | ||
135 | break; | ||
136 | case 's': | ||
137 | completions.push_back(pre + "switch "); | ||
138 | break; | ||
139 | case 'u': | ||
140 | completions.push_back(pre + "unless "); | ||
141 | break; | ||
142 | case 'w': | ||
143 | completions.push_back(pre + "with "); | ||
144 | completions.push_back(pre + "when "); | ||
145 | break; | ||
146 | } | ||
147 | }); | ||
148 | std::cout << "Moonscript+ "sv << MoonP::version() << '\n'; | ||
149 | while (true) { | ||
102 | count++; | 150 | count++; |
103 | std::string codes; | 151 | std::string codes; |
104 | quit = linenoise::Readline("moon> ", codes); | 152 | bool quit = linenoise::Readline("> ", codes); |
153 | if (quit) return 0; | ||
105 | linenoise::AddHistory(codes.c_str()); | 154 | linenoise::AddHistory(codes.c_str()); |
106 | MoonP::Utils::trim(codes); | 155 | MoonP::Utils::trim(codes); |
107 | if (codes == "$"sv) { | 156 | if (codes == "$"sv) { |
108 | codes.clear(); | 157 | codes.clear(); |
109 | for (std::string line; !linenoise::Readline("", line);) { | 158 | for (std::string line; !(quit = linenoise::Readline("", line));) { |
110 | auto temp = line; | 159 | auto temp = line; |
111 | MoonP::Utils::trim(temp); | 160 | MoonP::Utils::trim(temp); |
112 | if (temp == "$"sv) { | 161 | if (temp == "$"sv) { |
@@ -117,6 +166,7 @@ int main(int narg, const char** args) { | |||
117 | linenoise::AddHistory(line.c_str()); | 166 | linenoise::AddHistory(line.c_str()); |
118 | MoonP::Utils::trim(codes); | 167 | MoonP::Utils::trim(codes); |
119 | } | 168 | } |
169 | if (quit) return 0; | ||
120 | } | 170 | } |
121 | codes.insert(0, "global *\n"sv); | 171 | codes.insert(0, "global *\n"sv); |
122 | int top = lua_gettop(L); | 172 | int top = lua_gettop(L); |
@@ -132,6 +182,10 @@ int main(int narg, const char** args) { | |||
132 | } | 182 | } |
133 | if (lua_isnil(L, -2) != 0) { | 183 | if (lua_isnil(L, -2) != 0) { |
134 | std::string err = lua_tostring(L, -1); | 184 | std::string err = lua_tostring(L, -1); |
185 | auto modName = std::string("(repl "sv) + std::to_string(count) + "):"; | ||
186 | if (err.substr(0, modName.size()) == modName) { | ||
187 | err = err.substr(modName.size()); | ||
188 | } | ||
135 | auto pos = err.find(':'); | 189 | auto pos = err.find(':'); |
136 | if (pos != std::string::npos) { | 190 | if (pos != std::string::npos) { |
137 | int lineNum = std::stoi(err.substr(0, pos)); | 191 | int lineNum = std::stoi(err.substr(0, pos)); |
@@ -271,7 +325,7 @@ int main(int narg, const char** args) { | |||
271 | std::cout << help; | 325 | std::cout << help; |
272 | return 0; | 326 | return 0; |
273 | } else if (arg == "-v"sv) { | 327 | } else if (arg == "-v"sv) { |
274 | std::cout << "Moonscript version: "sv << MoonP::moonScriptVersion() << '\n'; | 328 | std::cout << "Moonscript+ version: "sv << MoonP::version() << '\n'; |
275 | return 0; | 329 | return 0; |
276 | } else if (arg == "-o"sv) { | 330 | } else if (arg == "-o"sv) { |
277 | ++i; | 331 | ++i; |