Убран дурацкий код, из-за которого в BaseChangeVisitor все узлы обходились дважды.

Доработан LoweringVisitor, который ранее на это закладывался
This commit is contained in:
miks1965 2016-07-17 10:40:17 +03:00
parent ac0ce4b1be
commit 88cd8ce925
7 changed files with 35 additions and 12 deletions

View file

@ -15,7 +15,7 @@ begin
var q := a1.f(Range(1,4));
var sq := Seq(4,5,6,7);
var sq := Seq(4,5,6,7);
Assert(q.Println.SequenceEqual(sq));
Assert(q.Println.SequenceEqual(sq));
end.

View file

@ -14,12 +14,12 @@ namespace SyntaxVisitors
private bool _rootAdded = false;
public override void DefaultVisit(syntax_tree_node n)
{
// frninja 07/12/15
if (!_rootAdded)
// frninja 07/12/15 - // SSM - это - идиотский код, приводивший к двойному обходу визитором всех узлов
/*if (!_rootAdded)
{
_rootAdded = true;
ProcessNode(n);
}
}*/
// Элементы списков - с конца в начало чтобы можно было эти элементы изменять по ходу (удалять/вставлять/заменять один несколькими)
var Сount = n.subnodes_count;

View file

@ -149,10 +149,14 @@ namespace SyntaxVisitors
stl,
WhileCycleType.While);
ReplaceStatement(frch,
SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode)
);
var sq = SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode);
ReplaceStatement(frch,sq);
visit(whileNode); // Lowering оставшегося whileNode
//var sl = UpperNodeAs<statement_list>();
//ProcessNode(sl); // необходимо еще lowerить while - как это сделать лучше - пока не знаю
}
private expression CreateConditionFromCaseVariant(expression param, expression_list list)
@ -224,6 +228,8 @@ namespace SyntaxVisitors
if_node finalIfNode = currentIfNode;
ReplaceStatement(csn, finalIfNode);
visit(finalIfNode);
}
public override void visit(if_node ifn)

View file

@ -606,7 +606,8 @@ namespace SyntaxVisitors
/// </summary>
/// <param className="pd">Объявление метода</param>
/// <returns>Коллекция посещенных локальных переменных</returns>
/*private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection)
// SSM - Эта функция уже не нужна - я иногда использую ее чтобы посмотреть как выглядит функция после Loweringа
private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection)
{
// Выполняем определение типов локальных переменных с автовыводом типов
@ -632,7 +633,7 @@ namespace SyntaxVisitors
pd.proc_header.name.meth_name.source_context); // = new method_name("<yield_helper_locals_type_detector>" + pd.proc_header.className.meth_name.className);
InsertHelperMethod(pd, pdCloned); // SSM 13.07.16 - вызов этого метода можно не добавлять
}*/
}
/// <summary>
/// Отображение локальных в клонированные локальные
@ -926,8 +927,9 @@ namespace SyntaxVisitors
DeleteRedundantBeginEnds.Accept(pd);
// Обработка метода для корректного захвата локальных переменных и их типов
//IEnumerable<var_def_statement> localsClonesCollection;
//CreateLocalVariablesTypeProxies(pd, out localsClonesCollection);
// - это уже не надо - иногда можно включать чтобы посмотреть, что собой представляет функция после Loweringа
IEnumerable<var_def_statement> localsClonesCollection;
CreateLocalVariablesTypeProxies(pd, out localsClonesCollection);
// frninja 16/11/15: перенес ниже чтобы работал захват для lowered for

View file

@ -30,6 +30,21 @@ namespace SyntaxVisitors
New.ProcessNode(pd);
}
public override void visit(procedure_definition pd)
{
DefaultVisit(pd);
}
public override void visit(statement_list st)
{
DefaultVisit(st);
}
public override void visit(for_node fn)
{
DefaultVisit(fn);
}
public override void visit(yield_node yn)
{
var lambdaSearcher = new TreeConverter.LambdaExpressions.LambdaSearcher(yn);

View file

@ -28,7 +28,7 @@ namespace YieldDesugarSyntaxTreeConverter
root.visit(new ProcessYieldCapturedVarsVisitor());
#if DEBUG
// root.visit(new SimplePrettyPrinterVisitor(@"d:\zzz.txt"));
//root.visit(new SimplePrettyPrinterVisitor(@"d:\zzz.txt"));
#endif
return root;

Binary file not shown.