diff --git a/TestSuite/yieldcapture1.pas b/TestSuite/yieldcapture1.pas index 2dce9fe34..a0173b50b 100644 --- a/TestSuite/yieldcapture1.pas +++ b/TestSuite/yieldcapture1.pas @@ -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. \ No newline at end of file diff --git a/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs b/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs index 8e41eb5bd..46bad6918 100644 --- a/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs +++ b/Yield/SyntaxVisitors/BaseVisitors/BaseChangeVisitor.cs @@ -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; diff --git a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs index e321d5844..3c57e65cf 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs @@ -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(); + //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) diff --git a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 72a7dc9f5..1c3e0964a 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -606,7 +606,8 @@ namespace SyntaxVisitors /// /// Объявление метода /// Коллекция посещенных локальных переменных - /*private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable localsClonesCollection) + // SSM - Эта функция уже не нужна - я иногда использую ее чтобы посмотреть как выглядит функция после Loweringа + private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable localsClonesCollection) { // Выполняем определение типов локальных переменных с автовыводом типов @@ -632,7 +633,7 @@ namespace SyntaxVisitors pd.proc_header.name.meth_name.source_context); // = new method_name("" + pd.proc_header.className.meth_name.className); InsertHelperMethod(pd, pdCloned); // SSM 13.07.16 - вызов этого метода можно не добавлять - }*/ + } /// /// Отображение локальных в клонированные локальные @@ -926,8 +927,9 @@ namespace SyntaxVisitors DeleteRedundantBeginEnds.Accept(pd); // Обработка метода для корректного захвата локальных переменных и их типов - //IEnumerable localsClonesCollection; - //CreateLocalVariablesTypeProxies(pd, out localsClonesCollection); + // - это уже не надо - иногда можно включать чтобы посмотреть, что собой представляет функция после Loweringа + IEnumerable localsClonesCollection; + CreateLocalVariablesTypeProxies(pd, out localsClonesCollection); // frninja 16/11/15: перенес ниже чтобы работал захват для lowered for diff --git a/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs b/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs index f2f14e62b..7ca28708e 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs @@ -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); diff --git a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs index b9e84ffd1..52e36e6d4 100644 --- a/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs +++ b/Yield/YieldConversionSyntax/YieldDesugarSyntaxTreeConverter.cs @@ -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; diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index a6968f59a..19d586353 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ