diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 3a1734cb6..b2872ab35 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 = "4"; public const string Build = "0"; - public const string Revision = "1689"; + public const string Revision = "1693"; 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 aac3545df..d455d50dd 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ %COREVERSION%=0 -%REVISION%=1689 +%REVISION%=1693 %MINOR%=4 %MAJOR%=3 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 2ae006dd9..db8428165 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.4.0.1689' +!define VERSION '3.4.0.1693' diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index 215c7a2a7..515b14983 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1781,6 +1781,8 @@ function ReadArrString(prompt: string; n: integer): array of string; // ----------------------------------------------------- //>> Подпрограммы для матриц # Subroutines for matrixes // ----------------------------------------------------- +/// Возвращает двумерный массив размера m x n, заполненный указанными значениями по строкам +function Matr(m,n: integer; params data: array of T): array [,] of T; /// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями function MatrRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer; /// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями @@ -2166,6 +2168,7 @@ const PARAMETER_FROM_OUT_OF_RANGE = 'Параметр from за пределами диапазона!!The from parameter out of bounds'; PARAMETER_TO_OUT_OF_RANGE = 'Параметр to за пределами диапазона!!The to parameter out of bounds'; ARR_LENGTH_MUST_BE_MATCH_TO_MATR_SIZE = 'Размер одномерного массива не согласован с размером двумерного массива!!The 1-dim array length does not match 2-dim array size'; + INITELEM_COUNT_MUST_BE_EQUAL_TO_MATRIX_ELEMS_COUNT = 'Количество инициализирующих элементов не совпадает с количеством элементов матрицы!!The number of elements in init list must be equal to the number of elements in matrix'; // ----------------------------------------------------- // WINAPI @@ -8399,6 +8402,13 @@ begin Result := Self end; +/// Выводит последовательность, каждый элемент отображается с помощью функции map и выводится на новой строке +function PrintLines(Self: sequence of T; map: T->T1): sequence of T; extensionmethod; +begin + Self.Select(map).Println(NewLine); + Result := Self +end; + /// Преобразует элементы последовательности в строковое представление, после чего объединяет их в строку, используя delim в качестве разделителя function JoinIntoString(Self: sequence of T; delim: string): string; extensionmethod; begin @@ -8449,6 +8459,18 @@ begin Result := Self.OrderByDescending(x -> x); end; +/// Возвращает отсортированную по возрастанию последовательность +function Order(Self: sequence of T): sequence of T; extensionmethod; +begin + Result := Self.OrderBy(x -> x); +end; + +/// Возвращает отсортированную по убыванию последовательность +function OrderDescending(Self: sequence of T): sequence of T; extensionmethod; +begin + Result := Self.OrderByDescending(x -> x); +end; + /// Возвращает множество HashSet по данной последовательности function ToHashSet(Self: sequence of T): HashSet; extensionmethod; begin @@ -9416,6 +9438,21 @@ end; //>> Фиктивная секция YYY - не удалять! # YYY // ----------------------------------------------------- +function Matr(m,n: integer; params data: array of T): array [,] of T; +begin + if data.Length<>m*n then + raise new System.ArgumentException(GetTranslation(INITELEM_COUNT_MUST_BE_EQUAL_TO_MATRIX_ELEMS_COUNT)); + + Result := new T[m, n]; + var k := 0; + for var i:=0 to Result.RowCount-1 do + for var j:=0 to Result.ColCount-1 do + begin + Result[i,j] := data[k]; + k += 1; + end; +end; + // Реализация операций с матрицами - только после введения RowCount и ColCount function MatrRandom(m: integer; n: integer; a, b: integer): array [,] of integer; begin diff --git a/TestSuite/foreachvar4.pas b/TestSuite/foreachvar4.pas new file mode 100644 index 000000000..d260fe22a --- /dev/null +++ b/TestSuite/foreachvar4.pas @@ -0,0 +1,25 @@ +type + t1=class + public + i1 := 55; + function f1 := 1; + end; + t2=class + public + i2 := 66; + function f2 := 2; + end; + +begin + + var d := new SortedDictionary; + d.Add(new t1,new t2); + + {foreach var a in d do writeln(a.GetType);//KeyValuePair + foreach var a in d.Keys do writeln(a.GetType);//t1 + foreach var a in d.Values do writeln(a.GetType);//t2} + + foreach var a in d.Values do + Assert(a.i2=66); + +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index ec0bfe019..f95c338b8 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -16865,7 +16865,22 @@ namespace PascalABCCompiler.TreeConverter if (ct.ToString().StartsWith(IGrTstring)) elem_type = ip[1]; else - elem_type = ip[0]; + { + var ln = tn.ImplementingInterfaces; + elem_type = null; + foreach (var x in ln) + { + var xctn = x as compiled_generic_instance_type_node; + if (xctn != null && xctn.name.StartsWith("IEnumerable<")) // Немного грубовато. + { + elem_type = xctn.instance_params[0]; + break; + } + } + if (elem_type == null) + elem_type = ip[0]; + } + //var Tname = ip[0].name; //elem_type = convert_strong(new SyntaxTree.named_type_reference(Tname, _foreach_stmt.in_what.source_context)); } diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index 96e4e0a55..515b14983 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1781,6 +1781,8 @@ function ReadArrString(prompt: string; n: integer): array of string; // ----------------------------------------------------- //>> Подпрограммы для матриц # Subroutines for matrixes // ----------------------------------------------------- +/// Возвращает двумерный массив размера m x n, заполненный указанными значениями по строкам +function Matr(m,n: integer; params data: array of T): array [,] of T; /// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями function MatrRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer; /// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями @@ -2166,6 +2168,7 @@ const PARAMETER_FROM_OUT_OF_RANGE = 'Параметр from за пределами диапазона!!The from parameter out of bounds'; PARAMETER_TO_OUT_OF_RANGE = 'Параметр to за пределами диапазона!!The to parameter out of bounds'; ARR_LENGTH_MUST_BE_MATCH_TO_MATR_SIZE = 'Размер одномерного массива не согласован с размером двумерного массива!!The 1-dim array length does not match 2-dim array size'; + INITELEM_COUNT_MUST_BE_EQUAL_TO_MATRIX_ELEMS_COUNT = 'Количество инициализирующих элементов не совпадает с количеством элементов матрицы!!The number of elements in init list must be equal to the number of elements in matrix'; // ----------------------------------------------------- // WINAPI @@ -9435,6 +9438,21 @@ end; //>> Фиктивная секция YYY - не удалять! # YYY // ----------------------------------------------------- +function Matr(m,n: integer; params data: array of T): array [,] of T; +begin + if data.Length<>m*n then + raise new System.ArgumentException(GetTranslation(INITELEM_COUNT_MUST_BE_EQUAL_TO_MATRIX_ELEMS_COUNT)); + + Result := new T[m, n]; + var k := 0; + for var i:=0 to Result.RowCount-1 do + for var j:=0 to Result.ColCount-1 do + begin + Result[i,j] := data[k]; + k += 1; + end; +end; + // Реализация операций с матрицами - только после введения RowCount и ColCount function MatrRandom(m: integer; n: integer; a, b: integer): array [,] of integer; begin