public override void visit(assign_var_tuple assvartup) { var sl = new List <statement>(); sl.Add(new semantic_check_sugared_statement_node(assvartup)); // Это нужно для проверок на этапе преобразования в семантику var tname = "#temp_var" + UniqueNumStr(); var tt = new var_statement(new ident(tname), assvartup.expr); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!! sl.Add(tt); // он же помещается в новое синтаксическое дерево var n = assvartup.vars.variables.Count(); for (var i = 0; i < n; i++) { var a = new var_statement(assvartup.vars.variables[i] as ident, new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())), assvartup.vars.variables[i].source_context); sl.Add(a); } ReplaceStatementUsingParent(assvartup, sl); visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple. // И вообще другой синтаксический сахар, размещённый в этом визиторе }
public override void visit(assign_var_tuple assvartup) { var tname = "#temp_var" + UniqueNumStr(); if (assvartup.Parent is declarations ds) // А когда это происходит??? { var ld = new List <declaration>(); ld.Add(new semantic_check_sugared_statement_node(typeof(assign_var_tuple), new List <syntax_tree_node> { assvartup.idents, assvartup.expr }, assvartup.source_context)); // Это нужно для проверок на этапе преобразования в семантику var vd = new variable_definitions(); var tt1 = new var_def_statement(new ident(tname, assvartup.expr.source_context), assvartup.expr, assvartup.expr.source_context); vd.Add(tt1); var nn = assvartup.idents.idents.Count(); for (var i = 0; i < nn; i++) { var a = new var_def_statement(assvartup.idents.idents[i], //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString())), new semantic_ith_element_of(new ident(tname, assvartup.expr.source_context), new int32_const(i), assvartup.expr.source_context), assvartup.idents.idents[i].source_context); vd.Add(a); } ld.Add(vd); ReplaceAssignVarTupleUsingParent(assvartup, ld); visit(assvartup.expr); return; } var sl = new List <statement>(); sl.Add(new semantic_check_sugared_statement_node(typeof(assign_var_tuple), new List <syntax_tree_node> { assvartup.idents, assvartup.expr }, assvartup.source_context)); // Это нужно для проверок на этапе преобразования в семантику var tt = new var_statement(new ident(tname, assvartup.expr.source_context), assvartup.expr, assvartup.expr.source_context); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!! sl.Add(tt); // он же помещается в новое синтаксическое дерево var n = assvartup.idents.idents.Count(); for (var i = 0; i < n; i++) { var sc = assvartup.idents.idents[i].source_context; var a = new var_statement(assvartup.idents.idents[i], //new dot_node(new ident(tname), new ident("Item" + (i + 1).ToString(),sc)), new semantic_ith_element_of(new ident(tname, assvartup.expr.source_context), new int32_const(i, sc), assvartup.expr.source_context), sc); //a.source_context = assvartup.idents.idents[i].source_context; sl.Add(a); } ReplaceStatementUsingParent(assvartup, sl); visit(assvartup.expr); // В assvartup.expr могут содержаться лямбды, в которых будут другие assign_var_tuple. // И вообще другой синтаксический сахар, размещённый в этом визиторе }
public override void visit(assign_var_tuple assvartup) { _visitor.ProcessNode(assvartup); /*foreach (var id in assvartup.idents.idents) * { * SymbolInfo si = _visitor.context.find_first(id.name); * _currentTreeNode.VariablesDefinedInScope.Add(new CapturedVariablesTreeNode.CapturedSymbolInfo(assvartup, si)); * }*/ }
public void ReplaceAssignVarTupleUsingParent(assign_var_tuple from, IEnumerable <declaration> to) { foreach (var x in to) { x.Parent = from.Parent; } var sl = from.Parent as declarations; if (sl != null) { sl.ReplaceInList(from, to); } }
public override void visit(assign_var_tuple assvartup) { if (assvartup.expr is tuple_node tn && tn.el.expressions.All(ex => ex is const_node) && !tn.el.expressions.Any(ex => ex is nil_const)) { var n = assvartup.idents.idents.Count(); if (n > tn.el.Count) { throw new SyntaxVisitorError("TOO_MANY_ELEMENTS_ON_LEFT_SIDE_OF_TUPLE_ASSIGNMENT", assvartup.idents[0]); } // Оптимизация, т.к. все - константы var sl = new List <statement>(); for (var i = 0; i < n; i++) { var a = new var_statement( assvartup.idents.idents[i], tn.el.expressions[i], assvartup.idents.idents[i].source_context); sl.Add(a); } ReplaceStatementUsingParent(assvartup, sl); }
public void CreateUnpackedListOfAssignments(unpacked_list_of_ident_or_list ll, List <statement> res, ident prevname, SourceContext sc) { var idlist = new ident_list(); foreach (var llelem in ll.lst) { if (llelem.lst != null) { var id = CreateIdent(sc); // надо у этого id установить souce_context idlist.Add(id); CreateUnpackedListOfAssignments(llelem.lst, res, id, sc); } else { idlist.Add(llelem.id); } } idlist.source_context = sc; var ass = new assign_var_tuple(idlist, prevname, sc); res.Insert(0, ass); }
public virtual void visit(assign_var_tuple _assign_var_tuple) { DefaultVisit(_assign_var_tuple); }
public override void visit(assign_var_tuple at) { UnpackingAssign++; base.visit(at); }