diff --git a/.gitignore b/.gitignore index ab1ce1f4c..61b7e0520 100644 --- a/.gitignore +++ b/.gitignore @@ -65,7 +65,7 @@ **/TestPlugin.dll **/TreeConverter.dll **/VBNETParser.dll -**/YieldHelpers.dll +**/Utils.dll **/pabcnetc.exe **/pabcnetc.exe.config **/pabcnetcclear.exe diff --git a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParser.y b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParser.y index 524fdcc26..379c10398 100644 --- a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParser.y +++ b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParser.y @@ -5,7 +5,6 @@ // public int max_errors = 10; public SPythonParserTools parserTools; public List CompilerDirectives; - public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper(); public bool is_unit_to_be_parsed = false; public SPythonGPPGParser(AbstractScanner scanner, SPythonParserTools parserTools, diff --git a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserTools.cs b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserTools.cs index 2b5462cbd..db318ebcd 100644 --- a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserTools.cs +++ b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserTools.cs @@ -407,28 +407,4 @@ namespace SPythonParser return naie; } } - - // temp - public class ParserLambdaHelper - { - private int lambda_num = 0; - public List lambdaDefinitions; - public static string lambdaPrefix = "<>lambda"; - - public ParserLambdaHelper() - { - lambdaDefinitions = new List(); - } - - public string CreateLambdaName() - { - lambda_num++; - return lambdaPrefix + lambda_num.ToString(); - } - - public bool IsLambdaName(ident id) - { - return id.name.StartsWith(lambdaPrefix); - } - } } diff --git a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserYacc.cs b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserYacc.cs index a196eb240..4e8f4299d 100644 --- a/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserYacc.cs +++ b/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParserYacc.cs @@ -4,7 +4,7 @@ // GPPG version 1.3.6 // Machine: DESKTOP-V3E9T2U -// DateTime: 31.01.2026 19:25:57 +// DateTime: 03.03.2026 17:10:12 // UserName: alex // Input file @@ -67,7 +67,6 @@ public partial class SPythonGPPGParser: ShiftReduceParser CompilerDirectives; - public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper(); public bool is_unit_to_be_parsed = false; public SPythonGPPGParser(AbstractScanner scanner, SPythonParserTools parserTools, diff --git a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/CompoundComparisonDesugarVisitor.cs b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/CompoundComparisonDesugarVisitor.cs index 034efaaf7..2c1e7b699 100644 --- a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/CompoundComparisonDesugarVisitor.cs +++ b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/CompoundComparisonDesugarVisitor.cs @@ -1,5 +1,6 @@ using PascalABCCompiler.SyntaxTree; using System.Collections.Generic; +using PascalABCCompiler.CoreUtils; namespace Languages.SPython.Frontend.Converters { @@ -7,7 +8,12 @@ namespace Languages.SPython.Frontend.Converters { private int curr_sl_index; - public CompoundComparisonDesugarVisitor() { } + private readonly GeneratedNamesManager generatedNamesManager; + + public CompoundComparisonDesugarVisitor(GeneratedNamesManager generatedNamesManager) + { + this.generatedNamesManager = generatedNamesManager; + } public override void visit(statement_list sl) { @@ -46,13 +52,10 @@ namespace Languages.SPython.Frontend.Converters return (_bin_expr.left is bin_expr left) && IsComparison(_bin_expr) && IsComparison(left); } - private int createdIdentsCounter = 0; private string NewIdentName() { - string result = '%' + createdIdentsCounter.ToString(); - createdIdentsCounter++; - return result; + return generatedNamesManager.GenerateName("%"); } public override void visit(bin_expr _bin_expr) diff --git a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/GeneratorObjectDesugarVisitor.cs b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/GeneratorObjectDesugarVisitor.cs index 6a75f94ec..707d73294 100644 --- a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/GeneratorObjectDesugarVisitor.cs +++ b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/GeneratorObjectDesugarVisitor.cs @@ -1,19 +1,20 @@ using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; -using System.Collections.Generic; +using PascalABCCompiler.CoreUtils; namespace Languages.SPython.Frontend.Converters { internal class GeneratorObjectDesugarVisitor : BaseChangeVisitor { - private ParserLambdaHelper lambdaHelper = new ParserLambdaHelper(); private syntax_tree_node root; private bool replaceRoot = false; private syntax_tree_node lastDesugaredNode = null; + private readonly GeneratedNamesManager generatedNamesManager; - public GeneratorObjectDesugarVisitor(syntax_tree_node root) + public GeneratorObjectDesugarVisitor(syntax_tree_node root, GeneratedNamesManager generatedNamesManager) { this.root = root; + this.generatedNamesManager = generatedNamesManager; } public syntax_tree_node UpdatedRoot() @@ -45,7 +46,7 @@ namespace Languages.SPython.Frontend.Converters sl = new statement_list(new assign(StringConstants.result_var_name, _generator_object._condition, _generator_object._condition.source_context), _generator_object._condition.source_context); //! sl.expr_lambda_body = true; lambda = new function_lambda_definition( - lambdaHelper.CreateLambdaName(), formalPars, + CreateLambdaName(), formalPars, new lambda_inferred_type(new lambda_any_type_node_syntax(), _generator_object._ident.source_context), sl, _generator_object.source_context); mc = new method_call(dn as addressed_value, new expression_list(lambda as expression), _generator_object.source_context); @@ -63,7 +64,7 @@ namespace Languages.SPython.Frontend.Converters sl.expr_lambda_body = true; lambda = new function_lambda_definition( - lambdaHelper.CreateLambdaName(), formalPars, + CreateLambdaName(), formalPars, new lambda_inferred_type(new lambda_any_type_node_syntax(), _generator_object._ident.source_context), sl, _generator_object.source_context); @@ -77,28 +78,10 @@ namespace Languages.SPython.Frontend.Converters lastDesugaredNode = replaceTo; } } - } - public class ParserLambdaHelper - { - private int lambda_num = 0; - public List lambdaDefinitions; - public static string lambdaPrefix = "<>lambda"; - - public ParserLambdaHelper() + private string CreateLambdaName() { - lambdaDefinitions = new List(); - } - - public string CreateLambdaName() - { - lambda_num++; - return lambdaPrefix + lambda_num.ToString(); - } - - public bool IsLambdaName(ident id) - { - return id.name.StartsWith(lambdaPrefix); + return generatedNamesManager.GenerateName(StringConstants.lambdaPrefix); } } } diff --git a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/SPythonStandardTreeConverter.csproj b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/SPythonStandardTreeConverter.csproj index 4398efd85..a11a33ca1 100644 --- a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/SPythonStandardTreeConverter.csproj +++ b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/SPythonStandardTreeConverter.csproj @@ -11,9 +11,11 @@ false + + diff --git a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/StandardSyntaxTreeConverter.cs b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/StandardSyntaxTreeConverter.cs index 5f106663f..d6642d1a6 100644 --- a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/StandardSyntaxTreeConverter.cs +++ b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/StandardSyntaxTreeConverter.cs @@ -5,6 +5,7 @@ using PascalABCCompiler.SyntaxTreeConverters; using SyntaxVisitors; using SyntaxVisitors.SugarVisitors; using System; +using PascalABCCompiler.CoreUtils; namespace Languages.SPython.Frontend.Converters { @@ -14,6 +15,8 @@ namespace Languages.SPython.Frontend.Converters protected override syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense) { + var generatedNamesManager = new GeneratedNamesManager(); + // кидает ошибки за использование // неподдерживаемых конструкций языка if (!forIntellisense) @@ -40,26 +43,28 @@ namespace Languages.SPython.Frontend.Converters // замена генерации последовательностей на Select.Where // (не работает из-за лямбд (скорее всего), если переместить в ConvertAfterUsedModulesCompilation) - new TryCatchDecorator(new GeneratorObjectDesugarVisitor(root), forIntellisense).ProcessNode(root); + new TryCatchDecorator(new GeneratorObjectDesugarVisitor(root, generatedNamesManager), forIntellisense).ProcessNode(root); // Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд // украл из паскаля - new TryCatchDecorator(StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.New, forIntellisense).ProcessNode(root); + new TryCatchDecorator(StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.Create(generatedNamesManager), forIntellisense).ProcessNode(root); new TryCatchDecorator(new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit), forIntellisense).ProcessNode(root); - new TryCatchDecorator(FindOnExceptVarsAndApplyRenameVisitor.New, forIntellisense).ProcessNode(root); + new TryCatchDecorator(FindOnExceptVarsAndApplyRenameVisitor.Create(generatedNamesManager), forIntellisense).ProcessNode(root); // дешугаризация составных сравнительных операций (e.g. a == b == c) - new TryCatchDecorator(new CompoundComparisonDesugarVisitor(), forIntellisense).ProcessNode(root); + new TryCatchDecorator(new CompoundComparisonDesugarVisitor(generatedNamesManager), forIntellisense).ProcessNode(root); return root; } - public override syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) + protected override syntax_tree_node ApplyConversionsAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) { + var generatedNamesManager = new GeneratedNamesManager(); + // украл из паскаля, нужны для работы 'for i1, i2 in expr' (работает с кортежными присваиваниями) var binder = new BindCollectLightSymInfo(root as compilation_unit); new TryCatchDecorator(binder, forIntellisense).ProcessNode(root); - new TryCatchDecorator(new NewAssignTuplesDesugarVisitor(binder), forIntellisense).ProcessNode(root); + new TryCatchDecorator(new NewAssignTuplesDesugarVisitor(binder, generatedNamesManager), forIntellisense).ProcessNode(root); // Заменяет // variable_name = single_length_string diff --git a/Compiler/Compiler.cs b/Compiler/Compiler.cs index 04cbf7545..eb68dca03 100644 --- a/Compiler/Compiler.cs +++ b/Compiler/Compiler.cs @@ -243,6 +243,11 @@ namespace PascalABCCompiler /// public Dictionary> NamesFromUsedUnits { get; } = new Dictionary>(); + /// + /// Объект, хранящий счетчики сгенерированных имен для текущего модуля (используется на семантике) + /// + public CoreUtils.GeneratedNamesManager GeneratedNamesManager { get; } = new CoreUtils.GeneratedNamesManager(); + public UnitState State = UnitState.BeginCompilation; } @@ -3153,7 +3158,8 @@ namespace PascalABCCompiler docs, CompilerOptions.Debug, CompilerOptions.ForDebugging, - CompilerOptions.ForIntellisense + CompilerOptions.ForIntellisense, + currentUnit.GeneratedNamesManager ); SyntaxTreeToSemanticTreeConverter.CompileImplementation(currentUnit.Language, data, CompiledVariables); @@ -3246,7 +3252,8 @@ namespace PascalABCCompiler docs, CompilerOptions.Debug, CompilerOptions.ForDebugging, - CompilerOptions.ForIntellisense + CompilerOptions.ForIntellisense, + currentUnit.GeneratedNamesManager ); currentUnit.SemanticTree = SyntaxTreeToSemanticTreeConverter.CompileInterface(currentUnit.Language, data, CompiledVariables); diff --git a/CompilerTools/CompilerTools.csproj b/CompilerTools/CompilerTools.csproj index 8c8bba4ac..0d94db80c 100644 --- a/CompilerTools/CompilerTools.csproj +++ b/CompilerTools/CompilerTools.csproj @@ -22,6 +22,5 @@ - \ No newline at end of file diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 9d0b43efc..e4953b72c 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 = "11"; public const string Build = "1"; - public const string Revision = "3765"; + public const string Revision = "3766"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/CoreUtils/GeneratedNamesManager.cs b/CoreUtils/GeneratedNamesManager.cs new file mode 100644 index 000000000..9bff2e2d8 --- /dev/null +++ b/CoreUtils/GeneratedNamesManager.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; + +namespace PascalABCCompiler.CoreUtils +{ + /// + /// Хранилище для сгенерированных компилятором переменных + /// + public class GeneratedNamesManager + { + private readonly Dictionary counters = new Dictionary(); + + /// + /// Возвращает уникальное имя для переданного префикса (используется автоинкремент) + /// + public string GenerateName(string prefix, string suffix = "") + { + counters.TryGetValue(prefix, out int current); + counters[prefix] = current + 1; + return $"{prefix}{current}{suffix}"; + } + } +} diff --git a/CoreUtils/Properties/AssemblyInfo.cs b/CoreUtils/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..00e7640bb --- /dev/null +++ b/CoreUtils/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using System.Reflection; + +[assembly: AssemblyTitle("PascalABCNET.CoreUtils")] +[assembly: AssemblyDescription("Core utils")] +[assembly: AssemblyConfiguration("")] diff --git a/Yield/YieldHelpers/YieldHelpers.csproj b/CoreUtils/Utils.csproj similarity index 100% rename from Yield/YieldHelpers/YieldHelpers.csproj rename to CoreUtils/Utils.csproj diff --git a/Parsers/PascalABCParserNewSaushkin/ParserLambdaHelper.cs b/Parsers/PascalABCParserNewSaushkin/ParserLambdaHelper.cs index 884c43f44..1e9e886d8 100644 --- a/Parsers/PascalABCParserNewSaushkin/ParserLambdaHelper.cs +++ b/Parsers/PascalABCParserNewSaushkin/ParserLambdaHelper.cs @@ -1,30 +1,25 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System.Collections.Generic; +using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace Languages.Pascal.Frontend.Core { public class ParserLambdaHelper { - private int lambda_num = 0; - public List lambdaDefinitions; - public static string lambdaPrefix = "<>lambda"; - - public ParserLambdaHelper() - { - lambdaDefinitions = new List(); - } + private readonly GeneratedNamesManager generatedNamesManager = new GeneratedNamesManager(); + public List lambdaDefinitions = new List(); public string CreateLambdaName() { - lambda_num++; - return lambdaPrefix + lambda_num.ToString(); + return generatedNamesManager.GenerateName(StringConstants.lambdaPrefix); } public bool IsLambdaName(ident id) { - return id.name.StartsWith(lambdaPrefix); + return id.name.StartsWith(StringConstants.lambdaPrefix); } } } diff --git a/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj b/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj index 790232417..38fa3be3e 100644 --- a/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj +++ b/Parsers/PascalABCParserNewSaushkin/PascalABCSaushkinParser.csproj @@ -14,6 +14,7 @@ + diff --git a/PascalABCNET.sln b/PascalABCNET.sln index ab2285ed3..f6b63d5f0 100644 --- a/PascalABCNET.sln +++ b/PascalABCNET.sln @@ -83,7 +83,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PABCNETCclear", "pabcnetc_c EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldHelpers", "Yield\YieldHelpers\YieldHelpers.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "CoreUtils\Utils.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}" EndProject diff --git a/PascalABCNETLinux.sln b/PascalABCNETLinux.sln index 06dd6257c..fd300e1d3 100644 --- a/PascalABCNETLinux.sln +++ b/PascalABCNETLinux.sln @@ -45,8 +45,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeConverters", "SyntaxTreeConverters\SyntaxTreeConverters.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldHelpers", "Yield\YieldHelpers\YieldHelpers.csproj", "{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditorLinux", "ICSharpCode.TextEditorLinux\ICSharpCode.TextEditorLinux.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" @@ -79,6 +77,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonStandardTreeConverte EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonParser", "AdditionalLanguages\SPython\SPythonParserKrylovMovchan\SPythonParser.csproj", "{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "CoreUtils\Utils.csproj", "{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -241,16 +241,6 @@ Global {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|x86.ActiveCfg = Release|Any CPU {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|x86.Build.0 = Release|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Debug|x86.ActiveCfg = Debug|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Any CPU.Build.0 = Release|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|x86.ActiveCfg = Release|Any CPU {A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -393,6 +383,18 @@ Global {CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|Mixed Platforms.Build.0 = Release|Any CPU {CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.ActiveCfg = Release|Any CPU {CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446}.Release|x86.Build.0 = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.ActiveCfg = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Debug|x86.Build.0 = Debug|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Any CPU.Build.0 = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.ActiveCfg = Release|Any CPU + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -415,7 +417,6 @@ Global {146083AD-6684-4EBC-A539-AAD749A16364} = {F8CE2712-826B-450B-A72F-D32D80C99858} {0ED020FF-D28E-4791-BBDD-B8B9BA714096} = {BB6973BA-B3A2-4B31-A986-7CB008F22C4F} {F10A5330-DCF4-4533-877C-7B1B1BE23884} = {F8CE2712-826B-450B-A72F-D32D80C99858} - {CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09} = {F8CE2712-826B-450B-A72F-D32D80C99858} {A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2} = {F8CE2712-826B-450B-A72F-D32D80C99858} {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {26843C5D-9D7E-4C2C-AC14-2D227FA5592E} {3BF3CEB4-0E08-485A-8E6D-924841818B01} = {26843C5D-9D7E-4C2C-AC14-2D227FA5592E} @@ -432,6 +433,7 @@ Global {15D55C2B-37A6-850E-D0CF-74C43CBB9E3F} = {D71D6350-AEE9-491F-A99E-9A2D00071020} {6883EC33-B9FD-6D48-B0C3-16F451552C9F} = {C4104880-9AC0-42F5-9962-D0C3FD143139} {CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446} = {D71D6350-AEE9-491F-A99E-9A2D00071020} + {EB7AFD92-6376-05DF-B47D-0BF77A4EAC43} = {F8CE2712-826B-450B-A72F-D32D80C99858} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {68E993E6-EE86-4DDF-B0A1-4FE884F8AC39} diff --git a/ReleaseGenerators/PascalABCNETConsoleZIP.bat b/ReleaseGenerators/PascalABCNETConsoleZIP.bat index 795694ec4..4b5883cff 100644 --- a/ReleaseGenerators/PascalABCNETConsoleZIP.bat +++ b/ReleaseGenerators/PascalABCNETConsoleZIP.bat @@ -1,6 +1,6 @@ cd ..\bin del ..\Release\PACNETConsole.zip -..\utils\pkzipc\pkzipc.exe -add ..\Release\PABCNETC.zip pabcnetc.exe pabcnetcclear.exe Compiler.dll CompilerTools.dll Errors.dll Localization.dll NETGenerator.dll ParserTools.dll ICSharpCode.NRefactory.dll SemanticTree.dll SyntaxTree.dll TreeConverter.dll OptimizerConversion.dll PascalABCParser.dll PascalABCLanguageInfo.dll licence.txt PascalABCNET.chm System.Threading.dll SyntaxTreeConverters.dll YieldHelpers.dll SyntaxVisitors.dll LambdaAnySynToSemConverter.dll LanguageIntegrator.dll StringConstants.dll +..\utils\pkzipc\pkzipc.exe -add ..\Release\PABCNETC.zip pabcnetc.exe pabcnetcclear.exe Compiler.dll CompilerTools.dll Errors.dll Localization.dll NETGenerator.dll ParserTools.dll ICSharpCode.NRefactory.dll SemanticTree.dll SyntaxTree.dll TreeConverter.dll OptimizerConversion.dll PascalABCParser.dll PascalABCLanguageInfo.dll licence.txt PascalABCNET.chm System.Threading.dll SyntaxTreeConverters.dll Utils.dll SyntaxVisitors.dll LambdaAnySynToSemConverter.dll LanguageIntegrator.dll StringConstants.dll ..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lib\*.pcu ..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lib\SPython\*.pcu ..\utils\pkzipc\pkzipc.exe -add -nozip -dir ..\Release\PABCNETC.zip Lng\*.dat diff --git a/ReleaseGenerators/sect_Core.nsh b/ReleaseGenerators/sect_Core.nsh index 0164e3f93..ade4ff638 100644 --- a/ReleaseGenerators/sect_Core.nsh +++ b/ReleaseGenerators/sect_Core.nsh @@ -14,7 +14,7 @@ File "..\bin\SyntaxTree.dll" File "..\bin\SyntaxTreeConverters.dll" File "..\bin\SyntaxVisitors.dll" - File "..\bin\YieldHelpers.dll" + File "..\bin\Utils.dll" File "..\bin\ICSharpCode.NRefactory.dll" File "..\bin\TreeConverter.dll" File "..\bin\OptimizerConversion.dll" @@ -81,7 +81,7 @@ ${AddFile} "SemanticTree.dll" ${AddFile} "SyntaxTree.dll" ${AddFile} "SyntaxTreeConverters.dll" - ${AddFile} "YieldHelpers.dll" + ${AddFile} "Utils.dll" ${AddFile} "SyntaxVisitors.dll" ${AddFile} "ICSharpCode.NRefactory.dll" ${AddFile} "TreeConverter.dll" diff --git a/StringConstants/StringConstants.cs b/StringConstants/StringConstants.cs index e4a31ca34..1603e365f 100644 --- a/StringConstants/StringConstants.cs +++ b/StringConstants/StringConstants.cs @@ -11,12 +11,6 @@ namespace PascalABCCompiler { public static Dictionary oper_names = new Dictionary(); - static int tvnc = 0; - public static string GetTempVariableName() - { - return "$TV" + (tvnc++).ToString() + "$"; - } - static StringConstants() { oper_names[plus_name] = "op_Addition"; @@ -500,5 +494,19 @@ namespace PascalABCCompiler public static string ObjectType = "Object"; public static string StringType = "string"; public static string config_variable_name = "__CONFIG__"; + + #region YIELD NAMES + + public const string yieldCurrent = "<>2__current"; + public const string yieldState = "<>1__state"; + public const string yieldLabelStatePrefix = "lbstate#"; + + public const string yieldSelf = "<>4__self"; + + public const string yieldHelperMethodPrefix = " root; + public syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) { + + return ApplyConversionsAfterUsedModulesCompilation(root, forIntellisense, in compilationArtifacts); + } + + protected virtual syntax_tree_node ApplyConversionsAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) => root; } diff --git a/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs index 74a56b00e..7f872586b 100644 --- a/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/PatternsVisitors/PatternsDesugaringVisitor.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.PatternsVisitors @@ -94,12 +94,6 @@ namespace SyntaxVisitors.PatternsVisitors private const string GeneratedVisitElseBranchVariableName = "<>visitElseBranch"; private const string GeneratedMatchExprVariableName = "<>matchExprVariable"; - private int generalVariableCounter = 0; - private int successVariableCounter = 0; - private int labelVariableCounter = 0; - private static int deconstructParamVariableCounter = 0; - private int matchExprVariableCounter = 0; - private if_node _previousIf; private statement desugaredMatchWith; private List processedIfNodes = new List(); @@ -108,7 +102,14 @@ namespace SyntaxVisitors.PatternsVisitors //const matching private List typeChecks = new List(); - public static PatternsDesugaringVisitor New => new PatternsDesugaringVisitor(); + private readonly GeneratedNamesManager generatedNamesManager; + + private PatternsDesugaringVisitor(GeneratedNamesManager generatedNamesManager) + { + this.generatedNamesManager = generatedNamesManager; + } + + public static PatternsDesugaringVisitor Create(GeneratedNamesManager generatedNamesManager) => new PatternsDesugaringVisitor(generatedNamesManager); public override void visit(match_with matchWith) { @@ -208,12 +209,9 @@ namespace SyntaxVisitors.PatternsVisitors typeChecks.Clear(); // SSM исправление ошибки #2276 } - private int num = 0; - - public string GenerateNewName(string name) + private string GenerateNewName(string name) { - num += 1; - return "$RenIsVarYield" + num + "$" + name; + return generatedNamesManager.GenerateName("$RenIsVarYield", "$" + name); } public override void visit(procedure_definition pd) @@ -575,13 +573,13 @@ namespace SyntaxVisitors.PatternsVisitors return indexerCall; } - private ident NewGeneralName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "GenVar" + generalVariableCounter++, sc); + private ident NewGeneralName(SourceContext sc) => new ident(generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "GenVar"), sc); - private ident NewSuccessName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "Success" + successVariableCounter++, sc); + private ident NewSuccessName(SourceContext sc) => new ident(generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "Success"), sc); - private ident NewEndIfName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "EndIf" + labelVariableCounter++, sc); + // private ident NewEndIfName(SourceContext sc) => new ident(GeneratedPatternNamePrefix + "EndIf" + labelVariableCounter++, sc); - private bool IsGenerated(string name) => name.StartsWith(GeneratedPatternNamePrefix); + // private bool IsGenerated(string name) => name.StartsWith(GeneratedPatternNamePrefix); private void AddDefaultCase(statement_list statements) { @@ -1178,12 +1176,12 @@ namespace SyntaxVisitors.PatternsVisitors private string NewDeconstructParamId() { - return GeneratedPatternNamePrefix + "DeconstructParam" + deconstructParamVariableCounter++.ToString(); + return generatedNamesManager.GenerateName(GeneratedPatternNamePrefix + "DeconstructParam"); } private string NewMatchExprVariableId() { - return GeneratedMatchExprVariableName + "matchExprVariableCounter" + deconstructParamVariableCounter++.ToString(); + return generatedNamesManager.GenerateName(GeneratedMatchExprVariableName + "matchExprVariableCounter"); } } } diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/AssignTuplesDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/AssignTuplesDesugarVisitor.cs index 9807b829c..bc2afce94 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/AssignTuplesDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/AssignTuplesDesugarVisitor.cs @@ -1,28 +1,23 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; using System.Linq; -using System.Text; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors { public class AssignTuplesDesugarVisitor : BaseChangeVisitor { - public static AssignTuplesDesugarVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + protected AssignTuplesDesugarVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new AssignTuplesDesugarVisitor(); } + this.generatedNamesManager = generatedNamesManager; } - private int num = 0; - - public string UniqueNumStr() - { - num++; - return num.ToString(); - } + public static AssignTuplesDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new AssignTuplesDesugarVisitor(generatedNamesManager); public override void visit(assign_tuple asstup) { @@ -30,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors var sl = new List(); sl.Add(new semantic_check_sugared_statement_node(typeof(assign_tuple), new List { asstup.vars, asstup.expr }, asstup.source_context)); // Это нужно для проверок на этапе преобразования в семантику - var tname = "#temp_var" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#temp_var"); var tt = new var_statement(new ident(tname, asstup.expr.source_context), asstup.expr, asstup.expr.source_context); sl.Add(tt); @@ -73,7 +68,7 @@ namespace SyntaxVisitors.SugarVisitors } public override void visit(assign_var_tuple assvartup) { - var tname = "#temp_var" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#temp_var"); if (assvartup.Parent is declarations ds) // А когда это происходит??? { var ld = new List(); @@ -127,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors // Их надо найти и сделать несколько секций variable_definitions - без семантических проверок. // Каждую var_tuple_def_statement надо заменить на assign_var_tuple - одну на секцию variable_definitions // А потом оставшаяся часть визитора сделает семантические проверки - var tname = "#temp_var" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#temp_var"); var vd = new List(); //vd.Add(new semantic_check_sugared_var_def_statement_node(typeof(assign_var_tuple), new List { vtd.vars, vtd.inital_value }, vtd.source_context)); // Это нужно для проверок на этапе преобразования в семантику var tt1 = new var_def_statement(new ident(tname, vtd.inital_value.source_context), vtd.inital_value, vtd.inital_value.source_context); diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/NewAssignTuplesDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/NewAssignTuplesDesugarVisitor.cs index fc0f3b6f8..117c3fb6a 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/NewAssignTuplesDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/NewAssignTuplesDesugarVisitor.cs @@ -2,28 +2,32 @@ using PascalABCCompiler.SyntaxTree; using System.Collections.Generic; using System.Linq; +using PascalABCCompiler.CoreUtils; namespace SyntaxVisitors.SugarVisitors { public class NewAssignTuplesDesugarVisitor : AssignTuplesDesugarVisitor { - private BindCollectLightSymInfo binder; + private readonly BindCollectLightSymInfo binder; + + private readonly GeneratedNamesManager generatedNamesManager; - public static NewAssignTuplesDesugarVisitor Create(BindCollectLightSymInfo binder) + public static NewAssignTuplesDesugarVisitor Create(BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager) { - return new NewAssignTuplesDesugarVisitor(binder); + return new NewAssignTuplesDesugarVisitor(binder, generatedNamesManager); } - public NewAssignTuplesDesugarVisitor(BindCollectLightSymInfo binder) + public NewAssignTuplesDesugarVisitor(BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager) : base(generatedNamesManager) { - this.binder = binder; + this.binder = binder; + this.generatedNamesManager = generatedNamesManager; } List desugar(tuple_node tn, addressed_value_list vars) { - var order = Assign.getAssignOrder(tn, vars, binder); + var order = Assign.getAssignOrder(tn, vars, binder, generatedNamesManager); var assigns = new List(); foreach (var a in order) { diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Assign.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Assign.cs index 9e7bd4213..a31226d18 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Assign.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Assign.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace AssignTupleDesugarAlgorithm { @@ -14,7 +15,7 @@ namespace AssignTupleDesugarAlgorithm this.from = from; } - public static List getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder) + public static List getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager) { var left = new List(); var right = new List(); @@ -33,9 +34,9 @@ namespace AssignTupleDesugarAlgorithm } - var graph = GraphUtils.createAssignGraph(left, right); + var graph = GraphUtils.createAssignGraph(left, right, generatedNamesManager); //graph.drawGraph(); - var order = graph.GetAssignOrder(); + var order = graph.GetAssignOrder(generatedNamesManager); return order.Select(elem => new Assign(to: elem.to.symbol, from: elem.from.symbol)).ToList(); } diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/AssignGraph.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/AssignGraph.cs index 55cc331b9..97229e9cb 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/AssignGraph.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/AssignGraph.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using PascalABCCompiler.CoreUtils; namespace AssignTupleDesugarAlgorithm { @@ -84,7 +85,7 @@ namespace AssignTupleDesugarAlgorithm public bool EnsureThatEveryVertexHasOneOrZeroInEdge() => vertexes.All(vert => GetInEdgesForVertex(vert).Count <= 1); - internal List GetAssignOrder() + internal List GetAssignOrder(GeneratedNamesManager generatedNamesManager) { List assignOrder = new List(); assignOrder.AddRange(assignFirst); @@ -108,7 +109,7 @@ namespace AssignTupleDesugarAlgorithm Edge edge_to_cut = GetInEdgesForVertex(cut_place).First(); SymbolNode temp_assign_from = edge_to_cut.from; - SymbolNode temp_vertex = new TempSymbolNode(new TempSymbol()); + SymbolNode temp_vertex = new TempSymbolNode(new TempSymbol(generatedNamesManager)); assignOrder.Add(new Edge(temp_assign_from, temp_vertex)); assignLast.Add(new Edge(temp_vertex, cut_place)); diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/GraphUtils.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/GraphUtils.cs index 3c8f90460..7d7e9b85d 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/GraphUtils.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/GraphUtils.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using PascalABCCompiler.CoreUtils; namespace AssignTupleDesugarAlgorithm @@ -83,7 +84,7 @@ namespace AssignTupleDesugarAlgorithm } - public static AssignGraph createAssignGraph(List left, List right) + public static AssignGraph createAssignGraph(List left, List right, GeneratedNamesManager generatedNamesManager) { if (right.Count < left.Count) throw new Exception("AAAA"); @@ -112,13 +113,13 @@ namespace AssignTupleDesugarAlgorithm { if (toFirst) { - var temp_symbol = new TempSymbol(); + var temp_symbol = new TempSymbol(generatedNamesManager); assign_first.Add(new Edge(new SymbolNode(right[i]), new TempSymbolNode(temp_symbol))); right[i] = temp_symbol; } else { - var temp_s = new TempSymbol(); + var temp_s = new TempSymbol(generatedNamesManager); assign_last.Add(new Edge(new TempSymbolNode(temp_s), new SymbolNode(left[i]))); left[i] = temp_s; } @@ -132,7 +133,7 @@ namespace AssignTupleDesugarAlgorithm || left[i].type == Symbol.Type.POINTER) { var res = new AssignGraph(); - res.assignFirst = make2n(left, right); + res.assignFirst = make2n(left, right, generatedNamesManager); return res; } else @@ -364,14 +365,14 @@ namespace AssignTupleDesugarAlgorithm return graph; } - private static List make2n(List left, List right) + private static List make2n(List left, List right, GeneratedNamesManager generatedNamesManager) { var temps = new List(); var res = new List(); for(int i = 0; i < right.Count; i++) { - var to = new SymbolNode(new TempSymbol()); + var to = new SymbolNode(new TempSymbol(generatedNamesManager)); var from = new SymbolNode(right[i]); temps.Add(to); res.Add(new Edge(from, to)); diff --git a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Symbol.cs b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Symbol.cs index d27d9aec3..a913ba6a8 100644 --- a/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Symbol.cs +++ b/SyntaxVisitors/SugarVisitors/AssignTuplesDesugarVisitor/desugarAlgoritm/Symbol.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using System.Diagnostics; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace AssignTupleDesugarAlgorithm { @@ -123,9 +123,8 @@ namespace AssignTupleDesugarAlgorithm public class TempSymbol : Symbol { - private static int counter = 0; - private static string getTempPrefix => "" + counter++; - public TempSymbol() : base(new ident(getTempPrefix), null) + public TempSymbol(GeneratedNamesManager generatedNamesManager) + : base(new ident(generatedNamesManager.GenerateName("")), null) { type = Type.LOCAL; } diff --git a/SyntaxVisitors/SugarVisitors/CacheFunctionVisitor.cs b/SyntaxVisitors/SugarVisitors/CacheFunctionVisitor.cs index 34a2e1b7e..7f7fa53d2 100644 --- a/SyntaxVisitors/SugarVisitors/CacheFunctionVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/CacheFunctionVisitor.cs @@ -1,23 +1,26 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; - +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors { public class CacheFunctionVisitor : BaseChangeVisitor { - private static int num = 0; - public static string UniqueNumStr() + + private readonly GeneratedNamesManager generatedNamesManager; + + private CacheFunctionVisitor(GeneratedNamesManager generatedNamesManager) { - num++; - return num.ToString(); + this.generatedNamesManager = generatedNamesManager; } - public static CacheFunctionVisitor New + + public static CacheFunctionVisitor Create(GeneratedNamesManager generatedNamesManager) => new CacheFunctionVisitor(generatedNamesManager); + + private string GenerateNewName(string prefix) { - get { return new CacheFunctionVisitor(); } + return generatedNamesManager.GenerateName(prefix); } public override void visit(simple_attribute_list al) @@ -74,7 +77,7 @@ namespace SyntaxVisitors.SugarVisitors var pp = pd.proc_header.parameters.params_list.SelectMany(tp => tp.idents.idents.Select(id => Tuple.Create(id, tp.vars_type))).ToArray(); // var @tpar := Tuple.Create(все параметры) - var tupleIdent = new ident("@tpar" + UniqueNumStr()); + var tupleIdent = new ident(GenerateNewName("@tpar")); // SSM 08.05.22 - один параметр не надо оборачивать в кортеж // SSM 09.05.22 - для реализации кортежа используется ValueTuple если он определен @@ -119,7 +122,7 @@ namespace SyntaxVisitors.SugarVisitors var new_ex = new new_expr(ttr_dict, new expression_list()); var sug_ex = new sugared_expression(ttp, new_ex, new_ex.source_context); // семантическая проверка выражения - var dictIdent = new ident("@" + pd.proc_header.name.ToString() + "DictCache" + UniqueNumStr()); + var dictIdent = new ident(GenerateNewName("@" + pd.proc_header.name.ToString() + "DictCache")); var vsglobal = new var_statement(dictIdent, sug_ex); var declarations = pd.Parent as declarations; diff --git a/SyntaxVisitors/SugarVisitors/DoubleQuestionDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/DoubleQuestionDesugarVisitor.cs index 40fe7c031..d58a1ff9c 100644 --- a/SyntaxVisitors/SugarVisitors/DoubleQuestionDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/DoubleQuestionDesugarVisitor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; @@ -9,25 +10,21 @@ namespace SyntaxVisitors.SugarVisitors { public class DoubleQuestionDesugarVisitor : BaseChangeVisitor { - public static DoubleQuestionDesugarVisitor New + /*private readonly GeneratedNamesManager generatedNamesManager; + + public DoubleQuestionDesugarVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new DoubleQuestionDesugarVisitor(); } + this.generatedNamesManager = generatedNamesManager; } - private int num = 0; + public static DoubleQuestionDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new DoubleQuestionDesugarVisitor(generatedNamesManager); - public string UniqueNumStr() - { - num++; - return num.ToString(); - } - - /*public override void visit(double_question_node dqn) + public override void visit(double_question_node dqn) { var st = dqn.Parent; while (!(st is statement)) st = st.Parent; - var tname = "#temp" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#temp"); var tt = new var_statement(new ident(tname, dqn.source_context), dqn.left, dqn.source_context); tt.var_def.Parent = tt; var l = new List(); diff --git a/SyntaxVisitors/SugarVisitors/LoopDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/LoopDesugarVisitor.cs index 25bc7df4b..03e012025 100644 --- a/SyntaxVisitors/SugarVisitors/LoopDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/LoopDesugarVisitor.cs @@ -1,29 +1,23 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace SyntaxVisitors.SugarVisitors { // Попробую сюда включить десахаризацию for с шагом public class LoopDesugarVisitor : BaseChangeVisitor { - public static LoopDesugarVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private LoopDesugarVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new LoopDesugarVisitor(); } + this.generatedNamesManager = generatedNamesManager; } - private int num = 0; - - public string UniqueNumStr() - { - num++; - return num.ToString(); - } + public static LoopDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoopDesugarVisitor(generatedNamesManager); public override void visit(loop_stmt loop) { @@ -31,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors var sl = new statement_list(); sl.Add(new semantic_check_sugared_statement_node(typeof(loop_stmt), new List { loop.count }, loop.source_context)); - var tname = "#loop_var" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#loop_var"); var fn = new for_node(new ident(tname), new int32_const(1), loop.count, loop.stmt, loop.source_context); sl.Add(fn); @@ -52,15 +46,14 @@ namespace SyntaxVisitors.SugarVisitors // * Можно на константу 0 проверить // * семантика - a, b - ожидался порядковый тип // семантика - b приводится к типу a - var un = UniqueNumStr(); - var a = new ident("#a" + un, fn.initial_value.source_context); - var b = new ident("#b" + un, fn.finish_value.source_context); - var oa = new ident("#oa" + un, a.source_context); - var ob = new ident("#ob" + un, b.source_context); - var h = new ident("#h" + un, fn.increment_value.source_context); - var n = new ident("#n" + un, a.source_context); + var a = new ident(generatedNamesManager.GenerateName("#a"), fn.initial_value.source_context); + var b = new ident(generatedNamesManager.GenerateName("#b"), fn.finish_value.source_context); + var oa = new ident(generatedNamesManager.GenerateName("#oa"), a.source_context); + var ob = new ident(generatedNamesManager.GenerateName("#ob"), b.source_context); + var h = new ident(generatedNamesManager.GenerateName("#h"), fn.increment_value.source_context); + var n = new ident(generatedNamesManager.GenerateName("#n"), a.source_context); var i = fn.loop_variable; //new ident(iname, a.source_context); - var j = new ident("#j" + un, a.source_context); + var j = new ident(generatedNamesManager.GenerateName("#j"), a.source_context); var avar = new var_statement(a, fn.initial_value, fn.initial_value.source_context); var bvar = new var_statement(b, fn.finish_value, fn.finish_value.source_context); var hvar = new var_statement(h, "integer", fn.increment_value, fn.increment_value.source_context); diff --git a/SyntaxVisitors/SugarVisitors/PropertyDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/PropertyDesugarVisitor.cs index 448778626..05be013e3 100644 --- a/SyntaxVisitors/SugarVisitors/PropertyDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/PropertyDesugarVisitor.cs @@ -1,19 +1,20 @@ using PascalABCCompiler.SyntaxTree; -using System; +using PascalABCCompiler.CoreUtils; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; namespace SyntaxVisitors.SugarVisitors { public class PropertyDesugarVisitor : BaseChangeVisitor { - public static PropertyDesugarVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private PropertyDesugarVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new PropertyDesugarVisitor(); } + this.generatedNamesManager = generatedNamesManager; } + public static PropertyDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new PropertyDesugarVisitor(generatedNamesManager); + public override void visit(class_members _class_members) { foreach (var member in _class_members.members) @@ -211,11 +212,9 @@ namespace SyntaxVisitors.SugarVisitors } //random id generator - private int postfix = 0; public ident NewId(string prefix, SourceContext sc = null) { - postfix++; - return new ident(prefix + postfix.ToString(), sc); + return new ident(generatedNamesManager.GenerateName(prefix), sc); } } diff --git a/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs b/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs index 9eccd4a58..104dc77b6 100644 --- a/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/QuestionPointDesugarVisitor.cs @@ -1,21 +1,23 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors { public class QuestionPointDesugarVisitor : BaseChangeVisitor { - public static QuestionPointDesugarVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private QuestionPointDesugarVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new QuestionPointDesugarVisitor(); } + this.generatedNamesManager = generatedNamesManager; } + public static QuestionPointDesugarVisitor Create(GeneratedNamesManager generatedNamesManager) => new QuestionPointDesugarVisitor(generatedNamesManager); + public question_colon_expression ConvertToQCE(dot_question_node dqn) { @@ -117,14 +119,6 @@ namespace SyntaxVisitors.SugarVisitors } } - private int num = 0; - - public string UniqueNumStr() - { - num++; - return num.ToString(); - } - /*public question_colon_expression ConvertToQCE1(dot_question_node dqn) { @@ -162,7 +156,7 @@ namespace SyntaxVisitors.SugarVisitors st = st.Parent; if (st == null) throw new SyntaxVisitorError("?._CANNOT_BE_IN_THIS_CONTEXT", dqn.source_context); - var tname = "#dqn_temp" + UniqueNumStr(); + var tname = generatedNamesManager.GenerateName("#dqn_temp"); dot_question_node rif = null; var qce = ConvertToQCE1(dqn, tname); diff --git a/SyntaxVisitors/SugarVisitors/ToExprVisitor.cs b/SyntaxVisitors/SugarVisitors/ToExprVisitor.cs index 39b12ca31..047bdffa4 100644 --- a/SyntaxVisitors/SugarVisitors/ToExprVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/ToExprVisitor.cs @@ -1,9 +1,6 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using PascalABCCompiler.SyntaxTree; @@ -19,12 +16,12 @@ namespace SyntaxVisitors.SugarVisitors get { return new ToExprVisitor(); } } - private int num = 0; - public string UniqueName() - { - num++; - return "#let_expr_vis"+num.ToString(); - } + //private int num = 0; + //public string UniqueName() + //{ + // num++; + // return "#let_expr_vis"+num.ToString(); + //} public override void visit(to_expr to_ex) { diff --git a/SyntaxVisitors/SugarVisitors/TupleVisitor.cs b/SyntaxVisitors/SugarVisitors/TupleVisitor.cs index 6a48dc692..f092c52a6 100644 --- a/SyntaxVisitors/SugarVisitors/TupleVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/TupleVisitor.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; - +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors @@ -16,17 +16,19 @@ namespace SyntaxVisitors.SugarVisitors { public bool optimize_tuple_assign; - public TupleVisitor(bool optimize_tup_opt) + private readonly GeneratedNamesManager generatedNamesManager; + + public TupleVisitor(bool optimize_tup_opt, GeneratedNamesManager generatedNamesManager) { optimize_tuple_assign = optimize_tup_opt; + this.generatedNamesManager = generatedNamesManager; } - public static TupleVisitor Create(bool optimize_tup_opt) => new TupleVisitor(optimize_tup_opt); - private int num = 0; - public string UniqueName() + public static TupleVisitor Create(bool optimize_tup_opt, GeneratedNamesManager generatedNamesManager) => new TupleVisitor(optimize_tup_opt, generatedNamesManager); + + private string UniqueName() { - num++; - return "#tup_vis"+num.ToString(); + return generatedNamesManager.GenerateName("#tup_vis"); } public override void visit(read_accessor_name wn) diff --git a/SyntaxVisitors/SugarVisitors/UnpackLambdaParametersVisitor.cs b/SyntaxVisitors/SugarVisitors/UnpackLambdaParametersVisitor.cs index 9960edba0..92fb30df6 100644 --- a/SyntaxVisitors/SugarVisitors/UnpackLambdaParametersVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/UnpackLambdaParametersVisitor.cs @@ -1,32 +1,26 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors.SugarVisitors { public class UnpackLambdaParametersVisitor : BaseChangeVisitor { - public static UnpackLambdaParametersVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private UnpackLambdaParametersVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new UnpackLambdaParametersVisitor(); } + this.generatedNamesManager = generatedNamesManager; } - private static int num = 0; - - public static string UniqueNumStr() - { - num++; - return num.ToString(); - } + public static UnpackLambdaParametersVisitor Create(GeneratedNamesManager generatedNamesManager) => new UnpackLambdaParametersVisitor(generatedNamesManager); public ident CreateIdent(SourceContext sc) { - return new ident("#fpl" + UniqueNumStr(), sc); + return new ident(generatedNamesManager.GenerateName("#fpl"), sc); } public void CreateUnpackedListOfAssignments(unpacked_list_of_ident_or_list ll, List res, ident prevname, SourceContext sc) diff --git a/SyntaxVisitors/SyntaxVisitors.csproj b/SyntaxVisitors/SyntaxVisitors.csproj index 7f4736d44..0a0470b23 100644 --- a/SyntaxVisitors/SyntaxVisitors.csproj +++ b/SyntaxVisitors/SyntaxVisitors.csproj @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/SyntaxVisitors/VisitorsForLambdas/RenameOnExceptVarsVisitor.cs b/SyntaxVisitors/VisitorsForLambdas/RenameOnExceptVarsVisitor.cs index 4a34b1df8..8d543d43f 100644 --- a/SyntaxVisitors/VisitorsForLambdas/RenameOnExceptVarsVisitor.cs +++ b/SyntaxVisitors/VisitorsForLambdas/RenameOnExceptVarsVisitor.cs @@ -1,12 +1,8 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using PascalABCCompiler; +using System.Collections.Generic; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors @@ -16,8 +12,12 @@ namespace SyntaxVisitors { public string NameForRename = null; public string NewName = null; - public RenameOnExceptVarsVisitor() + + private readonly GeneratedNamesManager generatedNamesManager; + + public RenameOnExceptVarsVisitor(GeneratedNamesManager generatedNamesManager) { + this.generatedNamesManager = generatedNamesManager; } public void Rename(exception_handler eh) @@ -46,26 +46,29 @@ namespace SyntaxVisitors ProcessNode(dn.right); } - private static int num = 0; - private static string GetNewVariableName(string name) + private string GetNewVariableName(string name) { - num++; - return "$Rename_"+name+num.ToString(); + return generatedNamesManager.GenerateName("$Rename_" + name); } } public class FindOnExceptVarsAndApplyRenameVisitor : BaseChangeVisitor { - public static FindOnExceptVarsAndApplyRenameVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private FindOnExceptVarsAndApplyRenameVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new FindOnExceptVarsAndApplyRenameVisitor(); } + this.generatedNamesManager = generatedNamesManager; } + + public static FindOnExceptVarsAndApplyRenameVisitor Create(GeneratedNamesManager generatedNamesManager) => new FindOnExceptVarsAndApplyRenameVisitor(generatedNamesManager); + public override void visit(exception_handler eh) { if (eh.variable != null) { // Вначале переименовать везде кроме как в заголовке, потом добавить в блок операторов переприсваивание - var vis = new RenameOnExceptVarsVisitor(); + var vis = new RenameOnExceptVarsVisitor(generatedNamesManager); vis.Rename(eh); var vs = new var_statement(new ident(vis.NewName/*, eh.statements.source_context*/), new ident(vis.NameForRename, eh.variable.source_context)/*, eh.statements.source_context*/); diff --git a/SyntaxVisitors/VisitorsForLambdas/StandOutExprWithLambdaInForeachSequenceVisitor.cs b/SyntaxVisitors/VisitorsForLambdas/StandOutExprWithLambdaInForeachSequenceVisitor.cs index f95481e95..dc325da0b 100644 --- a/SyntaxVisitors/VisitorsForLambdas/StandOutExprWithLambdaInForeachSequenceVisitor.cs +++ b/SyntaxVisitors/VisitorsForLambdas/StandOutExprWithLambdaInForeachSequenceVisitor.cs @@ -1,8 +1,7 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace PascalABCCompiler.SyntaxTreeConverters @@ -12,21 +11,20 @@ namespace PascalABCCompiler.SyntaxTreeConverters // Второе предназначение - переименовать все переменные, совпадающие по имени с типом T обобщенного класса, в котором находится метод, содержащий лямбду public class StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor : BaseChangeVisitor { - public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + private StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(GeneratedNamesManager generatedNamesManager) { - get - { - return new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(); - } + this.generatedNamesManager = generatedNamesManager; } - private int GenIdNum = 0; + + public static StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor Create(GeneratedNamesManager generatedNamesManager) + => new StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor(generatedNamesManager); //private ident_list ClassTemplateArgsOrNull = null; // если мы - в обобщенном классе, то это - его обобщенные параметры public ident GenIdentName() { - GenIdNum++; - return new ident("$GenContFE" + GenIdNum.ToString()); + return new ident(generatedNamesManager.GenerateName("$GenContFE")); } public override void visit(foreach_stmt fe) diff --git a/SyntaxVisitors/YieldVisitors/CapturedLambdaInYieldVisitor.cs b/SyntaxVisitors/YieldVisitors/CapturedLambdaInYieldVisitor.cs index 205e20cfb..392fb4aa7 100644 --- a/SyntaxVisitors/YieldVisitors/CapturedLambdaInYieldVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/CapturedLambdaInYieldVisitor.cs @@ -1,38 +1,30 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using PascalABCCompiler; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors { public class CapturedLambdaInYieldVisitor : BaseChangeVisitor { + private readonly GeneratedNamesManager generatedNamesManager; - public CapturedLambdaInYieldVisitor() + private CapturedLambdaInYieldVisitor(GeneratedNamesManager generatedNamesManager) { + this.generatedNamesManager = generatedNamesManager; } - public static CapturedLambdaInYieldVisitor New + public static CapturedLambdaInYieldVisitor Create(GeneratedNamesManager generatedNamesManager) => new CapturedLambdaInYieldVisitor(generatedNamesManager); + + public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager) { - get { return new CapturedLambdaInYieldVisitor(); } + Create(generatedNamesManager).ProcessNode(pd); } - public static void Accept(procedure_definition pd) + private string CreateNameForLambdaInYield() { - New.ProcessNode(pd); - } - - int ynum = 0; - public string CreateNameForLambdaInYield() - { - ynum += 1; - return "@RenLamInYield" + ynum + "$"; + return generatedNamesManager.GenerateName("@RenLamInYield", "$"); } public override void visit(yield_node yn) diff --git a/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs b/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs index d11d9617c..cee9c31e2 100644 --- a/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs @@ -1,15 +1,15 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using PascalABCCompiler; +using PascalABCCompiler.CoreUtils; +using PascalABCCompiler.Errors; +using PascalABCCompiler.SyntaxTree; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using PascalABCCompiler.Errors; -using PascalABCCompiler; -using PascalABCCompiler.SyntaxTree; - namespace SyntaxVisitors { public class VarNames @@ -30,40 +30,37 @@ namespace SyntaxVisitors public class LoweringVisitor : BaseChangeVisitor { - public static LoweringVisitor New + private readonly GeneratedNamesManager generatedNamesManager; + + private LoweringVisitor(GeneratedNamesManager generatedNamesManager) { - get { return new LoweringVisitor(); } + this.generatedNamesManager = generatedNamesManager; } - private int _varnum = 0; - private int _foreachCollectionNum = 0; - private int _enumeratorNum = 0; + public static LoweringVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoweringVisitor(generatedNamesManager); private VarNames NewVarNames(ident name) { - _varnum++; return new VarNames() { - VarName = "$" + name.name + _varnum, - VarEndName = "<>varLV" + _varnum + VarName = generatedNamesManager.GenerateName("$" + name.name), + VarEndName = generatedNamesManager.GenerateName("<>varLV") }; } private ident NewEnumeratorName() { - ++_enumeratorNum; - return "$enumerator$" + _enumeratorNum; + return generatedNamesManager.GenerateName("$enumerator$"); } private ident NewForeachCollectionName() { - ++_foreachCollectionNum; - return "$coll$" + _foreachCollectionNum; + return generatedNamesManager.GenerateName("$coll$"); } - public static void Accept(procedure_definition pd) + public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager) { - New.ProcessNode(pd); + Create(generatedNamesManager).ProcessNode(pd); } public override void Enter(syntax_tree_node st) @@ -250,7 +247,7 @@ namespace SyntaxVisitors if (!b) return; - var gtAfter = goto_statement.New; + var gtAfter = GenerateGoto(); var lbAfter = new labeled_statement(gtAfter.label); if ((object)ifn.else_body == null) @@ -266,7 +263,7 @@ namespace SyntaxVisitors } else { - var gtAlt = goto_statement.New; + var gtAlt = GenerateGoto(); var lbAlt = new labeled_statement(gtAlt.label, ifn.else_body); var if0 = new if_node(un_expr.Not(ifn.condition), gtAlt); @@ -286,8 +283,8 @@ namespace SyntaxVisitors if (!b) return; - var gotoContinue = goto_statement.New; - var gotoBreak = goto_statement.New; + var gotoContinue = GenerateGoto(); + var gotoBreak = GenerateGoto(); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); rn.statements.visit(replaceBreakContinueVis); @@ -315,8 +312,8 @@ namespace SyntaxVisitors if (!b) return; - var gotoBreak = goto_statement.New; - var gotoContinue = goto_statement.New; + var gotoBreak = GenerateGoto(); + var gotoContinue = GenerateGoto(); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); wn.statements.visit(replaceBreakContinueVis); @@ -350,9 +347,9 @@ namespace SyntaxVisitors if (!b) return; - var gotoContinue = goto_statement.New; - var gotoBreak = goto_statement.New; - var gotoStart = goto_statement.New; + var gotoContinue = GenerateGoto(); + var gotoBreak = GenerateGoto(); + var gotoStart = GenerateGoto(); ReplaceBreakContinueWithGotoLabelVisitor replaceBreakContinueVis = new ReplaceBreakContinueWithGotoLabelVisitor(gotoContinue, gotoBreak); fn.statements.visit(replaceBreakContinueVis); @@ -437,6 +434,12 @@ namespace SyntaxVisitors bl.defs.Add(new label_definitions(gotoContinue.label, gotoBreak.label, gotoStart.label)); } + + private goto_statement GenerateGoto() + { + return new goto_statement(generatedNamesManager.GenerateName("lb#")); + } + /* public override void visit(for_node fn) { diff --git a/SyntaxVisitors/YieldVisitors/LoweringYieldSequenceVisitor.cs b/SyntaxVisitors/YieldVisitors/LoweringYieldSequenceVisitor.cs index afa6a9893..4a55f64af 100644 --- a/SyntaxVisitors/YieldVisitors/LoweringYieldSequenceVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/LoweringYieldSequenceVisitor.cs @@ -9,27 +9,29 @@ using System.Threading.Tasks; using PascalABCCompiler.Errors; using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace SyntaxVisitors { public class LoweringYieldSequenceVisitor : BaseChangeVisitor { - private int _Num = 0; + private readonly GeneratedNamesManager generatedNamesManager; + + private LoweringYieldSequenceVisitor(GeneratedNamesManager generatedNamesManager) + { + this.generatedNamesManager = generatedNamesManager; + } private ident NewVarName() { - ++_Num; - return new ident("$yieldSeqForeachVar$" + _Num); + return new ident(generatedNamesManager.GenerateName("$yieldSeqForeachVar$")); } - public static LoweringYieldSequenceVisitor New - { - get { return new LoweringYieldSequenceVisitor(); } - } + public static LoweringYieldSequenceVisitor Create(GeneratedNamesManager generatedNamesManager) => new LoweringYieldSequenceVisitor(generatedNamesManager); - public static void Accept(procedure_definition pd) + public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager) { - New.ProcessNode(pd); + Create(generatedNamesManager).ProcessNode(pd); } public override void visit(yield_sequence_node yn) diff --git a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index bf195af99..2c6bc5b03 100644 --- a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -1,50 +1,39 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; -using PascalABCCompiler.ParserTools; using PascalABCCompiler.Errors; - -using PascalABCCompiler.YieldHelpers; +using PascalABCCompiler.CoreUtils; namespace SyntaxVisitors { public static class CapturedNamesHelper { - public static int CurrentLocalVariableNum = 0; - - public static void Reset() - { - CurrentLocalVariableNum = 0; - } + public enum ReservedNum { StateField = 1, CurrentField = 2, MethodFormalParam = 3, MethodSelf = 4, MethodLocalVariable = 5 } public static string MakeCapturedFormalParameterName(string formalParamName) { - return string.Format("<>{0}__{1}", YieldConsts.ReservedNum.MethodFormalParam, formalParamName); + return string.Format("<>{0}__{1}", ReservedNum.MethodFormalParam, formalParamName); } - public static string MakeCapturedLocalName(string localName) + public static string MakeCapturedLocalName(string localName, GeneratedNamesManager generatedNamesManager) { - return string.Format("<{0}>{1}__{2}", localName, YieldConsts.ReservedNum.MethodLocalVariable, ++CurrentLocalVariableNum); + return generatedNamesManager.GenerateName($"<{localName}>{ReservedNum.MethodLocalVariable}__"); } } public class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor { - int clnum = 0; + private readonly GeneratedNamesManager generatedNamesManager; public string NewYieldClassName() { - clnum++; - return "clyield#" + clnum.ToString(); + return generatedNamesManager.GenerateName("clyield#"); } public FindMainIdentsVisitor mids; // захваченные переменные процедуры по всем её yield @@ -53,14 +42,12 @@ namespace SyntaxVisitors public bool hasYields = false; - public static ProcessYieldCapturedVarsVisitor New - { - get { return new ProcessYieldCapturedVarsVisitor(); } - } + public static ProcessYieldCapturedVarsVisitor Create(GeneratedNamesManager generatedNamesManager) => new ProcessYieldCapturedVarsVisitor(generatedNamesManager); - public ProcessYieldCapturedVarsVisitor() + private ProcessYieldCapturedVarsVisitor(GeneratedNamesManager generatedNamesManager) { //PrintInfo = false; + this.generatedNamesManager = generatedNamesManager; } /*public override void Enter(syntax_tree_node st) @@ -164,7 +151,7 @@ namespace SyntaxVisitors // frninja 20/04/16 - поддержка шаблонных классов var iteratorClassRef = CreateClassReference(iteratorClassName); - cm.Add(new var_def_statement(YieldConsts.Self, iteratorClassRef)); + cm.Add(new var_def_statement(StringConstants.yieldSelf, iteratorClassRef)); } var GetEnumeratorBody = new statement_list(); @@ -173,12 +160,12 @@ namespace SyntaxVisitors ResetBody.Add(nsex); // Системные поля и методы для реализации интерфейса IEnumerable - cm.Add(new var_def_statement(YieldConsts.State, "integer"), - new var_def_statement(YieldConsts.Current, stels), + cm.Add(new var_def_statement(StringConstants.yieldState, "integer"), + new var_def_statement(StringConstants.yieldCurrent, stels), procedure_definition.EmptyDefaultConstructor, new procedure_definition("Reset", ResetBody), new procedure_definition("MoveNext", "boolean", pd.proc_body), - new procedure_definition("System.Collections.IEnumerator.get_Current", "object", new assign("Result", YieldConsts.Current)), + new procedure_definition("System.Collections.IEnumerator.get_Current", "object", new assign("Result", StringConstants.yieldCurrent)), //new procedure_definition("System.Collections.IEnumerable.GetEnumerator", "System.Collections.IEnumerator", new assign("Result", "Self")) new procedure_definition("System.Collections.IEnumerable.GetEnumerator", "System.Collections.IEnumerator", GetEnumeratorBody) ); @@ -210,7 +197,7 @@ namespace SyntaxVisitors // frninja 08/12/15 - захват self if (iteratorClassName != null && !pd.proc_header.class_keyword) { - stl.Add(new assign(new dot_node("$res", YieldConsts.Self), new ident("self"))); + stl.Add(new assign(new dot_node("$res", StringConstants.yieldSelf), new ident("self"))); } stl.Add(new assign("Result", "$res")); @@ -262,7 +249,7 @@ namespace SyntaxVisitors var cm1 = cm.Add( //class_members.Public.Add( //procedure_definition.EmptyDefaultConstructor, - new procedure_definition(new function_header("get_Current", stels), new assign("Result", YieldConsts.Current)), + new procedure_definition(new function_header("get_Current", stels), new assign("Result", StringConstants.yieldCurrent)), new procedure_definition(new function_header("GetEnumerator", IEnumeratorT), GetEnumeratorBody), new procedure_definition("Dispose") ); @@ -292,7 +279,7 @@ namespace SyntaxVisitors // Переприсваивание self if (iteratorClassName != null && !pd.proc_header.class_keyword) { - stl1.Add(new assign(new dot_node("$res", YieldConsts.Self), new ident(YieldConsts.Self))); + stl1.Add(new assign(new dot_node("$res", StringConstants.yieldSelf), new ident(StringConstants.yieldSelf))); } stl1.Add(new assign("Result", "$res")); @@ -561,11 +548,11 @@ namespace SyntaxVisitors } } - private void CreateCapturedLocalsNamesMap(ISet localsNames, IDictionary capturedLocalsNamesMap) + private void CreateCapturedLocalsNamesMap(ISet localsNames, IDictionary capturedLocalsNamesMap, GeneratedNamesManager generatedNamesManager) { foreach (var localName in localsNames) { - capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName)); + capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName, generatedNamesManager)); } } @@ -656,7 +643,7 @@ namespace SyntaxVisitors // Добавляем в класс метод с обертками для локальных переменных - pdCloned.proc_header.name.meth_name = new ident(YieldConsts.YieldHelperMethodPrefix + "_error_checkerr>" + pd.proc_header.name.meth_name.name, + pdCloned.proc_header.name.meth_name = new ident(StringConstants.yieldHelperMethodPrefix + "_error_checkerr>" + pd.proc_header.name.meth_name.name, // frninja 05/06/16 - фиксим source_context pd.proc_header.name.meth_name.source_context); // = new method_name("" + pd.proc_header.className.meth_name.className); //pdCloned.is_yield_helper = true; @@ -692,7 +679,7 @@ namespace SyntaxVisitors localsClonesCollection = localsTypeDetectorHelperVisitor.LocalDeletedDefs.ToArray(); // Добавляем в класс метод с обертками для локальных переменных - pdCloned.proc_header.name.meth_name = new ident(YieldConsts.YieldHelperMethodPrefix+ "_locals_type_detector>" + pd.proc_header.name.meth_name.name, + pdCloned.proc_header.name.meth_name = new ident(StringConstants.yieldHelperMethodPrefix+ "_locals_type_detector>" + pd.proc_header.name.meth_name.name, // frninja 05/06/16 - фиксим source_context pd.proc_header.name.meth_name.source_context); // = new method_name("" + pd.proc_header.className.meth_name.className); @@ -781,10 +768,12 @@ namespace SyntaxVisitors /// Коллекция удаленных локальных переменных /// Построенное отображение имен локальных переменных в захваченные имена /// Построенное отображение имен формальных параметров в захваченные имена + /// Хранилище счетчиков сгенерированных переменных private void ReplaceCapturedVariables(procedure_definition pd, IEnumerable deletedLocals, out IDictionary capturedLocalsNamesMap, - out IDictionary capturedFormalParamsNamesMap) + out IDictionary capturedFormalParamsNamesMap, + GeneratedNamesManager generatedNamesManager) { // Структуры данных под классификацию имен в методе @@ -824,7 +813,7 @@ namespace SyntaxVisitors // Строим отображения для имён захваченных локальных переменных и формальных параметров // Create maps :: idName -> captureName - CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap); + CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap, generatedNamesManager); CreateCapturedFormalParamsNamesMap(CollectedFormalParamsNames, capturedFormalParamsNamesMap); // Выполняем замену захват имён в теле метода @@ -980,16 +969,15 @@ namespace SyntaxVisitors Enumerable.Empty())); pd.visit(checkVarRedefVisitor); */ - // SSM 21/06 - Выносим yield x -> x - CapturedLambdaInYieldVisitor.Accept(pd); + CapturedLambdaInYieldVisitor.Accept(pd, generatedNamesManager); // Выносим выражение из yield в отдельную переменную - ReplaceYieldExprByVarVisitor.Accept(pd); + ReplaceYieldExprByVarVisitor.Accept(pd, generatedNamesManager); // Раскрываем операторы yield sequence. На семантике они не существуют - LoweringYieldSequenceVisitor.Accept(pd); + LoweringYieldSequenceVisitor.Accept(pd, generatedNamesManager); // frninja 31/05/16 - добавляем метод-хелпер, возьмет на себя проверку разных ошибок уже существующим бэкендом CreateErrorCheckerHelper(pd); // SSM 14/07/16 - переставил до переименования переменных чтобы отлавливались ошибки одинаковых имен в разных пространствах имен @@ -1012,7 +1000,7 @@ namespace SyntaxVisitors } // Теперь lowering - LoweringVisitor.Accept(pd); + LoweringVisitor.Accept(pd, generatedNamesManager); // frninja 13/04/16 - убираем лишние begin..end DeleteRedundantBeginEnds.Accept(pd); @@ -1034,7 +1022,7 @@ namespace SyntaxVisitors // Выполняем захват имён IDictionary CapturedLocalsNamesMap; IDictionary CapturedFormalParamsNamesMap; - ReplaceCapturedVariables(pd, dld.LocalDeletedDefs, out CapturedLocalsNamesMap, out CapturedFormalParamsNamesMap); + ReplaceCapturedVariables(pd, dld.LocalDeletedDefs, out CapturedLocalsNamesMap, out CapturedFormalParamsNamesMap, generatedNamesManager); //mids.vars.Except(dld.LocalDeletedDefsNames); // параметры остались. Их тоже надо исключать - они и так будут обработаны // В результате работы в mids.vars что-то осталось. Это не локальные переменные и с ними непонятно что делать @@ -1178,11 +1166,11 @@ namespace SyntaxVisitors var yn = st as yield_node; curState += 1; res.AddMany( - new assign(YieldConsts.Current, yn.ex, yn.source_context), - new assign(YieldConsts.State, curState), + new assign(StringConstants.yieldCurrent, yn.ex, yn.source_context), + new assign(StringConstants.yieldState, curState), new assign("Result", true), new procedure_call("exit"), - new labeled_statement(YieldConsts.LabelStatePrefix+curState.ToString()) + new labeled_statement(StringConstants.yieldLabelStatePrefix+curState.ToString()) ); } else if (st is labeled_statement) @@ -1199,7 +1187,7 @@ namespace SyntaxVisitors public void Transform() { - res.Add(new labeled_statement(YieldConsts.LabelStatePrefix+curState.ToString())); + res.Add(new labeled_statement(StringConstants.yieldLabelStatePrefix+curState.ToString())); foreach (var st in stl.subnodes) Process(st); @@ -1209,10 +1197,10 @@ namespace SyntaxVisitors var idl = new ident_list(idseq.ToList()); defs.Add(new label_definitions(idl)); - statement ifgoto = new goto_statement(YieldConsts.LabelStatePrefix + curState.ToString()); + statement ifgoto = new goto_statement(StringConstants.yieldLabelStatePrefix + curState.ToString()); for (var i = curState - 1; i >= 0; i--) - ifgoto = new if_node(new bin_expr(new ident(YieldConsts.State), new int32_const(i), Operators.Equal), - new goto_statement(YieldConsts.LabelStatePrefix + i.ToString()), + ifgoto = new if_node(new bin_expr(new ident(StringConstants.yieldState), new int32_const(i), Operators.Equal), + new goto_statement(StringConstants.yieldLabelStatePrefix + i.ToString()), ifgoto ); res.AddFirst(ifgoto); diff --git a/SyntaxVisitors/YieldVisitors/ReplaceCapturedVariablesVisitor.cs b/SyntaxVisitors/YieldVisitors/ReplaceCapturedVariablesVisitor.cs index af379257a..31c4aa339 100644 --- a/SyntaxVisitors/YieldVisitors/ReplaceCapturedVariablesVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/ReplaceCapturedVariablesVisitor.cs @@ -1,15 +1,10 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using PascalABCCompiler; using PascalABCCompiler.SyntaxTree; -using PascalABCCompiler.YieldHelpers; namespace SyntaxVisitors { @@ -89,7 +84,7 @@ namespace SyntaxVisitors // frninja 31/03/16 - фикс селфа для extensionmethod if (idName == "self" && !CollectedFormalParams.Contains(idName)) { - var newSelf = new dot_node(new ident("self"), new ident(YieldConsts.Self)); + var newSelf = new dot_node(new ident("self"), new ident(StringConstants.yieldSelf)); Replace(id, newSelf); return; } @@ -161,7 +156,7 @@ namespace SyntaxVisitors public override void visit(dot_node dn) { var rid = dn.right as ident; - if ((object)rid != null && rid.name != YieldConsts.Self) + if ((object)rid != null && rid.name != StringConstants.yieldSelf) ProcessNode(dn.left); // Most nested diff --git a/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs b/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs index b3572f867..22e5a9850 100644 --- a/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs @@ -1,35 +1,29 @@ // Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using PascalABCCompiler.Errors; -using PascalABCCompiler; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.SyntaxTree; namespace SyntaxVisitors { public class ReplaceYieldExprByVarVisitor : BaseChangeVisitor { - private int _Num = 0; + private readonly GeneratedNamesManager generatedNamesManager; + + private ReplaceYieldExprByVarVisitor(GeneratedNamesManager generatedNamesManager) + { + this.generatedNamesManager = generatedNamesManager; + } private ident NewVarName() { - ++_Num; - return new ident("$yieldExprVar$" + _Num); + return new ident(generatedNamesManager.GenerateName("$yieldExprVar$")); } - public static ReplaceYieldExprByVarVisitor New - { - get { return new ReplaceYieldExprByVarVisitor(); } - } + public static ReplaceYieldExprByVarVisitor Create(GeneratedNamesManager generatedNamesManager) => new ReplaceYieldExprByVarVisitor(generatedNamesManager); - public static void Accept(procedure_definition pd) + public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager) { - New.ProcessNode(pd); + Create(generatedNamesManager).ProcessNode(pd); } public override void visit(yield_node yn) diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionClassGenerator.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionClassGenerator.cs index 8d79787ec..620b9209a 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionClassGenerator.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionClassGenerator.cs @@ -7,6 +7,7 @@ using PascalABCCompiler.SemanticTree; using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.TreeRealization; using static PascalABCCompiler.StringConstants; +using PascalABCCompiler.CoreUtils; namespace TreeConverter.LambdaExpressions.Closure { @@ -17,16 +18,11 @@ namespace TreeConverter.LambdaExpressions.Closure private readonly List _lambdasToBeAddedAsMethods; private const string GeneratedClassPrefix = "<>local_variables_class_"; private const string GeneratedUpperClassPrefix = "<>local_variables_class_UPPER_"; - private static int _generatedClassCounter; - private static int _generatedUpperClassCounter; private readonly Dictionary _substitutions; private readonly List _lambdaIdReferences = new List(); - private readonly List _rewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo = new List(); - public static void Reset() - { - _generatedClassCounter = 0; - _generatedUpperClassCounter = 0; - } + private readonly List _rewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo = new List(); + + private readonly GeneratedNamesManager generatedNamesManager; public class VariableSubstitutionsInfo { @@ -57,7 +53,6 @@ namespace TreeConverter.LambdaExpressions.Closure public class ScopeClassDefinition { private const string GeneratedSubstitutingFieldPrefix = "<>local_variables_"; //это поле для того, чтобы заменять в текущем блоке, где захватывались переменные, левую часть dot_node - private static int _generatedSubstitutingFieldCounter; public List NestedLambdas { get; set; } @@ -79,7 +74,7 @@ namespace TreeConverter.LambdaExpressions.Closure get { return _generatedSubstitutingFieldName ?? (_generatedSubstitutingFieldName = - GeneratedSubstitutingFieldPrefix + _generatedSubstitutingFieldCounter++); + generatedNamesManager.GenerateName(GeneratedSubstitutingFieldPrefix)); } } @@ -90,7 +85,7 @@ namespace TreeConverter.LambdaExpressions.Closure { return _generatedUpperClassFieldName ?? (_generatedUpperClassFieldName = - GeneratedUpperClassPrefix + _generatedUpperClassCounter++); + generatedNamesManager.GenerateName(GeneratedUpperClassPrefix)); } } @@ -123,9 +118,12 @@ namespace TreeConverter.LambdaExpressions.Closure public CapturedVariablesTreeNode CorrespondingTreeNode { get; private set; } + private readonly GeneratedNamesManager generatedNamesManager; + public ScopeClassDefinition(syntax_tree_node syntaxTreeNode, type_declaration classDeclaration, CapturedVariablesTreeNode correspondingTreeNode, + GeneratedNamesManager generatedNamesManager, string generatedSubstitutingFieldName = null) { CorrespondingSyntaxTreeNode = syntaxTreeNode; @@ -133,6 +131,7 @@ namespace TreeConverter.LambdaExpressions.Closure _generatedSubstitutingFieldName = generatedSubstitutingFieldName; CorrespondingTreeNode = correspondingTreeNode; NestedLambdas = new List(); + this.generatedNamesManager = generatedNamesManager; } } @@ -151,19 +150,20 @@ namespace TreeConverter.LambdaExpressions.Closure public syntax_tree_node NodeWithVarDecl { get; set; } } - public CapturedVariablesSubstitutionClassGenerator(CapturedVariablesTreeNode capturedVariablesRootTreeNode) + public CapturedVariablesSubstitutionClassGenerator(CapturedVariablesTreeNode capturedVariablesRootTreeNode, GeneratedNamesManager generatedNamesManager) { _capturedVariablesRootTreeNode = capturedVariablesRootTreeNode; _capturedVarsClassDefs = new Dictionary(); _substitutions = new Dictionary(); _lambdasToBeAddedAsMethods = new List(); + this.generatedNamesManager = generatedNamesManager; } private string GeneratedClassName { get { - return GeneratedClassPrefix + _generatedClassCounter++; + return generatedNamesManager.GenerateName(GeneratedClassPrefix); } } @@ -303,7 +303,8 @@ namespace TreeConverter.LambdaExpressions.Closure new ScopeClassDefinition( nextNodeWhereVarsAreCaptured.CorrespondingSyntaxTreeNode, typeDeclaration, - nextNodeWhereVarsAreCaptured)); + nextNodeWhereVarsAreCaptured, + generatedNamesManager)); } var nextNodeWhereVarsAreCapturedClass = @@ -488,7 +489,8 @@ namespace TreeConverter.LambdaExpressions.Closure new ScopeClassDefinition( scope.CorrespondingSyntaxTreeNode, typeDeclaration, - scope)); + scope, + generatedNamesManager)); } var substKey = new SubstitutionKey(varName, symbolInfo.SyntaxTreeNodeWithVarDeclaration, @@ -686,6 +688,7 @@ namespace TreeConverter.LambdaExpressions.Closure new ScopeClassDefinition(currentNode.CorrespondingSyntaxTreeNode, typeDeclaration, currentNode, + generatedNamesManager, PascalABCCompiler.StringConstants.self_word)); } } @@ -698,7 +701,8 @@ namespace TreeConverter.LambdaExpressions.Closure _capturedVarsClassDefs.Add(currentNode.ScopeIndex, new ScopeClassDefinition(currentNode.CorrespondingSyntaxTreeNode, typeDeclaration, - currentNode)); + currentNode, + generatedNamesManager)); } diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionsManager.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionsManager.cs index 2fb5d26e5..3cb34ad11 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionsManager.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutionsManager.cs @@ -3,16 +3,17 @@ using System.Linq; using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.TreeConverter; +using PascalABCCompiler.CoreUtils; namespace TreeConverter.LambdaExpressions.Closure { class CapturedVariablesSubstitutionsManager { - public static void Substitute(syntax_tree_visitor _visitor, declarations decls, statement_list _statementList) + public static void Substitute(syntax_tree_visitor _visitor, declarations decls, statement_list _statementList, GeneratedNamesManager generatedNamesManager) { - var tree = new CapturedVariablesTreeBuilder(_visitor).BuildTree(_statementList); - var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode).GenerateSubstitutions(); - new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor) + var tree = new CapturedVariablesTreeBuilder(_visitor, generatedNamesManager).BuildTree(_statementList); + var substs = new CapturedVariablesSubstitutionClassGenerator(tree.RootNode, generatedNamesManager).GenerateSubstitutions(); + new CapturedVariablesSubstitutor(tree.IdentsReferences, substs.GeneratedScopeClassesInfo, substs.LambdasToBeAddedAsMethods, substs.SubstitutionsInfo, tree.CapturedVarsNodesDictionary, substs.ConvertingClassNonPublicMembersMapping, _visitor, generatedNamesManager) .Substitute(_statementList); if (_visitor.context.converting_block() == block_type.function_block && tree.ProcedureScope != null) diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs index bf7033a60..cd4c49c8e 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesSubstitutor.cs @@ -10,6 +10,7 @@ using PascalABCCompiler.TreeConverter; using PascalABCCompiler.TreeRealization; using array_const = PascalABCCompiler.SyntaxTree.array_const; using for_node = PascalABCCompiler.SyntaxTree.for_node; +using PascalABCCompiler.CoreUtils; namespace TreeConverter.LambdaExpressions.Closure { @@ -82,13 +83,16 @@ namespace TreeConverter.LambdaExpressions.Closure private readonly List _lambdasToBeAddedAsMethods; private readonly Dictionary> _mappingForNonPublicFieldsOfClass; + private readonly GeneratedNamesManager _generatedNamesManager; + public CapturedVariablesSubstitutor(Dictionary> identsReferences, Dictionary generatedScopeClassesInfo, List lambdasToBeAddedAsMethods, Dictionary substitutionsInfo, Dictionary capturedVarsTreeNodesDictionary, Dictionary> mappingForNonPublicFieldsOfClass, - syntax_tree_visitor visitor) + syntax_tree_visitor visitor, + GeneratedNamesManager generatedNamesManager) { _identsReferences = identsReferences; _generatedScopeClassesInfo = generatedScopeClassesInfo; @@ -97,6 +101,7 @@ namespace TreeConverter.LambdaExpressions.Closure _lambdasToBeAddedAsMethods = lambdasToBeAddedAsMethods; _mappingForNonPublicFieldsOfClass = mappingForNonPublicFieldsOfClass; _visitor = visitor; + _generatedNamesManager = generatedNamesManager; } public override void visit(function_lambda_definition fld) @@ -595,7 +600,7 @@ namespace TreeConverter.LambdaExpressions.Closure if (initVal is array_const) { - auxVarName = LambdaHelper.GetAuxVarName(); + auxVarName = LambdaHelper.GetAuxVarName(_generatedNamesManager); var newVarDefStmt = new var_def_statement(new ident_list(new ident(auxVarName)), varStatement.var_def.vars_type) { inital_value = initVal diff --git a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs index 896d4d27f..8b04bb34e 100644 --- a/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs +++ b/TreeConverter/LambdaExpressions/Closure/CapturedVariablesTreeBuilder.cs @@ -8,6 +8,7 @@ using PascalABCCompiler.SemanticTree; using PascalABCCompiler.SyntaxTree; using PascalABCCompiler.TreeConverter; using PascalABCCompiler.TreeRealization; +using PascalABCCompiler.CoreUtils; namespace TreeConverter.LambdaExpressions.Closure { @@ -22,6 +23,7 @@ namespace TreeConverter.LambdaExpressions.Closure private CapturedVariablesTreeNodeClassScope _classScope; private CapturedVariablesTreeNodeProcedureScope _procedureScope; private List _pendingCapturedSymbols = new List(); + private readonly GeneratedNamesManager _generatedNamesManager; public class CapturedVariablesInfo { @@ -57,11 +59,12 @@ namespace TreeConverter.LambdaExpressions.Closure return _currentLambdaScopeNodeStack.Count > 0; } } - public CapturedVariablesTreeBuilder(syntax_tree_visitor visitor) + public CapturedVariablesTreeBuilder(syntax_tree_visitor visitor, GeneratedNamesManager generatedNamesManager) { _visitor = visitor; _scopesCapturedVarsNodesDictionary = new Dictionary(); _identsReferences = new Dictionary>(); + _generatedNamesManager = generatedNamesManager; } public override void visit(semantic_check_sugared_statement_node sn) @@ -454,7 +457,7 @@ namespace TreeConverter.LambdaExpressions.Closure { if (!clScope.NonPublicMembersNamesMapping.ContainsKey(idName)) { - var name = LambdaHelper.GetNameForNonPublicMember(idName); + var name = LambdaHelper.GetNameForNonPublicMember(idName, _generatedNamesManager); var semClassField = (class_field) si.sym_info; var pn = new common_property_node(name, _visitor.context._ctn, null, field_access_level.fal_public, semClassField.polymorphic_state); pn.internal_property_type = _visitor.convert_strong(id).type; diff --git a/TreeConverter/TreeConversion/InitializationDataForConverting.cs b/TreeConverter/TreeConversion/InitializationDataForConverting.cs index e1690d5e6..68e0a83f4 100644 --- a/TreeConverter/TreeConversion/InitializationDataForConverting.cs +++ b/TreeConverter/TreeConversion/InitializationDataForConverting.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections; using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.CoreUtils; namespace PascalABCCompiler.TreeConverter.TreeConversion { @@ -31,6 +32,8 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion public readonly bool forIntellisense; + public readonly GeneratedNamesManager generatedNamesManager; + public InitializationDataForCompilingInterface( Errors.SyntaxError parserError, @@ -43,7 +46,8 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion Dictionary docs, bool debug, bool debugging, - bool forIntellisense + bool forIntellisense, + GeneratedNamesManager generatedNamesManager ) { @@ -58,6 +62,7 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion this.debug = debug; this.debugging = debugging; this.forIntellisense = forIntellisense; + this.generatedNamesManager = generatedNamesManager; } } @@ -81,12 +86,13 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion TreeRealization.common_unit_node semanticUnit, List errorsList, List warningsList, - Dictionary docs, + Dictionary docs, bool debug, bool debugging, - bool forIntellisense + bool forIntellisense, + GeneratedNamesManager generatedNamesManager - ) : base(parserError, badNodes, usedUnits, interfaceNamespaces, syntaxUnit, errorsList, warningsList, docs, debug, debugging, forIntellisense) + ) : base(parserError, badNodes, usedUnits, interfaceNamespaces, syntaxUnit, errorsList, warningsList, docs, debug, debugging, forIntellisense, generatedNamesManager) { this.implementationNamespaces = implementationNamespaces; this.semanticUnit = semanticUnit; diff --git a/TreeConverter/TreeConversion/LambdaHelper.cs b/TreeConverter/TreeConversion/LambdaHelper.cs index d53b03034..7f8c5fc09 100644 --- a/TreeConverter/TreeConversion/LambdaHelper.cs +++ b/TreeConverter/TreeConversion/LambdaHelper.cs @@ -7,6 +7,7 @@ using PascalABCCompiler.TreeRealization; using PascalABCCompiler.SyntaxTree; using TreeConverter.LambdaExpressions; using static PascalABCCompiler.StringConstants; +using PascalABCCompiler.CoreUtils; namespace PascalABCCompiler.TreeConverter { @@ -49,27 +50,23 @@ namespace PascalABCCompiler.TreeConverter public class LambdaHelper { - public static string lambdaPrefix = "<>lambda"; private const string nonPublicMembersNamePrefix = "<>nonPublic"; private const string auxiliaryLambdaSuffix = "_$$$auxiliaryFuncName"; private const string auxVarNamePrefix = "$$$auxVar$$$<>"; - private static int auxCounter = 0; - private static int nonPublicMembersNameCounter = 0; - private static int auxVarCounter = 0; - public static string GetAuxVarName() + public static string GetAuxVarName(GeneratedNamesManager generatedNamesManager) { - return auxVarNamePrefix + auxVarCounter++; + return generatedNamesManager.GenerateName(auxVarNamePrefix); } - public static string GetAuxiliaryLambdaName(string lambdaName) + public static string GetAuxiliaryLambdaName(string lambdaName, GeneratedNamesManager generatedNamesManager) { - return lambdaName + auxiliaryLambdaSuffix + auxCounter++; + return generatedNamesManager.GenerateName(lambdaName + auxiliaryLambdaSuffix); } - public static string GetNameForNonPublicMember(string memberName) + public static string GetNameForNonPublicMember(string memberName, GeneratedNamesManager generatedNamesManager) { - return nonPublicMembersNamePrefix + memberName + nonPublicMembersNameCounter++; + return generatedNamesManager.GenerateName(nonPublicMembersNamePrefix + memberName); } public static string GetLambdaNamePartWithoutGenerics(string name) @@ -181,9 +178,9 @@ namespace PascalABCCompiler.TreeConverter captureCheck = false; processingLambdaParametersForTypeInference = 0; StatementListStackStack.Clear(); - auxCounter = 0; - nonPublicMembersNameCounter = 0; - auxVarCounter = 0; + // auxCounter = 0; + // nonPublicMembersNameCounter = 0; + // auxVarCounter = 0; } public static bool captureCheck = false; public static List capturedVariables = new List(); diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index e4807af9b..1d3389e29 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -6,6 +6,7 @@ using System.Linq; using PascalABCCompiler.TreeRealization; using System.Collections.Generic; using System.Collections; +using PascalABCCompiler.CoreUtils; namespace PascalABCCompiler.TreeConverter { @@ -239,7 +240,6 @@ namespace PascalABCCompiler.TreeConverter } } - private int _num_for_delegates; private int _num_of_for_cycles; internal convertion_data_and_alghoritms convertion_data_and_alghoritms; @@ -306,8 +306,6 @@ namespace PascalABCCompiler.TreeConverter _cycles_stack.clear(); _num_of_for_cycles = 0; _fal = SemanticTree.field_access_level.fal_private; - _num_for_delegates = 0; - rec_num = 1; var_defs_stack.Clear(); type_stack.Clear(); clear_special_local_vars(); @@ -1602,12 +1600,11 @@ namespace PascalABCCompiler.TreeConverter } /****************************modified***********************/ - private int rec_num=0; - public common_type_node create_record_type(location def_loc, string name) + public common_type_node create_record_type(location def_loc, string name, GeneratedNamesManager generatedNamesManager) { if (name == null) - name = "$record$" + rec_num++; + name = generatedNamesManager.GenerateName("$record$"); SymbolTable.ClassScope scope = convertion_data_and_alghoritms.symbol_table.CreateClassScope(_cmn.scope, null, "record " + name); common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn, scope, def_loc); @@ -1644,11 +1641,11 @@ namespace PascalABCCompiler.TreeConverter var_defs = var_defs_stack.Pop(); } - public string BuildName(string name) + public string BuildName(string name, GeneratedNamesManager generatedNamesManager) { if (converting_block() == block_type.function_block) { - return name + "$" + rec_num++; + return generatedNamesManager.GenerateName(name + "$"); } else { @@ -1949,7 +1946,7 @@ namespace PascalABCCompiler.TreeConverter public string get_delegate_type_name() { - return (StringConstants.delegate_type_name_template + _num_for_delegates++); + return syntax_tree_visitor.GeneratedNamesManager.GenerateName(StringConstants.delegate_type_name_template); } public var_definition_node create_for_temp_variable(type_node type,location loc) @@ -2075,10 +2072,10 @@ namespace PascalABCCompiler.TreeConverter SystemLibrary.SystemLibrary.make_generated_type_conversion(SystemLibrary.SystemLibrary.uint64_type,tctn,type_compare.greater_type,PascalABCCompiler.SemanticTree.basic_function_type.ultoi,false); } - public common_type_node create_enum_type(string name, location def_loc) + public common_type_node create_enum_type(string name, location def_loc, GeneratedNamesManager generatedNamesManager) { if (name == null) - name = "$enum$" + rec_num++; + name = generatedNamesManager.GenerateName("$enum$"); SymbolTable.ClassScope scope = convertion_data_and_alghoritms.symbol_table.CreateClassScope(_cmn.scope, null, "enum_type " + name); common_type_node tctn = new common_type_node(name, SemanticTree.type_access_level.tal_public, _cmn, scope, def_loc); diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 8414e9d14..b136246bd 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -63,7 +63,6 @@ namespace PascalABCCompiler.TreeConverter symtab.Clear(); _type_constructor.reset(); statement_list_stack.clear(); - arr_nums = 0; //_current_operation_kind = special_operation_kind.none; } @@ -726,7 +725,7 @@ namespace PascalABCCompiler.TreeConverter public expression_node explicit_convert_type(expression_node from, type_node to) { - if (from is base_function_call bfc && bfc.function.name.StartsWith(LambdaHelper.lambdaPrefix)) + if (from is base_function_call bfc && bfc.function.name.StartsWith(StringConstants.lambdaPrefix)) { AddError(from.location, "EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN"); } @@ -805,11 +804,9 @@ namespace PascalABCCompiler.TreeConverter } - private int arr_nums = 0; private string get_temp_arr_name() { - arr_nums++; - return ("$intarr"+arr_nums); + return syntax_tree_visitor.GeneratedNamesManager.GenerateName("$intarr"); } //проверки на константные параметры @@ -1243,7 +1240,7 @@ namespace PascalABCCompiler.TreeConverter SyntaxTree.expression ex = new SyntaxTree.new_expr(rettype,el); sl.Add(new SyntaxTree.assign(StringConstants.result_var_name, ex)); // Определим функцию преобразования на внешнем уровне - var fun = BuildSimpleFunctionOneParameter("_conv" + UniqueString(), "x", + var fun = BuildSimpleFunctionOneParameter(syntax_tree_visitor.GeneratedNamesManager.GenerateName("_conv"), "x", new SyntaxTree.semantic_type_node(factparams[i].type), rettype, sl diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index fc4ea2749..6cf14b570 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -28,6 +28,7 @@ using TreeConverter.LambdaExpressions; using PascalABCCompiler.TreeConverter.TreeConversion; using System.Reflection; using PascalABCCompiler.SemanticTree; +using PascalABCCompiler.CoreUtils; namespace PascalABCCompiler.TreeConverter { @@ -108,7 +109,9 @@ namespace PascalABCCompiler.TreeConverter public ParallelPosition CurrentParallelPosition = ParallelPosition.Outside; #endregion - private int num = 0; + private GeneratedNamesManager generatedNamesManager; + + public GeneratedNamesManager GeneratedNamesManager => generatedNamesManager; public void InitializeForCompilingInterface(InitializationDataForCompilingInterface initializationData) { @@ -169,6 +172,9 @@ namespace PascalABCCompiler.TreeConverter convertion_data_and_alghoritms.syntax_tree_visitor = this; ret.syntax_tree_visitor = this; context.syntax_tree_visitor = this; + + // Счетчики для сгенерированных переменных + generatedNamesManager = initializationData.generatedNamesManager; } /// @@ -183,12 +189,6 @@ namespace PascalABCCompiler.TreeConverter public List CompiledVariables => compiledVariables; - public string UniqueNumStr() - { - num++; - return num.ToString(); - } - internal Errors.Error LastError() { Errors.Error err = ErrorsList[ErrorsList.Count-1]; @@ -274,7 +274,6 @@ namespace PascalABCCompiler.TreeConverter #region MikhailoMMX, реинициализация класса OpenMP OpenMP.InternalReset(); #endregion - CapturedVariablesSubstitutionClassGenerator.Reset(); ResetSelfFields(); } @@ -2051,7 +2050,7 @@ namespace PascalABCCompiler.TreeConverter type_node filter_type = compiled_type_node.get_type_node(NetHelper.NetHelper.FindType(StringConstants.ExceptionName)); expression_node current_catch_excep = create_constructor_call(filter_type, new expressions_list(), null); local_block_variable_reference lvr = null; - local_block_variable tmp_var = context.add_var_definition(context.BuildName("$try_temp" + UniqueNumStr()), null, SystemLibrary.SystemLibrary.bool_type, null) as local_block_variable; + local_block_variable tmp_var = context.add_var_definition(context.BuildName(generatedNamesManager.GenerateName("$try_temp"), generatedNamesManager), null, SystemLibrary.SystemLibrary.bool_type, null) as local_block_variable; statements_list stm = new statements_list(null); SyntaxTree.try_handler_finally try_hndlr_finally = _try_stmt.handler as SyntaxTree.try_handler_finally; context.enter_code_block_without_bind(); @@ -2970,7 +2969,7 @@ namespace PascalABCCompiler.TreeConverter } lambdaProcessingState = LambdaProcessingState.ClosuresProcessingPhase; - CapturedVariablesSubstitutionsManager.Substitute(this, _block.defs, _block.program_code); + CapturedVariablesSubstitutionsManager.Substitute(this, _block.defs, _block.program_code, generatedNamesManager); lambdaProcessingState = LambdaProcessingState.FinishPhase; @@ -3705,7 +3704,7 @@ namespace PascalABCCompiler.TreeConverter } cnsts.Add(cdn); } - common_type_node ctn = context.create_enum_type(null, get_location(_enum_type_definition)); //_enum_type_definition.values + common_type_node ctn = context.create_enum_type(null, get_location(_enum_type_definition), generatedNamesManager); //_enum_type_definition.values num = 0; foreach (constant_definition_node cdn in cnsts) { @@ -3907,7 +3906,7 @@ namespace PascalABCCompiler.TreeConverter } else { - converted_type = context.create_record_type(get_location(_class_definition), record_type_name); + converted_type = context.create_record_type(get_location(_class_definition), record_type_name, generatedNamesManager); if (record_is_generic) { context.create_generic_indicator(converted_type); @@ -6062,7 +6061,7 @@ namespace PascalABCCompiler.TreeConverter realrestype = restype.real_type; LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this); fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman - fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! + fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! //contextChanger.SaveContextAndUpToNearestDefSect(); try @@ -6552,7 +6551,7 @@ namespace PascalABCCompiler.TreeConverter realrestype = restype.real_type; LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this); fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman - fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! + fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! //contextChanger.SaveContextAndUpToNearestDefSect(); try @@ -6814,7 +6813,7 @@ namespace PascalABCCompiler.TreeConverter realrestype = restype.real_type; LambdaHelper.InferTypesFromVarStmt(fnn.parameters[exprCounter].type, fld, this); fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman - fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! + fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! //contextChanger.SaveContextAndUpToNearestDefSect(); try @@ -7767,7 +7766,7 @@ namespace PascalABCCompiler.TreeConverter AddError(err); } fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman - fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! + fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! //contextChanger.SaveContextAndUpToNearestDefSect(); try @@ -9317,7 +9316,7 @@ namespace PascalABCCompiler.TreeConverter case semantic_node_type.compiled_constructor_call: case semantic_node_type.common_constructor_call: case semantic_node_type.compiled_static_method_call: - return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl); + return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl); case semantic_node_type.class_field_reference: (expr as class_field_reference).obj = create_with_expression((expr as class_field_reference).obj); return expr; @@ -9333,14 +9332,20 @@ namespace PascalABCCompiler.TreeConverter (expr as dereference_node).deref_expr = create_with_expression((expr as dereference_node).deref_expr); return expr; case semantic_node_type.basic_function_call: - return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl); + return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl); case semantic_node_type.as_node: - return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl); + return convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl); } return expr; } - public override void visit(SyntaxTree.with_statement _with_statement) + private string GetTempVariableName() + { + return generatedNamesManager.GenerateName("$TV", "$"); + } + + + public override void visit(SyntaxTree.with_statement _with_statement) { context.WithSection = true; List Withs = new List(); @@ -9374,7 +9379,7 @@ namespace PascalABCCompiler.TreeConverter { location sl = get_location(s_expr); if (expr.type.type_special_kind != SemanticTree.type_special_kind.record) - vr = convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(StringConstants.GetTempVariableName(), sl, expr.type, expr), sl); + vr = convertion_data_and_alghoritms.CreateVariableReference(context.add_var_definition(GetTempVariableName(), sl, expr.type, expr), sl); else expr = create_with_expression(expr); } @@ -12431,7 +12436,7 @@ namespace PascalABCCompiler.TreeConverter } else { - tn.SetName(context.BuildName(name)); + tn.SetName(context.BuildName(name, generatedNamesManager)); } if (_type_declaration.attributes != null) if (_type_declaration.type_def is SyntaxTree.enum_type_definition) @@ -12576,7 +12581,7 @@ namespace PascalABCCompiler.TreeConverter is_direct_type_decl = false; record_type_name = null; record_is_generic = false; - tn.SetName(context.BuildName(name)); + tn.SetName(context.BuildName(name, generatedNamesManager)); return; } @@ -15238,7 +15243,7 @@ namespace PascalABCCompiler.TreeConverter internal_interface ii = ind_types[i].get_internal_interface(internal_interface_kind.ordinal_interface); ordinal_type_interface oti_ind = (ordinal_type_interface)ii; elem_type = convertion_data_and_alghoritms.type_constructor.get_array_type(oti_ind, elem_type, - context.converted_namespace, get_location(_array_type)); + context.converted_namespace, get_location(_array_type), generatedNamesManager); } return_value(elem_type); } @@ -17423,7 +17428,7 @@ namespace PascalABCCompiler.TreeConverter } //LambdaHelper.InferTypesFromVarStmt(tn, _var_def_statement.inital_value as SyntaxTree.function_lambda_definition, this); //lroman// - if (tn.IsStatic && _var_def_statement.vars.idents[0].name != YieldHelpers.YieldConsts.Self) // SSM 10/07/19 fix #1639 в статическом классе можно только фиктивное поле с именем YieldHelpers.YieldConsts.Self описать - для того чтобы посмотреть на семантике его тип!!! + if (tn.IsStatic && _var_def_statement.vars.idents[0].name != yieldSelf) // SSM 10/07/19 fix #1639 в статическом классе можно только фиктивное поле с именем StringConstants.yieldSelf описать - для того чтобы посмотреть на семантике его тип!!! AddError(get_location(_var_def_statement), "VARIABLES_OF_STATIC_CLASS_NOT_ALLOWED"); var fld1 = _var_def_statement.inital_value as SyntaxTree.function_lambda_definition; if (fld1 != null) @@ -19207,11 +19212,9 @@ namespace PascalABCCompiler.TreeConverter } } - private int GenIdNum = 0; public ident GenIdentName() { - GenIdNum++; - return new ident("$GenId" + GenIdNum.ToString()); + return new ident(generatedNamesManager.GenerateName("$GenId")); } public override void visit(SyntaxTree.addressed_value_funcname _addressed_value_funcname) @@ -19741,7 +19744,7 @@ namespace PascalABCCompiler.TreeConverter { if (cl_def.keyword == SyntaxTree.class_keyword.Record) { - ctn = context.create_record_type(get_location(tc.type_dec.type_name), inst_name); + ctn = context.create_record_type(get_location(tc.type_dec.type_name), inst_name, generatedNamesManager); } else { @@ -19999,7 +20002,7 @@ namespace PascalABCCompiler.TreeConverter LambdaHelper.InferTypesFromVarStmt(fn.parameters[exprCounter].type, fld, this); fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman - fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); + fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName, generatedNamesManager); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ! //contextChanger.SaveContextAndUpToNearestDefSect(); @@ -21938,7 +21941,7 @@ namespace PascalABCCompiler.TreeConverter private bool CheckUnknownIdentNeedsClassCapture(SyntaxTree.yield_unknown_ident _unk, out bool isStaticIdent) { - string Consts__Self = YieldHelpers.YieldConsts.Self; + string Consts__Self = yieldSelf; // Find semantic class containing iterator (yield-method) with unknown ident var iteratorContainingClass = context._ctn.fields.Where(f => f.name == Consts__Self).FirstOrDefault()?.type; @@ -22004,9 +22007,8 @@ namespace PascalABCCompiler.TreeConverter { return new dot_node(unk.ClassName, unk.UnknownID); } - string Consts__Self = YieldHelpers.YieldConsts.Self; - return new dot_node(new dot_node(new ident("self"), new ident(Consts__Self)), unk.UnknownID); + return new dot_node(new dot_node(new ident("self"), new ident(yieldSelf)), unk.UnknownID); } private SyntaxTree.addressed_value_funcname ProcessUnknownIdent(yield_unknown_ident unk) diff --git a/TreeConverter/TreeConversion/type_constructor.cs b/TreeConverter/TreeConversion/type_constructor.cs index 38d93bcf1..d5ee4e586 100644 --- a/TreeConverter/TreeConversion/type_constructor.cs +++ b/TreeConverter/TreeConversion/type_constructor.cs @@ -5,9 +5,10 @@ //В этом файле присутсвует существенное дублирование кода(~500строк). //TODO Разобраться и избавиться от дублирования -using System; +using PascalABCCompiler.CoreUtils; using PascalABCCompiler.TreeRealization; + using System.Collections.Generic; using System.Linq; @@ -15,7 +16,6 @@ namespace PascalABCCompiler.TreeConverter { public class type_constructor { - private int pascal_arrays_num = 0; convertion_data_and_alghoritms convertion_data_and_alghoritms; @@ -403,13 +403,12 @@ namespace PascalABCCompiler.TreeConverter cmn_sub_assign.parameters.AddElement(cp42); } - private string get_pascal_array_name() + private string get_pascal_array_name(GeneratedNamesManager generatedNamesManager) { - pascal_arrays_num++; - return (StringConstants.pascal_array_name + pascal_arrays_num.ToString()); + return generatedNamesManager.GenerateName(StringConstants.pascal_array_name); } - private type_node create_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn, location loc) + private type_node create_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn, location loc, GeneratedNamesManager generatedNamesManager) { int arr_length = oti_indexer.ordinal_type_to_int(oti_indexer.upper_value) - oti_indexer.ordinal_type_to_int(oti_indexer.lower_value) + 1; @@ -428,7 +427,7 @@ namespace PascalABCCompiler.TreeConverter { top_scope = _cmn.scope; } - string name = get_pascal_array_name(); + string name = get_pascal_array_name(generatedNamesManager); //if (_cmn.namespace_name != null) // name = _cmn.namespace_name + name; common_type_node ctn = new common_type_node(null, name, SemanticTree.type_access_level.tal_public, @@ -1828,7 +1827,7 @@ namespace PascalABCCompiler.TreeConverter private System.Collections.Generic.Dictionary> pascal_arrays = new System.Collections.Generic.Dictionary>(); - public type_node get_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn,location loc) + public type_node get_array_type(ordinal_type_interface oti_indexer, type_node element_type,common_namespace_node _cmn,location loc, GeneratedNamesManager generatedNamesManager) { /* System.Collections.Generic.Dictionary ht; @@ -1849,7 +1848,7 @@ namespace PascalABCCompiler.TreeConverter } return tn; */ - type_node ret = create_array_type(oti_indexer, element_type, _cmn, loc); + type_node ret = create_array_type(oti_indexer, element_type, _cmn, loc, generatedNamesManager); return ret; } @@ -2036,7 +2035,6 @@ namespace PascalABCCompiler.TreeConverter public void reset() { - pascal_arrays_num = 0; //TODO: Что лучше Clear или создать новую? pascal_arrays.Clear(); pascal_diap.Clear(); diff --git a/TreeConverter/TreeConverter.csproj b/TreeConverter/TreeConverter.csproj index 8151139b3..461858cfc 100644 --- a/TreeConverter/TreeConverter.csproj +++ b/TreeConverter/TreeConverter.csproj @@ -22,6 +22,6 @@ - + \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 3abb3eea9..17d6193e4 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -768,7 +768,7 @@ namespace PascalABCCompiler.TreeRealization var lambdaName = lambda_syntax_node.lambda_name; var fl = lambda_syntax_node.lambda_visit_mode; lambda_syntax_node.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; - var aux_name = LambdaHelper.GetAuxiliaryLambdaName(lambda_syntax_node.lambda_name); + var aux_name = LambdaHelper.GetAuxiliaryLambdaName(lambda_syntax_node.lambda_name, visitor.GeneratedNamesManager); lambda_syntax_node.lambda_name = aux_name; try diff --git a/Yield/YieldHelpers/Properties/AssemblyInfo.cs b/Yield/YieldHelpers/Properties/AssemblyInfo.cs deleted file mode 100644 index c7bdf8aae..000000000 --- a/Yield/YieldHelpers/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("YieldHelpers")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Hewlett-Packard")] -[assembly: AssemblyProduct("YieldHelpers")] -[assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1befc5f9-6102-4f55-b677-5457ebcd6327")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Yield/YieldHelpers/YieldConsts.cs b/Yield/YieldHelpers/YieldConsts.cs deleted file mode 100644 index 4ada83057..000000000 --- a/Yield/YieldHelpers/YieldConsts.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PascalABCCompiler.YieldHelpers -{ - public static class YieldConsts - { - public static string Current = "<>2__current"; - public static string State = "<>1__state"; - public static string LabelStatePrefix = "lbstate#"; - - public static string Self = "<>4__self"; - - public static string YieldHelperMethodPrefix = "