Исправление ошибок при перекомпиляции pcu файлов (#3398)
* Move yield string constants to StringConstants class * Add GeneratedNamesManager class to store all generated names during unit compilation * Make GeneratedNamesManager class non static * Add Utils project to installer files * Add GeneratedNamesManager usage in CapturedVariablesSubstitutionsManager * Move GeneratedNamesManager initialization in CompilationUnit constructor * More GeneratedNamesManager usage * QuestionPointDesugarVisitor fix
This commit is contained in:
parent
b5dd8c1c77
commit
1f4b44c2c0
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -65,7 +65,7 @@
|
|||
**/TestPlugin.dll
|
||||
**/TreeConverter.dll
|
||||
**/VBNETParser.dll
|
||||
**/YieldHelpers.dll
|
||||
**/Utils.dll
|
||||
**/pabcnetc.exe
|
||||
**/pabcnetc.exe.config
|
||||
**/pabcnetcclear.exe
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
// public int max_errors = 10;
|
||||
public SPythonParserTools parserTools;
|
||||
public List<compiler_directive> CompilerDirectives;
|
||||
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
|
||||
public bool is_unit_to_be_parsed = false;
|
||||
|
||||
public SPythonGPPGParser(AbstractScanner<ValueType, LexLocation> scanner, SPythonParserTools parserTools,
|
||||
|
|
|
|||
|
|
@ -407,28 +407,4 @@ namespace SPythonParser
|
|||
return naie;
|
||||
}
|
||||
}
|
||||
|
||||
// temp
|
||||
public class ParserLambdaHelper
|
||||
{
|
||||
private int lambda_num = 0;
|
||||
public List<function_lambda_definition> lambdaDefinitions;
|
||||
public static string lambdaPrefix = "<>lambda";
|
||||
|
||||
public ParserLambdaHelper()
|
||||
{
|
||||
lambdaDefinitions = new List<function_lambda_definition>();
|
||||
}
|
||||
|
||||
public string CreateLambdaName()
|
||||
{
|
||||
lambda_num++;
|
||||
return lambdaPrefix + lambda_num.ToString();
|
||||
}
|
||||
|
||||
public bool IsLambdaName(ident id)
|
||||
{
|
||||
return id.name.StartsWith(lambdaPrefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 <SPythonParser.y>
|
||||
|
||||
|
|
@ -67,7 +67,6 @@ public partial class SPythonGPPGParser: ShiftReduceParser<ValueType, LexLocation
|
|||
// public int max_errors = 10;
|
||||
public SPythonParserTools parserTools;
|
||||
public List<compiler_directive> CompilerDirectives;
|
||||
public ParserLambdaHelper lambdaHelper = new ParserLambdaHelper();
|
||||
public bool is_unit_to_be_parsed = false;
|
||||
|
||||
public SPythonGPPGParser(AbstractScanner<ValueType, LexLocation> scanner, SPythonParserTools parserTools,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 string CreateLambdaName()
|
||||
{
|
||||
private int lambda_num = 0;
|
||||
public List<function_lambda_definition> lambdaDefinitions;
|
||||
public static string lambdaPrefix = "<>lambda";
|
||||
|
||||
public ParserLambdaHelper()
|
||||
{
|
||||
lambdaDefinitions = new List<function_lambda_definition>();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,9 +11,11 @@
|
|||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\..\CoreUtils\Utils.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\Errors\Errors.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\LanguageIntegrator\LanguageIntegrator.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\Localization\Localization.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\StringConstants\StringConstants.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\SyntaxTree\SyntaxTree.csproj" />
|
||||
<ProjectReference Include="..\..\..\..\SyntaxVisitors\SyntaxVisitors.csproj" />
|
||||
</ItemGroup>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -243,6 +243,11 @@ namespace PascalABCCompiler
|
|||
/// </summary>
|
||||
public Dictionary<string, Dictionary<string, bool>> NamesFromUsedUnits { get; } = new Dictionary<string, Dictionary<string, bool>>();
|
||||
|
||||
/// <summary>
|
||||
/// Объект, хранящий счетчики сгенерированных имен для текущего модуля (используется на семантике)
|
||||
/// </summary>
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,5 @@
|
|||
<ProjectReference Include="..\Localization\Localization.csproj" />
|
||||
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
|
||||
<ProjectReference Include="..\SemanticTree\SemanticTree.csproj" />
|
||||
<ProjectReference Include="..\ParserTools\ParserTools.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
22
CoreUtils/GeneratedNamesManager.cs
Normal file
22
CoreUtils/GeneratedNamesManager.cs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace PascalABCCompiler.CoreUtils
|
||||
{
|
||||
/// <summary>
|
||||
/// Хранилище для сгенерированных компилятором переменных
|
||||
/// </summary>
|
||||
public class GeneratedNamesManager
|
||||
{
|
||||
private readonly Dictionary<string, int> counters = new Dictionary<string, int>();
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает уникальное имя для переданного префикса (используется автоинкремент)
|
||||
/// </summary>
|
||||
public string GenerateName(string prefix, string suffix = "")
|
||||
{
|
||||
counters.TryGetValue(prefix, out int current);
|
||||
counters[prefix] = current + 1;
|
||||
return $"{prefix}{current}{suffix}";
|
||||
}
|
||||
}
|
||||
}
|
||||
7
CoreUtils/Properties/AssemblyInfo.cs
Normal file
7
CoreUtils/Properties/AssemblyInfo.cs
Normal file
|
|
@ -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("")]
|
||||
|
|
@ -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<function_lambda_definition> lambdaDefinitions;
|
||||
public static string lambdaPrefix = "<>lambda";
|
||||
|
||||
public ParserLambdaHelper()
|
||||
{
|
||||
lambdaDefinitions = new List<function_lambda_definition>();
|
||||
}
|
||||
private readonly GeneratedNamesManager generatedNamesManager = new GeneratedNamesManager();
|
||||
public List<function_lambda_definition> lambdaDefinitions = new List<function_lambda_definition>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\CoreUtils\Utils.csproj" />
|
||||
<ProjectReference Include="..\..\Errors\Errors.csproj" />
|
||||
<ProjectReference Include="..\..\LanguageIntegrator\LanguageIntegrator.csproj" />
|
||||
<ProjectReference Include="..\..\Localization\Localization.csproj" />
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -11,12 +11,6 @@ namespace PascalABCCompiler
|
|||
{
|
||||
public static Dictionary<string, string> oper_names = new Dictionary<string, string>();
|
||||
|
||||
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 = "<yield_helper";
|
||||
|
||||
#endregion
|
||||
|
||||
public const string lambdaPrefix = "<>lambda";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -372,16 +372,10 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
public static SourceContext BuildGenSC = new SourceContext(0, 777777, 0, 0, 0, 0);
|
||||
|
||||
private static int GenIdNum = 0;
|
||||
public static string UniqueString()
|
||||
{
|
||||
GenIdNum++;
|
||||
return GenIdNum.ToString();
|
||||
}
|
||||
public static ident GenIdentName()
|
||||
{
|
||||
return new ident("$GenId" + UniqueString());
|
||||
}
|
||||
//public static ident GenIdentName()
|
||||
//{
|
||||
// return new ident("$GenId" + UniqueString());
|
||||
//}
|
||||
|
||||
public static type_definition BuildSimpleType(string name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1037,23 +1037,10 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
|
||||
public partial class goto_statement
|
||||
{
|
||||
static int lbnum = 0;
|
||||
|
||||
static public string newLabelName()
|
||||
{
|
||||
lbnum++;
|
||||
return "lb#" + lbnum.ToString();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "goto " + label;
|
||||
}
|
||||
|
||||
public static goto_statement New
|
||||
{
|
||||
get { return new goto_statement(newLabelName()); }
|
||||
}
|
||||
}
|
||||
|
||||
public partial class dot_node
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ namespace Languages.Pascal.Frontend.Converters
|
|||
|
||||
protected override syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense)
|
||||
{
|
||||
var generatedNamesManager = new PascalABCCompiler.CoreUtils.GeneratedNamesManager();
|
||||
|
||||
ExitParamVisitor.New.ProcessNode(root);
|
||||
|
||||
var binder = new BindCollectLightSymInfo(root as compilation_unit);
|
||||
|
|
@ -29,24 +31,24 @@ namespace Languages.Pascal.Frontend.Converters
|
|||
NewRangeDesugarAndFindHasYieldVisitor.New.ProcessNode(root);
|
||||
|
||||
// Распаковка параметров в лямбдах
|
||||
UnpackLambdaParametersVisitor.New.ProcessNode(root);
|
||||
UnpackLambdaParametersVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// Unnamed Records перенёс сюда
|
||||
UnnamedRecordsCheckVisitor.New.ProcessNode(root);
|
||||
|
||||
// Выносим выражения с лямбдами из заголовка foreach + считаем максимум 10 вложенных лямбд
|
||||
StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.New.ProcessNode(root);
|
||||
StandOutExprWithLambdaInForeachSequenceAndNestedLambdasVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
new VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer(root as compilation_unit).ProcessNode(root);
|
||||
FindOnExceptVarsAndApplyRenameVisitor.New.ProcessNode(root);
|
||||
FindOnExceptVarsAndApplyRenameVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// loop
|
||||
LoopDesugarVisitor.New.ProcessNode(root);
|
||||
LoopDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
#if DEBUG
|
||||
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
|
||||
#endif
|
||||
bool optimize_tuple_assign = true;
|
||||
// tuple_node
|
||||
TupleVisitor.Create(optimize_tuple_assign).ProcessNode(root);
|
||||
TupleVisitor.Create(optimize_tuple_assign, generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// index
|
||||
IndexVisitor.New.ProcessNode(root);
|
||||
|
|
@ -58,34 +60,34 @@ namespace Languages.Pascal.Frontend.Converters
|
|||
// теперь коллизия с (a[1:6], a[6:11]):= (a[6:11], a[1:6]);
|
||||
// assign_tuple и assign_var_tuple
|
||||
if (!optimize_tuple_assign)
|
||||
AssignTuplesDesugarVisitor.New.ProcessNode(root); // теперь это - на семантике
|
||||
AssignTuplesDesugarVisitor.Create(generatedNamesManager).ProcessNode(root); // теперь это - на семантике
|
||||
else
|
||||
NewAssignTuplesDesugarVisitor.Create(binder).ProcessNode(root);
|
||||
NewAssignTuplesDesugarVisitor.Create(binder, generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// question_point_desugar_visitor
|
||||
QuestionPointDesugarVisitor.New.ProcessNode(root);
|
||||
QuestionPointDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// double_question_desugar_visitor
|
||||
DoubleQuestionDesugarVisitor.New.ProcessNode(root);
|
||||
// Закомментировал, потому что cейчас он ничего не делает EVA 08.03.2026
|
||||
// DoubleQuestionDesugarVisitor.New.ProcessNode(root);
|
||||
|
||||
// Patterns
|
||||
// SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить
|
||||
ExtendedIsDesugaringVisitor.New.ProcessNode(root); // Десахаризация расширенного is, который используется в сложных логических выражениях
|
||||
PatternsDesugaringVisitor.New.ProcessNode(root); // Обязательно в этом порядке.
|
||||
PatternsDesugaringVisitor.Create(generatedNamesManager).ProcessNode(root); // Обязательно в этом порядке.
|
||||
#if DEBUG
|
||||
//new SimplePrettyPrinterVisitor("D:/out.txt").ProcessNode(root);
|
||||
// TestAssignIsDefVisitor.New.ProcessNode(root);
|
||||
#endif
|
||||
|
||||
// simple_property
|
||||
PropertyDesugarVisitor.New.ProcessNode(root);
|
||||
PropertyDesugarVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
// Всё, связанное с yield
|
||||
CapturedNamesHelper.Reset();
|
||||
MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
|
||||
ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);
|
||||
ProcessYieldCapturedVarsVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
CacheFunctionVisitor.New.ProcessNode(root);
|
||||
CacheFunctionVisitor.Create(generatedNamesManager).ProcessNode(root);
|
||||
|
||||
ToExprVisitor.New.ProcessNode(root);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@
|
|||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using PascalABCCompiler.SyntaxTree;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace PascalABCCompiler.SyntaxTreeConverters
|
||||
{
|
||||
|
|
@ -24,7 +22,12 @@ namespace PascalABCCompiler.SyntaxTreeConverters
|
|||
|
||||
protected abstract syntax_tree_node ApplyConversions(syntax_tree_node root, bool forIntellisense);
|
||||
|
||||
public virtual syntax_tree_node ConvertAfterUsedModulesCompilation(syntax_tree_node root, bool forIntellisense, in CompilationArtifactsUsedBySyntaxConverters compilationArtifacts) => 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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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<if_node> processedIfNodes = new List<if_node>();
|
||||
|
|
@ -108,7 +102,14 @@ namespace SyntaxVisitors.PatternsVisitors
|
|||
//const matching
|
||||
private List<statement> typeChecks = new List<statement>();
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<statement>();
|
||||
sl.Add(new semantic_check_sugared_statement_node(typeof(assign_tuple), new List<syntax_tree_node> { 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<declaration>();
|
||||
|
|
@ -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<var_def_statement>();
|
||||
//vd.Add(new semantic_check_sugared_var_def_statement_node(typeof(assign_var_tuple), new List<syntax_tree_node> { 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);
|
||||
|
|
|
|||
|
|
@ -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.generatedNamesManager = generatedNamesManager;
|
||||
}
|
||||
|
||||
List<statement> 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<statement>();
|
||||
foreach (var a in order)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<Assign> getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder)
|
||||
public static List<Assign> getAssignOrder(tuple_node tn, addressed_value_list vars, BindCollectLightSymInfo binder, GeneratedNamesManager generatedNamesManager)
|
||||
{
|
||||
var left = new List<Symbol>();
|
||||
var right = new List<Symbol>();
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<Edge> GetAssignOrder()
|
||||
internal List<Edge> GetAssignOrder(GeneratedNamesManager generatedNamesManager)
|
||||
{
|
||||
List<Edge> assignOrder = new List<Edge>();
|
||||
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));
|
||||
|
|
|
|||
|
|
@ -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<Symbol> left, List<Symbol> right)
|
||||
public static AssignGraph createAssignGraph(List<Symbol> left, List<Symbol> 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<Edge> make2n(List<Symbol> left, List<Symbol> right)
|
||||
private static List<Edge> make2n(List<Symbol> left, List<Symbol> right, GeneratedNamesManager generatedNamesManager)
|
||||
{
|
||||
var temps = new List<SymbolNode>();
|
||||
var res = new List<Edge>();
|
||||
|
||||
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));
|
||||
|
|
|
|||
|
|
@ -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 => "<tup_opt>" + counter++;
|
||||
public TempSymbol() : base(new ident(getTempPrefix), null)
|
||||
public TempSymbol(GeneratedNamesManager generatedNamesManager)
|
||||
: base(new ident(generatedNamesManager.GenerateName("<tup_opt>")), null)
|
||||
{
|
||||
type = Type.LOCAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<statement>();
|
||||
|
|
|
|||
|
|
@ -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<syntax_tree_node> { 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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<statement> res, ident prevname, SourceContext sc)
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
<ProjectReference Include="..\Errors\Errors.csproj" />
|
||||
<ProjectReference Include="..\Localization\Localization.csproj" />
|
||||
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
|
||||
<ProjectReference Include="..\Yield\YieldHelpers\YieldHelpers.csproj" />
|
||||
<ProjectReference Include="..\CoreUtils\Utils.csproj" />
|
||||
<ProjectReference Include="..\ParserTools\ParserTools.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -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*/);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<string> localsNames, IDictionary<string, string> capturedLocalsNamesMap)
|
||||
private void CreateCapturedLocalsNamesMap(ISet<string> localsNames, IDictionary<string, string> 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("<yield_helper_locals_type_detector>" + 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("<yield_helper_locals_type_detector>" + pd.proc_header.className.meth_name.className);
|
||||
|
||||
|
|
@ -781,10 +768,12 @@ namespace SyntaxVisitors
|
|||
/// <param className="deletedLocals">Коллекция удаленных локальных переменных</param>
|
||||
/// <param className="capturedLocalsNamesMap">Построенное отображение имен локальных переменных в захваченные имена</param>
|
||||
/// <param className="capturedFormalParamsNamesMap">Построенное отображение имен формальных параметров в захваченные имена</param>
|
||||
/// <param className="generatedNamesManager">Хранилище счетчиков сгенерированных переменных</param>
|
||||
private void ReplaceCapturedVariables(procedure_definition pd,
|
||||
IEnumerable<var_def_statement> deletedLocals,
|
||||
out IDictionary<string, string> capturedLocalsNamesMap,
|
||||
out IDictionary<string, string> capturedFormalParamsNamesMap)
|
||||
out IDictionary<string, string> capturedFormalParamsNamesMap,
|
||||
GeneratedNamesManager generatedNamesManager)
|
||||
{
|
||||
// Структуры данных под классификацию имен в методе
|
||||
|
||||
|
|
@ -824,7 +813,7 @@ namespace SyntaxVisitors
|
|||
// Строим отображения для имён захваченных локальных переменных и формальных параметров
|
||||
|
||||
// Create maps :: idName -> captureName
|
||||
CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap);
|
||||
CreateCapturedLocalsNamesMap(CollectedLocalsNames, capturedLocalsNamesMap, generatedNamesManager);
|
||||
CreateCapturedFormalParamsNamesMap(CollectedFormalParamsNames, capturedFormalParamsNamesMap);
|
||||
|
||||
// Выполняем замену захват имён в теле метода
|
||||
|
|
@ -981,15 +970,14 @@ namespace SyntaxVisitors
|
|||
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<string, string> CapturedLocalsNamesMap;
|
||||
IDictionary<string, string> 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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<CapturedVariablesTreeNodeLambdaScope> _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<SubstitutionKey, dot_node> _substitutions;
|
||||
private readonly List<LambdaReferencesSubstitutionInfo> _lambdaIdReferences = new List<LambdaReferencesSubstitutionInfo>();
|
||||
private readonly List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo> _rewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo = new List<RewriteReferencesForNodesThatAreChildNodesToThoseThatContainCapturedVariableInfo>();
|
||||
public static void Reset()
|
||||
{
|
||||
_generatedClassCounter = 0;
|
||||
_generatedUpperClassCounter = 0;
|
||||
}
|
||||
|
||||
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<CapturedVariablesTreeNodeLambdaScope> 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<CapturedVariablesTreeNodeLambdaScope>();
|
||||
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<int, ScopeClassDefinition>();
|
||||
_substitutions = new Dictionary<SubstitutionKey, dot_node>();
|
||||
_lambdasToBeAddedAsMethods = new List<CapturedVariablesTreeNodeLambdaScope>();
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<CapturedVariablesTreeNodeLambdaScope> _lambdasToBeAddedAsMethods;
|
||||
private readonly Dictionary<string, Tuple<string, class_field, semantic_node>> _mappingForNonPublicFieldsOfClass;
|
||||
|
||||
private readonly GeneratedNamesManager _generatedNamesManager;
|
||||
|
||||
public CapturedVariablesSubstitutor(Dictionary<SubstitutionKey, List<ident>> identsReferences,
|
||||
Dictionary<int, CapturedVariablesSubstitutionClassGenerator.ScopeClassDefinition> generatedScopeClassesInfo,
|
||||
List<CapturedVariablesTreeNodeLambdaScope> lambdasToBeAddedAsMethods,
|
||||
Dictionary<SubstitutionKey, dot_node> substitutionsInfo,
|
||||
Dictionary<int, CapturedVariablesTreeNode> capturedVarsTreeNodesDictionary,
|
||||
Dictionary<string, Tuple<string, class_field, semantic_node>> 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
|
||||
|
|
|
|||
|
|
@ -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<CapturedVariablesTreeNode.CapturedSymbolInfo> _pendingCapturedSymbols = new List<CapturedVariablesTreeNode.CapturedSymbolInfo>();
|
||||
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<int, CapturedVariablesTreeNode>();
|
||||
_identsReferences = new Dictionary<SubstitutionKey, List<ident>>();
|
||||
_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;
|
||||
|
|
|
|||
|
|
@ -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<syntax_tree_node, string> 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -84,9 +89,10 @@ namespace PascalABCCompiler.TreeConverter.TreeConversion
|
|||
Dictionary<syntax_tree_node, string> 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;
|
||||
|
|
|
|||
|
|
@ -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<SymbolInfo> capturedVariables = new List<SymbolInfo>();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -183,12 +189,6 @@ namespace PascalABCCompiler.TreeConverter
|
|||
|
||||
public List<TreeRealization.var_definition_node> 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,13 +9332,19 @@ 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;
|
||||
}
|
||||
|
||||
private string GetTempVariableName()
|
||||
{
|
||||
return generatedNamesManager.GenerateName("$TV", "$");
|
||||
}
|
||||
|
||||
|
||||
public override void visit(SyntaxTree.with_statement _with_statement)
|
||||
{
|
||||
context.WithSection = true;
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<ordinal_type_interface, System.Collections.Generic.Dictionary<type_node, type_node>> pascal_arrays =
|
||||
new System.Collections.Generic.Dictionary<ordinal_type_interface, System.Collections.Generic.Dictionary<type_node, type_node>>();
|
||||
|
||||
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<type_node, type_node> 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();
|
||||
|
|
|
|||
|
|
@ -22,6 +22,6 @@
|
|||
<ProjectReference Include="..\SemanticTree\SemanticTree.csproj" />
|
||||
<ProjectReference Include="..\StringConstants\StringConstants.csproj" />
|
||||
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj" />
|
||||
<ProjectReference Include="..\Yield\YieldHelpers\YieldHelpers.csproj" />
|
||||
<ProjectReference Include="..\CoreUtils\Utils.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")]
|
||||
|
|
@ -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 = "<yield_helper";
|
||||
|
||||
public enum ReservedNum { StateField = 1, CurrentField = 2, MethodFormalParam = 3, MethodSelf = 4, MethodLocalVariable = 5 }
|
||||
}
|
||||
}
|
||||
|
|
@ -66,7 +66,7 @@ copy bin\template.pct Release\PascalABCNETLinux\template.pct
|
|||
copy bin\TreeConverter.dll Release\PascalABCNETLinux\TreeConverter.dll
|
||||
copy bin\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.dll Release\PascalABCNETLinux\WeifenLuo.WinFormsUI.Docking.ThemeVS2005Linux.dll
|
||||
copy bin\WeifenLuo.WinFormsUI.DockingLinux.dll Release\PascalABCNETLinux\WeifenLuo.WinFormsUI.DockingLinux.dll
|
||||
copy bin\YieldHelpers.dll Release\PascalABCNETLinux\YieldHelpers.dll
|
||||
copy bin\Utils.dll Release\PascalABCNETLinux\Utils.dll
|
||||
copy bin\LambdaAnySynToSemConverter.dll Release\PascalABCNETLinux\LambdaAnySynToSemConverter.dll
|
||||
copy bin\TeacherControlPlugin.dll Release\PascalABCNETLinux\TeacherControlPlugin.dll
|
||||
copy bin\Highlighting\PascalABCNET.xshd Release\PascalABCNETLinux\Highlighting\PascalABCNET.xshd
|
||||
|
|
|
|||
30
pabcnetc.sln
30
pabcnetc.sln
|
|
@ -39,8 +39,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PascalABCSaushkinParser", "
|
|||
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}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeConverters", "SyntaxTreeConverters\SyntaxTreeConverters.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "SyntaxVisitors\SyntaxVisitors.csproj", "{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2}"
|
||||
|
|
@ -69,6 +67,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SPythonLanguageInfo", "Addi
|
|||
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
|
||||
|
|
@ -209,18 +209,6 @@ Global
|
|||
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{0ED020FF-D28E-4791-BBDD-B8B9BA714096}.Release|x86.ActiveCfg = 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}.Debug|x86.Build.0 = 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
|
||||
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09}.Release|x86.Build.0 = Release|Any CPU
|
||||
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
|
|
@ -341,6 +329,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
|
||||
|
|
@ -360,7 +360,6 @@ Global
|
|||
{613E0DDA-AA8A-437C-AC45-507B47429FF9} = {94EED2FF-0641-4562-8167-CBC280A733AF}
|
||||
{146083AD-6684-4EBC-A539-AAD749A16364} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
{0ED020FF-D28E-4791-BBDD-B8B9BA714096} = {BB6973BA-B3A2-4B31-A986-7CB008F22C4F}
|
||||
{CE5C55C2-A11C-4E94-A9FA-3FC6CA3E4C09} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
{F10A5330-DCF4-4533-877C-7B1B1BE23884} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
{A9AB4282-83B4-41A7-86C3-E5BF6A45E7E2} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
{27D9800E-2689-4AA1-A2D6-128E4A9BAE98} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
|
|
@ -375,6 +374,7 @@ Global
|
|||
{6883EC33-B9FD-6D48-B0C3-16F451552C9F} = {D7D9CC20-E09F-4FBC-8EEE-9FAB8406FCBB}
|
||||
{15D55C2B-37A6-850E-D0CF-74C43CBB9E3F} = {DFCE8D21-EF89-4922-B662-65CF93E0F61B}
|
||||
{CEEEDB1E-B0E1-283E-13C3-BFE73FE8A446} = {DFCE8D21-EF89-4922-B662-65CF93E0F61B}
|
||||
{EB7AFD92-6376-05DF-B47D-0BF77A4EAC43} = {F8CE2712-826B-450B-A72F-D32D80C99858}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {761C7A47-891E-47CF-B674-0C2B53D2E48C}
|
||||
|
|
|
|||
Loading…
Reference in a new issue