diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index b073e89b0..5a99a445c 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "6"; public const string Build = "3"; - public const string Revision = "2514"; + public const string Revision = "2518"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 86b20346d..78d147a63 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %COREVERSION%=3 -%REVISION%=2514 +%REVISION%=2518 %MINOR%=6 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index b6020d200..67f5ba17c 100644 Binary files a/Localization/DefaultLang.resources and b/Localization/DefaultLang.resources differ diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 21f7de9d1..c0271ee1c 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.6.3.2514 +3.6.3.2518 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 1f89345a2..9c726f5f7 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.6.3.2514' +!define VERSION '3.6.3.2518' diff --git a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs index 91cbb39dd..9bfdd8e4a 100644 --- a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs @@ -207,6 +207,14 @@ namespace SyntaxVisitors.SugarVisitors visit(desugaredMatchWith); } + private int num = 0; + + public string GenerateNewName(string name) + { + num += 1; + return "$RenIsVarYield" + num + "$" + name; + } + public override void visit(is_pattern_expr isPatternExpr) { if (GetLocation(isPatternExpr) == PatternLocation.Unknown) @@ -214,6 +222,46 @@ namespace SyntaxVisitors.SugarVisitors Debug.Assert(GetAscendant(isPatternExpr) != null, "Couldn't find statement list in upper nodes"); + var l = new List(); + //l.Add(stat); + var pp = isPatternExpr.right?.parameters; + if (pp != null) + { + foreach (var p in pp) + { + if (p is var_deconstructor_parameter vdp) + { + var idClone = vdp.identifier.TypedClone(); + var idNew = vdp.identifier.TypedClone(); + idNew.name = GenerateNewName(idNew.name); + var vs = new var_statement(idClone, idNew, idClone.source_context); + vdp.identifier.name = idNew.name; + l.Add(vs); + } + } + } + + var stat = GetAscendant(isPatternExpr); + if (stat is if_node ifn) + { + //l.Add(ifn.then_body); + if (!(ifn.then_body is statement_list)) + { + ifn.then_body = new statement_list(ifn.then_body); + } + (ifn.then_body as statement_list).list.InsertRange(0, l); + } + else + { + l.Insert(0, stat); + foreach (var x in l) + x.Parent = stat.Parent; + var stl = stat.Parent as statement_list; + stl.ReplaceInList(stat, l); + } + + //ReplaceStatement(stat, l); // тут нельзя. + DesugarIsExpression(isPatternExpr); } diff --git a/SyntaxVisitors/SyntaxVisitors.csproj b/SyntaxVisitors/SyntaxVisitors.csproj index 459191d04..70c553eb2 100644 --- a/SyntaxVisitors/SyntaxVisitors.csproj +++ b/SyntaxVisitors/SyntaxVisitors.csproj @@ -65,6 +65,7 @@ + diff --git a/SyntaxVisitors/YieldVisitors/DeleteAllLocalDefs.cs b/SyntaxVisitors/YieldVisitors/DeleteAllLocalDefs.cs index 6d190a2b6..fad1a1bcc 100644 --- a/SyntaxVisitors/YieldVisitors/DeleteAllLocalDefs.cs +++ b/SyntaxVisitors/YieldVisitors/DeleteAllLocalDefs.cs @@ -85,5 +85,11 @@ namespace SyntaxVisitors // еще - не заходить в лямбды } + + public override void visit(desugared_deconstruction dd) + { + DefaultVisit(dd); + } + } } diff --git a/SyntaxVisitors/YieldVisitors/IsVarRenameVisitor.cs b/SyntaxVisitors/YieldVisitors/IsVarRenameVisitor.cs new file mode 100644 index 000000000..9b7c86b9f --- /dev/null +++ b/SyntaxVisitors/YieldVisitors/IsVarRenameVisitor.cs @@ -0,0 +1,60 @@ +// 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; + +namespace SyntaxVisitors +{ + public class IsVarRenameVisitor : BaseChangeVisitor + { + + public IsVarRenameVisitor() + { + } + + public static IsVarRenameVisitor New + { + get { return new IsVarRenameVisitor(); } + } + + public static void Accept(procedure_definition pd) + { + New.ProcessNode(pd); + } + + public override void visit(procedure_header proc_header) + { + // DO THIS THING! + } + /* public override void visit(desugared_deconstruction dd) + { + var l = new List(); + l.Add(dd); + foreach (var d in dd.variables.definitions) + { + foreach (var id in d.vars.idents) + { + // добавить после неё кучу объявлений с присваиваниями + //ReplaceStatement(dd,) + var newvar = new ident(NewVariableName(id.name),id.source_context); + var vs = new var_statement(new ident(id.name, id.source_context), newvar, id.source_context); + l.Add(vs); + id.name = newvar.name; + } + } + ReplaceStatement(dd, l); + }*/ + + private string NewVariableName(string name) + { + name = name.ToLower(); + return "$RenIsVarYield$" + name; + } + } +} diff --git a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 2913a37a2..a2e7238ca 100644 --- a/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -971,6 +971,11 @@ namespace SyntaxVisitors pd.visit(checkVarRedefVisitor); */ + // Если есть в pd узлы is_pattern_expr, то запустить визитор, добавляющий присваивание временной переменной и заменяющий + // везде далее имя исходной переменной на имя временной + // SSM 20/06 - не очень так получается. Сложно + //IsVarRenameVisitor.Accept(pd); + // Выносим выражение из yield в отдельную переменную ReplaceYieldExprByVarVisitor.Accept(pd); diff --git a/TestSuite/isvar2.pas b/TestSuite/isvar2.pas new file mode 100644 index 000000000..4808ebbc9 --- /dev/null +++ b/TestSuite/isvar2.pas @@ -0,0 +1,18 @@ +function f1(o: object): sequence of object; +begin + + //var c := o is object(var a); + if o is object(var a) then + begin + // var b := a; + // Writeln(a); // object + yield a; + Assert(a <> nil); // nil + // Writeln(b); // object + // b := b; + end; +end; + +begin + foreach var o in f1(new object) do +end. \ No newline at end of file diff --git a/TestSuite/isvar3.pas b/TestSuite/isvar3.pas new file mode 100644 index 000000000..4f10e0e48 --- /dev/null +++ b/TestSuite/isvar3.pas @@ -0,0 +1,19 @@ +function f1(o: object): sequence of object; +begin + + //var c := o is object(var a); + if o is object(var a) then + //begin + // var b := a; + // Writeln(a); // object + yield a; + //Assert(a <> nil); // nil + // Writeln(b); // object + // b := b; + //end; +end; + +begin + foreach var o in f1(new object) do + Assert(o<>nil) +end. \ No newline at end of file diff --git a/TestSuite/isvar4.pas b/TestSuite/isvar4.pas new file mode 100644 index 000000000..3d54646af --- /dev/null +++ b/TestSuite/isvar4.pas @@ -0,0 +1,19 @@ +function f1(o: object): sequence of object; +begin + + var c := o is object(var a); + //if o is object(var a) then + //begin + // var b := a; + // Writeln(a); // object + yield a; + Assert(a <> nil); // nil + // Writeln(b); // object + // b := b; + //end; +end; + +begin + foreach var o in f1(new object) do + +end. \ No newline at end of file diff --git a/bin/Lng/Eng/SemanticErrors_ms.dat b/bin/Lng/Eng/SemanticErrors_ms.dat index 8a1f15388..35a546dfc 100644 --- a/bin/Lng/Eng/SemanticErrors_ms.dat +++ b/bin/Lng/Eng/SemanticErrors_ms.dat @@ -39,3 +39,4 @@ ONE_DIM_ARRAY_OR_LIST_EXPECTED=One-dimensional array or list expected TUPLE_TYPE_ELEMENTS_COUNT_MUST_BE_LESSEQUAL_7=Number of elements in tuple type must be less than 8 OVERRIDE_METHODS_CANNOT_CONTAIN_WHERE_SECTION=Methods with override modifier can't contain where section Ìåòîäû ñ ìîäèôèêàòîðîì override íå ìîãóò ñîäåðæàòü ñîáñòâåííóþ ñåêöèþ where +EXPLICIT_CASTS_FOR_LAMBDA_EXPRESSIONS_ARE_FORBIDDEN=Explicit type casts for lambda expressions are forbidden \ No newline at end of file