From e19b4ec4fa8692f77cbcf543652e6fda20188da2 Mon Sep 17 00:00:00 2001 From: Kalsash <75901974+Kalsash@users.noreply.github.com> Date: Thu, 13 Jun 2024 20:39:35 +0300 Subject: [PATCH] No await fix (#3148) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Добавил комментарии для async/await * source_context fix * ReplaceVarNames fix * Parametrs fix * async_defs fix * no await fix * исправлен баг с объявлением Task без инициализации --------- Co-authored-by: Aleksandr Kalinin --- SyntaxVisitors/Async/AsyncVisitor.cs | 6 ++- SyntaxVisitors/Async/AwaitBuilder.cs | 55 ++++++++++++++++++---------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/SyntaxVisitors/Async/AsyncVisitor.cs b/SyntaxVisitors/Async/AsyncVisitor.cs index f39de750b..fa129007b 100644 --- a/SyntaxVisitors/Async/AsyncVisitor.cs +++ b/SyntaxVisitors/Async/AsyncVisitor.cs @@ -51,10 +51,14 @@ namespace SyntaxVisitors if (b != null) { var await = new await_node_statement(); + await.source_context = b.source_context; await.aw = new await_node(); + await.aw.source_context = b.source_context; var mc = new method_call(); - mc.dereferencing_value = new dot_node(new ident("Task"), new ident("Delay")); + mc.dereferencing_value = new dot_node(new dot_node(new dot_node(new dot_node(new ident("System"), + new ident("Threading")), new ident("Tasks")), new ident("Task")), new ident("Delay")); mc.parameters = new expression_list(new int32_const(0)); + mc.source_context = b.source_context; await.aw.ex = mc; b.program_code.list.Add(await); diff --git a/SyntaxVisitors/Async/AwaitBuilder.cs b/SyntaxVisitors/Async/AwaitBuilder.cs index 5084c753c..38e2c1c19 100644 --- a/SyntaxVisitors/Async/AwaitBuilder.cs +++ b/SyntaxVisitors/Async/AwaitBuilder.cs @@ -265,7 +265,6 @@ namespace SyntaxVisitors.Async } else { - VarsHelper.VarsList.Add(pp); if (pp.var_def.inital_value != null) { foreach (var item in pp.var_def.vars.list) @@ -275,6 +274,22 @@ namespace SyntaxVisitors.Async temp_list.Add(ass); } } + else + { + if (pp.var_def.vars_type.ToString().Contains("Task")) + { + pp.var_def.inital_value = new default_operator(new named_type_reference + (new ident(pp.var_def.vars_type.ToString()))); + pp.var_def.vars_type = null; + foreach (var item in pp.var_def.vars.list) + { + var ass = new assign(item, pp.var_def.inital_value, Operators.Assignment, item.source_context); + ass.first_assignment_defines_type = true; + temp_list.Add(ass); + } + } + } + VarsHelper.VarsList.Add(pp); continue; } } @@ -365,15 +380,15 @@ namespace SyntaxVisitors.Async mcс.source_context = TaskList[0].source_context; // Убираем лишние присваивания для Task - if (VarsHelper.TaskIdents.Count != 0) - { - if (VarsHelper.TaskIdents.First().Value == "1") - { - mcс.dereferencing_value = new dot_node(new ident(VarsHelper.TaskIdents.First().Key, TaskList[0].source_context), - new ident("GetAwaiter", TaskList[0].source_context), TaskList[0].source_context); - (code_list.list[0] as statement_list).Remove(extemp); - } - } + //if (VarsHelper.TaskIdents.Count != 0) + //{ + // if (VarsHelper.TaskIdents.First().Value == "1") + // { + // mcс.dereferencing_value = new dot_node(new ident(VarsHelper.TaskIdents.First().Key, TaskList[0].source_context), + // new ident("GetAwaiter", TaskList[0].source_context), TaskList[0].source_context); + // (code_list.list[0] as statement_list).Remove(extemp); + // } + //} var assign_ = new assign(new ident("@aw@_" + "1", ts.source_context), mcс, Operators.Assignment, ts.source_context); @@ -507,16 +522,16 @@ namespace SyntaxVisitors.Async new ident("GetAwaiter", TaskList[lbnum - 1].source_context), TaskList[lbnum - 1].source_context); mccc.source_context = TaskList[lbnum - 1].source_context; // Убираем лишние присваивания для Task - foreach (var kv in VarsHelper.TaskIdents) - { - if (kv.Value == lbnum.ToString()) - { - mccc.dereferencing_value = new dot_node(new ident(kv.Key, TaskList[lbnum - 1].source_context), - new ident("GetAwaiter", TaskList[lbnum - 1].source_context), TaskList[lbnum - 1].source_context); - ts.stmt_list.Remove(extemp); - break; - } - } + //foreach (var kv in VarsHelper.TaskIdents) + //{ + // if (kv.Value == lbnum.ToString()) + // { + // mccc.dereferencing_value = new dot_node(new ident(kv.Key, TaskList[lbnum - 1].source_context), + // new ident("GetAwaiter", TaskList[lbnum - 1].source_context), TaskList[lbnum - 1].source_context); + // ts.stmt_list.Remove(extemp); + // break; + // } + //} var assign22_ = new assign(new ident(awaiter + lbnum.ToString(), ts.source_context), mccc, Operators.Assignment, ts.source_context); assign22_.source_context = ts.source_context;