From e5f60689cd7bf53ee228606a9eeec7cb492789ad Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 9 Jun 2024 12:30:20 +0200 Subject: [PATCH] #3125 --- .../RenameSameBlockLocalVarsVisitor.cs | 7 ++++++- TestSuite/yield8.pas | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs b/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs index b0777dd3b..f051721f1 100644 --- a/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs @@ -113,13 +113,16 @@ namespace SyntaxVisitors return; } + var newNameCache = new Dictionary(); + var newLocalNames = var_def.vars.idents.Select(id => { var low = id.name.ToLower(); var newName = this.CreateNewVariableName(low); //BlockNamesStack[CurrentLevel].Add(low, newName); - BlockNamesStack[CurrentLevel][low] = newName; + //BlockNamesStack[CurrentLevel][low] = newName; + newNameCache[low] = newName; return new ident(newName, id.source_context); }); @@ -130,6 +133,8 @@ namespace SyntaxVisitors Replace(var_def, newVS); listNodes[listNodes.Count - 1] = newVS; //SSM 8.11.18 ProcessNode(newVS.inital_value); // SSM 10.06.2020 #2103 + foreach (var key in newNameCache.Keys) + BlockNamesStack[CurrentLevel][key] = newNameCache[key]; //base.visit(newVS); // SSM 10.06.2020 - зачем обходить всё? } diff --git a/TestSuite/yield8.pas b/TestSuite/yield8.pas index ef3c78fac..d58afdcbb 100644 --- a/TestSuite/yield8.pas +++ b/TestSuite/yield8.pas @@ -3,14 +3,27 @@ function f1: sequence of integer; begin //Ошибка: Ожидалось имя процедуры или функции - var v := 1;//V(0); + var v := V(0); // Если закомментировать эту строчку - предыдущая строчка работает yield v; end; +function f2: sequence of integer; +begin + //Ошибка: Ожидалось имя процедуры или функции + var v := V(0); + var w := v + 1; + // Если закомментировать эту строчку - предыдущая строчка работает + yield w; +end; + begin var i := 0; foreach var j in f1 do i := j; assert(i = 1); + + foreach var j in f2 do + i := j; + assert(i = 2); end. \ No newline at end of file