From 5dc6eda5a6c450d39895efc2dad5890a1c5e60a6 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Thu, 25 Jun 2020 14:51:55 +0300 Subject: [PATCH] fix #2085 --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 ++-- Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- .../RenameSameBlockLocalVarsVisitor.cs | 16 ++++++++++++++++ TestSuite/yield_lam_capt0.pas | 10 ++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 2 +- 7 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 TestSuite/yield_lam_capt0.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 580b08262..ec0557875 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "6"; public const string Build = "3"; - public const string Revision = "2527"; + public const string Revision = "2528"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index d6c797f24..4171f3d4e 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=6 -%REVISION%=2527 %COREVERSION%=3 +%REVISION%=2528 +%MINOR%=6 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 9020a62ca..9baa8bf6d 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.6.3.2527 +3.6.3.2528 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 1ddc853ef..61995384a 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.6.3.2527' +!define VERSION '3.6.3.2528' diff --git a/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs b/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs index c6fe61908..b0777dd3b 100644 --- a/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/RenameSameBlockLocalVarsVisitor.cs @@ -198,6 +198,8 @@ namespace SyntaxVisitors public override void visit(ident id) { + // Это очень частный алгоритм переименования в мини-ПИ, но затрагивает он и лямбды. И механизм для этого - неадекватный + // Надо исключать формальные параметры лямбд и одноимённые переменнные, определяемые у них внутри var newName = this.GetNewVariableName(id.name.ToLower()); if (newName != null) { @@ -212,6 +214,18 @@ namespace SyntaxVisitors ProcessNode(dn.right); } + public override void visit(function_lambda_definition fld) + { + BlockNamesStack.Add(new Dictionary()); + var last = BlockNamesStack.Count - 1; + for (var i=0; i< fld.parameters.expressions.Count; i++) + { + var qname = (fld.parameters.expressions[i] as ident).name.ToLower(); + BlockNamesStack[last][qname] = "-fl"; // -fl - формальный параметр лямбды - это стоп в поиске в GetNewVariableName + } + base.visit(fld); + } + private string CreateNewVariableName(string name) { name = name.ToLower(); @@ -233,6 +247,8 @@ namespace SyntaxVisitors { if (BlockNamesStack[i].ContainsKey(name)) { + if (BlockNamesStack[i][name] == "-fl") // формальный параметр лямбды - это стоп в поиске (переименовывать не надо!) + return null; return BlockNamesStack[i][name]; } } diff --git a/TestSuite/yield_lam_capt0.pas b/TestSuite/yield_lam_capt0.pas new file mode 100644 index 000000000..66818360b --- /dev/null +++ b/TestSuite/yield_lam_capt0.pas @@ -0,0 +1,10 @@ +// #2085 +function f1: sequence of integer; +begin + var b: byte := 5; + yield Arr(3).Select(b->b).First; +end; + +begin + Assert(f1.First = 3); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 2ed7cf32e..ed20d291a 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -2768,7 +2768,7 @@ namespace PascalABCCompiler.TreeConverter visit_program_code(_block.program_code); // Очистили списки goto для меток перед следующим этапом - пока ничего не дало - закомментируем - foreach (var l in context._cmn.labels) + foreach (var l in context._cmn.labels) { l.goto_statements.Clear(); l.comprehensive_code_block = null;