From 94c0db534a57d90370fd9fc3cf1f92dbcddfdaa1 Mon Sep 17 00:00:00 2001 From: miks1965 Date: Mon, 22 Feb 2016 12:30:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=B2=D0=B5=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B8=20foreach=20var,=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D0=BB=D0=B8=D1=81=D1=8C=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +-- Localization/DefaultLang.resources | Bin 79406 -> 79439 bytes ReleaseGenerators/PascalABCNET_version.nsh | 2 +- TestSuite/foreachvar1.pas | 17 ++++++++++++ TestSuite/foreachvar2.pas | 7 +++++ .../TreeConversion/syntax_tree_visitor.cs | 26 ++++++++++++++++-- bin/Lib/PABCRtl.dll | Bin 493056 -> 493056 bytes 8 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 TestSuite/foreachvar1.pas create mode 100644 TestSuite/foreachvar2.pas diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index c9a5531fd..80484afb7 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 = "1"; public const string Build = "0"; - public const string Revision = "1172"; + public const string Revision = "1173"; 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 b81e0240f..89d0d34d3 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=1 -%REVISION%=1172 %COREVERSION%=0 +%REVISION%=1173 +%MINOR%=1 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index efd34e6906be79962a8731cb0b6a757db6e74b52..9323db95f567f4bad51db3390beabee366660ddc 100644 GIT binary patch delta 30 ocmV+(0O9|x>;%v31d!kXYq8-QMU%m#83ytHAoA$%v-(9e@c!cwG5`Po delta 19 bcmX^AhGpFwmI)6Sy*56ScHJ!NX7m97W2^~7 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 5f229d782..2512bb1c6 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.1.0.1172' +!define VERSION '3.1.0.1173' diff --git a/TestSuite/foreachvar1.pas b/TestSuite/foreachvar1.pas new file mode 100644 index 000000000..18fae17f9 --- /dev/null +++ b/TestSuite/foreachvar1.pas @@ -0,0 +1,17 @@ +{begin + var s := [1,2,3]; + foreach var x in s do + begin + var y := x + x; + end; +end.} +type + TPair = auto class + Key: string; + Value: integer; + end; +begin + var A := Arr(new TPair('a',3),new TPair('c',1),new TPair('b',4)); + foreach var p in A do + writeln(p.Key, '->', p.Value); +end. \ No newline at end of file diff --git a/TestSuite/foreachvar2.pas b/TestSuite/foreachvar2.pas new file mode 100644 index 000000000..62233f3a5 --- /dev/null +++ b/TestSuite/foreachvar2.pas @@ -0,0 +1,7 @@ +begin + var s := [1,2,3]; + foreach var x in s do + begin + var y := x + x; + end; +end. diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 215724991..d589cb36f 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -16179,6 +16179,7 @@ namespace PascalABCCompiler.TreeConverter // IEnumerable, Range(1,10), Dictionary: tn = compiled_type_node // IEnumerable: tn = compiled_generic_instance_type_node // FibGen = class(IEnumerable,IEnumerator): tn = common_type_node, en = compiled_type_node + // array of Person: tn = common_type_node { System.Type ct; if (tn is compiled_type_node) @@ -16198,7 +16199,7 @@ namespace PascalABCCompiler.TreeConverter r = ct.GetInterface(IEnTstring); if (r != null) { - Type arg1 = r.GetGenericArguments().First(); + Type arg1 = r.GetGenericArguments().First(); // тип параметра IEnumerable var str = arg1.GetGenericArguments().Count(); if (tn is compiled_type_node) { @@ -16230,7 +16231,7 @@ namespace PascalABCCompiler.TreeConverter } else { - if (tn.element_type != null) // значит, это массив любой размерности - 02.02.16 SSM + if (tn.element_type != null) // значит, это массив любой размерности - 02.02.16 SSM - еще может быть множество set of T - 22.02.16 SSM { elem_type = tn.element_type; return true; @@ -16265,6 +16266,27 @@ namespace PascalABCCompiler.TreeConverter { if (tn == null || tn is null_type_node || tn.ImplementingInterfaces == null) return false; + + if (tn.element_type != null) // еще может быть множество set of T - 22.02.16 SSM + { + elem_type = tn.element_type; + return true; + } + + foreach (SemanticTree.ITypeNode itn in tn.ImplementingInterfaces) // Ищем интерфейс IEnumerable и возвращаем T в качестве elem_type + { + if (itn is compiled_generic_instance_type_node) + { + var itnc = (itn as compiled_generic_instance_type_node); + var tt = (itnc.original_generic as compiled_type_node).compiled_type; + if (tt == typeof(System.Collections.Generic.IEnumerable<>)) + { + elem_type = itnc.generic_parameters[0] as common_type_node; + return true; + } + } + } + foreach (SemanticTree.ITypeNode itn in tn.ImplementingInterfaces) { //if (itn == ctn) diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index e9a306579249bdb0bd8c7b25573877e6148af114..2e2e71f5c3de592eb31859b993c8940e370ab941 100644 GIT binary patch delta 254 zcmZqZk!$FYo6y0${_Kf~-M-8pdf6Lqx87!Kz0I`sHZ#k-dKRG&#{1tip9iJI$YoUa zByuMjSfm`ckFONF#l87ru8pVh%)hf-`&vDAh^}MNIGVfs1DT z|I~rYKTa7wPwYRd8gk=!zT3akPuAYkd>%ZbU@MdND)u?+jxD=BWx0M}!DmK2=Z*Y7 z#piMLTrAv>_VMGyKYuqeX0*r8X9i*xAZFbjKc8)(pTK&S^MABfJGivO)o*3d+%SA-e%f*o0(-^{pve!4sWcIQS0L0(75;0 z!$Ys@Vr2I``tHB*NYIUY%O`LLCN>6I)G6hja;v>LYfi}V^v=3I$DHN0D`usn+uukr zixs$~AX^svd*7P-k_z{i?hNri+mh$bZucBGZ3=?G3)mD`D_dQ1U~ES=(@6Hhr{+bEki4pD-PQQ z-mz_%tON8y7y}S60kH~*0R%T1*%^X@U4ngAq<_kue#3j`%m*r4?%TO+f78e=!U6zX C#Bu)s