mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix splitCollect and type hint inner default
This commit is contained in:
parent
165cc7d041
commit
dfe17ff3b9
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,7 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=socket.thread"
|
||||
// "--gtest_filter=parser.def_add"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
@ -1013,7 +1013,7 @@ char* Cursor_popToken(Args* buffs, char** pStmt, char* devide) {
|
||||
}
|
||||
|
||||
char* Cursor_splitCollect(Args* buffs, char* stmt, char* devide, int index) {
|
||||
Arg* out_arg = arg_newStr("");
|
||||
Arg* aOut = arg_newStr("");
|
||||
int expect_branket = 0;
|
||||
if (devide[0] == '(' || devide[0] == '[' || devide[0] == '{') {
|
||||
expect_branket = 1;
|
||||
@ -1024,18 +1024,21 @@ char* Cursor_splitCollect(Args* buffs, char* stmt, char* devide, int index) {
|
||||
if (cs.branket_deepth == expect_branket &&
|
||||
strEqu(cs.token1.pyload, devide)) {
|
||||
i++;
|
||||
if (i == index) {
|
||||
Cursor_iterEnd(&cs);
|
||||
break;
|
||||
}
|
||||
Cursor_iterEnd(&cs);
|
||||
continue;
|
||||
}
|
||||
if (i == index) {
|
||||
out_arg = arg_strAppend(out_arg, cs.token1.pyload);
|
||||
aOut = arg_strAppend(aOut, cs.token1.pyload);
|
||||
}
|
||||
Cursor_iterEnd(&cs);
|
||||
}
|
||||
Cursor_deinit(&cs);
|
||||
return strsCacheArg(buffs, out_arg);
|
||||
/* if not found, return origin string */
|
||||
if (i == 0) {
|
||||
arg_deinit(aOut);
|
||||
aOut = arg_newStr(stmt);
|
||||
}
|
||||
return strsCacheArg(buffs, aOut);
|
||||
}
|
||||
|
||||
static void Slice_getPars(Args* outBuffs,
|
||||
@ -1654,7 +1657,8 @@ AST* AST_parseStmt(AST* ast, char* stmt) {
|
||||
|
||||
/* set left */
|
||||
if (isLeftExist) {
|
||||
AST_setNodeAttr(ast, (char*)"left", left);
|
||||
char* left_without_hint = Cursor_splitCollect(&buffs, left, ":", 0);
|
||||
AST_setNodeAttr(ast, (char*)"left", left_without_hint);
|
||||
}
|
||||
/* match statment type */
|
||||
enum StmtType stmtType = Lexer_matchStmtType(right);
|
||||
@ -1835,43 +1839,52 @@ char* Parser_removeAnnotation(char* line) {
|
||||
return line;
|
||||
}
|
||||
|
||||
char* _defGetDefault(Args* outBuffs, char** dec_out) {
|
||||
char* _defGetDefault(Args* outBuffs, char** psDeclearOut) {
|
||||
#if PIKA_NANO_ENABLE
|
||||
return "";
|
||||
#endif
|
||||
Args buffs = {0};
|
||||
char* dec_str = strsCopy(&buffs, *dec_out);
|
||||
char* fn_name = strsGetFirstToken(&buffs, dec_str, '(');
|
||||
Arg* dec_arg = arg_strAppend(arg_newStr(fn_name), "(");
|
||||
Arg* default_arg = arg_newStr("");
|
||||
char* arg_list = strsCut(&buffs, dec_str, '(', ')');
|
||||
char* default_out = NULL;
|
||||
pika_assert(NULL != arg_list);
|
||||
int arg_num = strCountSign(arg_list, ',') + 1;
|
||||
for (int i = 0; i < arg_num; i++) {
|
||||
char* arg_str = strsPopToken(&buffs, &arg_list, ',');
|
||||
char* sDeclear = strsCopy(&buffs, *psDeclearOut);
|
||||
char* sFnName = strsGetFirstToken(&buffs, sDeclear, '(');
|
||||
Arg* aDeclear = arg_strAppend(arg_newStr(sFnName), "(");
|
||||
Arg* aDefault = arg_newStr("");
|
||||
char* sArgList = strsCut(&buffs, sDeclear, '(', ')');
|
||||
char* sDefaultOut = NULL;
|
||||
pika_assert(NULL != sArgList);
|
||||
int argNum = strCountSign(sArgList, ',') + 1;
|
||||
for (int i = 0; i < argNum; i++) {
|
||||
char* sItem = strsPopToken(&buffs, &sArgList, ',');
|
||||
char* sDefaultVal = NULL;
|
||||
char* sDefaultKey = NULL;
|
||||
int is_default = 0;
|
||||
if (strIsContain(arg_str, '=')) {
|
||||
default_arg = arg_strAppend(default_arg, arg_str);
|
||||
default_arg = arg_strAppend(default_arg, ",");
|
||||
arg_str = strsPopToken(&buffs, &arg_str, '=');
|
||||
if (strIsContain(sItem, '=')) {
|
||||
/* has default value */
|
||||
sDefaultVal = Cursor_splitCollect(&buffs, sItem, "=", 1);
|
||||
sDefaultKey = Cursor_splitCollect(&buffs, sItem, "=", 0);
|
||||
sDefaultKey = Cursor_splitCollect(&buffs, sDefaultKey, ":", 0);
|
||||
aDefault = arg_strAppend(aDefault, sDefaultKey);
|
||||
aDefault = arg_strAppend(aDefault, "=");
|
||||
aDefault = arg_strAppend(aDefault, sDefaultVal);
|
||||
aDefault = arg_strAppend(aDefault, ",");
|
||||
is_default = 1;
|
||||
} else {
|
||||
sDefaultKey = sItem;
|
||||
}
|
||||
dec_arg = arg_strAppend(dec_arg, arg_str);
|
||||
aDeclear = arg_strAppend(aDeclear, sDefaultKey);
|
||||
if (is_default) {
|
||||
dec_arg = arg_strAppend(dec_arg, "=");
|
||||
aDeclear = arg_strAppend(aDeclear, "=");
|
||||
}
|
||||
dec_arg = arg_strAppend(dec_arg, ",");
|
||||
aDeclear = arg_strAppend(aDeclear, ",");
|
||||
}
|
||||
strPopLastToken(arg_getStr(dec_arg), ',');
|
||||
dec_arg = arg_strAppend(dec_arg, ")");
|
||||
*dec_out = strsCopy(outBuffs, arg_getStr(dec_arg));
|
||||
default_out = strsCopy(outBuffs, arg_getStr(default_arg));
|
||||
strPopLastToken(default_out, ',');
|
||||
arg_deinit(dec_arg);
|
||||
arg_deinit(default_arg);
|
||||
strPopLastToken(arg_getStr(aDeclear), ',');
|
||||
aDeclear = arg_strAppend(aDeclear, ")");
|
||||
*psDeclearOut = strsCopy(outBuffs, arg_getStr(aDeclear));
|
||||
sDefaultOut = strsCopy(outBuffs, arg_getStr(aDefault));
|
||||
strPopLastToken(sDefaultOut, ',');
|
||||
arg_deinit(aDeclear);
|
||||
arg_deinit(aDefault);
|
||||
strsDeinit(&buffs);
|
||||
return default_out;
|
||||
return sDefaultOut;
|
||||
}
|
||||
|
||||
static char* Suger_multiReturn(Args* out_buffs, char* line) {
|
||||
|
@ -3230,7 +3230,6 @@ TEST(parser, try1) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
|
||||
TEST(parser, except_issue) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
@ -4226,6 +4225,42 @@ TEST(parser, default_fn_1) {
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(parser, default_fn_1_hint) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines =
|
||||
"def test(a:int =1, b:str ='test'):\n"
|
||||
" print(a)";
|
||||
|
||||
__platform_printf("%s\n", lines);
|
||||
char* pikaAsm = Parser_linesToAsm(buffs, lines);
|
||||
__platform_printf("%s", pikaAsm);
|
||||
EXPECT_STREQ(pikaAsm,
|
||||
"B0\n"
|
||||
"0 DEF test(a=,b=)\n"
|
||||
"0 JMP 1\n"
|
||||
"B1\n"
|
||||
"0 EST a\n"
|
||||
"0 JNZ 2\n"
|
||||
"B1\n"
|
||||
"0 NUM 1\n"
|
||||
"0 OUT a\n"
|
||||
"B1\n"
|
||||
"0 EST b\n"
|
||||
"0 JNZ 2\n"
|
||||
"B1\n"
|
||||
"0 STR test\n"
|
||||
"0 OUT b\n"
|
||||
"B1\n"
|
||||
"1 REF a\n"
|
||||
"0 RUN print\n"
|
||||
"B1\n"
|
||||
"0 RET \n"
|
||||
"B0\n");
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !PIKA_NANO_ENABLE
|
||||
@ -5282,6 +5317,27 @@ TEST(parser, page_add) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(parser, hint_assign) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines =
|
||||
"a:int = 1\n"
|
||||
"d:{str:int} = {}\n";
|
||||
printf("%s\r\n", lines);
|
||||
char* pikaAsm = Parser_linesToAsm(buffs, lines);
|
||||
printf("%s", pikaAsm);
|
||||
EXPECT_STREQ(pikaAsm,
|
||||
"B0\n"
|
||||
"0 NUM 1\n"
|
||||
"0 OUT a\n"
|
||||
"B0\n"
|
||||
"0 DCT \n"
|
||||
"0 OUT d\n"
|
||||
"B0\n");
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
TEST_END
|
Loading…
x
Reference in New Issue
Block a user