From 771ea7b445ec9086a0ac172e24299fa6c8bea0f3 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 6 Apr 2025 14:32:17 +0200 Subject: [PATCH] #3230 --- TestSuite/CompilationSamples/SF.pas | 5 ----- TestSuite/errors/err0543.pas | 6 ++++++ TestSuite/errors/err0544.pas | 6 ++++++ TestSuite/extensionmethods14.pas | 4 ++-- TestSuite/extensionmethods8.pas | 4 ++-- .../TreeConversion/compilation_context.cs | 14 ++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 15 ++++++++++++++- .../TreeConversion/type_constructor.cs | 19 +++++++++++++++++++ bin/Lib/SF.pas | 5 ----- 9 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 TestSuite/errors/err0543.pas create mode 100644 TestSuite/errors/err0544.pas diff --git a/TestSuite/CompilationSamples/SF.pas b/TestSuite/CompilationSamples/SF.pas index bb89662ce..37108015a 100644 --- a/TestSuite/CompilationSamples/SF.pas +++ b/TestSuite/CompilationSamples/SF.pas @@ -319,11 +319,6 @@ function Cart(Self: sequence of T; b: sequence of T1): sequence of (T, T1 /// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение function Cart(Self: sequence of T; b: sequence of T1; func: (T,T1)->T2): sequence of T2; extensionmethod := Self.Cartesian(b,func); - - -/// Возвращает все сочетания по m элементов -function Cmb(Self: array of T; m: integer): sequence of array of T; extensionmethod - := Self.Combinations(m); /// Возвращает все сочетания по m элементов function Cmb(Self: sequence of T; m: integer): sequence of array of T; extensionmethod diff --git a/TestSuite/errors/err0543.pas b/TestSuite/errors/err0543.pas new file mode 100644 index 000000000..0bb647af5 --- /dev/null +++ b/TestSuite/errors/err0543.pas @@ -0,0 +1,6 @@ +//!Повторное объявление +function Prm(Self: array of T): integer; extensionmethod := 1; +function Prm(Self: array of T): integer; extensionmethod := 1; + +begin +end. \ No newline at end of file diff --git a/TestSuite/errors/err0544.pas b/TestSuite/errors/err0544.pas new file mode 100644 index 000000000..160317734 --- /dev/null +++ b/TestSuite/errors/err0544.pas @@ -0,0 +1,6 @@ +//!Повторное объявление +procedure Prm(Self: array of T); extensionmethod; begin end; +procedure Prm(Self: array of T); extensionmethod; begin end; + +begin +end. \ No newline at end of file diff --git a/TestSuite/extensionmethods14.pas b/TestSuite/extensionmethods14.pas index d02d8e741..592e62588 100644 --- a/TestSuite/extensionmethods14.pas +++ b/TestSuite/extensionmethods14.pas @@ -2,12 +2,12 @@ begin System.Array.Reverse(Self); Result := Self; -end;} +end; function BinarySearch(self: array of T; item: T): integer; extensionmethod; begin Result := System.Array.BinarySearch(self,item); -end; +end;} begin diff --git a/TestSuite/extensionmethods8.pas b/TestSuite/extensionmethods8.pas index c30a46679..d8c0dbcfb 100644 --- a/TestSuite/extensionmethods8.pas +++ b/TestSuite/extensionmethods8.pas @@ -41,10 +41,10 @@ begin self.AddRange(arr); end; -function BinarySearch(self: array of T; item: T): integer; extensionmethod; +{function BinarySearch(self: array of T; item: T): integer; extensionmethod; begin Result := System.Array.BinarySearch(self, item); -end; +end;} procedure Test1(self: array[,] of T); extensionmethod; begin diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index d7d581c87..f8322713a 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -3229,6 +3229,17 @@ namespace PascalABCCompiler.TreeConverter } } } + if (_ctn.type_special_kind == SemanticTree.type_special_kind.array_kind && _ctn.element_type.is_generic_parameter) + { + var arr_types = type_constructor.instance.get_generic_arrays(_ctn.rank); + foreach (var ctn in arr_types) + { + var addit_si_list = ctn.Scope.FindOnlyInScope(fn.name); + if (addit_si_list != null) + si_list.AddRange(addit_si_list); + } + + } } else if (_compiled_tn != null) { @@ -3262,7 +3273,10 @@ namespace PascalABCCompiler.TreeConverter foreach (var tmp_si in si_list) { if (tmp_si.sym_info == fn) + { + continue; + } if (tmp_si.sym_info.general_node_type != general_node_type.function_node) { TreeRealization.BasePCUReader.RestoreSymbols(si_list, fn.name); diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index afae9d566..048323ad6 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -14155,6 +14155,7 @@ namespace PascalABCCompiler.TreeConverter common_type_node common_converted_type_tmp = context.converted_type; compiled_type_node compiled_converted_type_tmp = context.converted_compiled_type; common_namespace_function_node cnfn2 = context.top_function as common_namespace_function_node; + if (cnfn2 != null && cnfn2.ConnectedToType != null) { if (cnfn2.ConnectedToType is compiled_type_node) @@ -14346,8 +14347,20 @@ namespace PascalABCCompiler.TreeConverter } } } - bool unique = context.close_function_params(body_exists); + common_type_node common_converted_type_tmp = context.converted_type; + compiled_type_node compiled_converted_type_tmp = context.converted_compiled_type; + common_namespace_function_node cnfn2 = context.top_function as common_namespace_function_node; + if (cnfn2 != null && cnfn2.ConnectedToType != null) + { + if (cnfn2.ConnectedToType is compiled_type_node) + context.converted_compiled_type = cnfn2.ConnectedToType as compiled_type_node; + else if (cnfn2.ConnectedToType is common_type_node) + context.converted_type = cnfn2.ConnectedToType as common_type_node; + } + bool unique = context.close_function_params(body_exists); + context.converted_compiled_type = compiled_converted_type_tmp; + context.converted_type = common_converted_type_tmp; if (context.converted_type != null && context.converted_type.IsInterface) { if (body_exists) diff --git a/TreeConverter/TreeConversion/type_constructor.cs b/TreeConverter/TreeConversion/type_constructor.cs index 9ac8facf6..6dbbfc067 100644 --- a/TreeConverter/TreeConversion/type_constructor.cs +++ b/TreeConverter/TreeConversion/type_constructor.cs @@ -38,6 +38,25 @@ namespace PascalABCCompiler.TreeConverter private System.Collections.Generic.Dictionary> types_unsized_arrays = new System.Collections.Generic.Dictionary>(); + public List get_generic_arrays(int rank) + { + List lst = new List(); + foreach (var key in types_unsized_arrays.Keys) + { + if (key.is_generic_parameter) + { + List ret = types_unsized_arrays[key]; + for (int i = 0; i < ret.Count; i++) + if (ret[i] is common_type_node ctn) + { + if (ctn.rank == rank) + lst.Add(ctn); + } + } + } + return lst; + } + public type_node create_unsized_array(type_node element_type, int rank, location loc) { List ret = null; diff --git a/bin/Lib/SF.pas b/bin/Lib/SF.pas index bb89662ce..37108015a 100644 --- a/bin/Lib/SF.pas +++ b/bin/Lib/SF.pas @@ -319,11 +319,6 @@ function Cart(Self: sequence of T; b: sequence of T1): sequence of (T, T1 /// Возвращает декартово произведение последовательностей, проектируя каждую пару на значение function Cart(Self: sequence of T; b: sequence of T1; func: (T,T1)->T2): sequence of T2; extensionmethod := Self.Cartesian(b,func); - - -/// Возвращает все сочетания по m элементов -function Cmb(Self: array of T; m: integer): sequence of array of T; extensionmethod - := Self.Combinations(m); /// Возвращает все сочетания по m элементов function Cmb(Self: sequence of T; m: integer): sequence of array of T; extensionmethod