From efa9bdc366e1c0f8e23008e2cec387f8f59d378f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Mon, 27 Nov 2017 21:01:49 +0100 Subject: [PATCH] bug fix #568 --- TestSuite/extensionmethods25.pas | 5 +++++ TreeConverter/SymbolTable/symbol_information.cs | 8 ++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 13 +++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 TestSuite/extensionmethods25.pas diff --git a/TestSuite/extensionmethods25.pas b/TestSuite/extensionmethods25.pas new file mode 100644 index 000000000..6a281d381 --- /dev/null +++ b/TestSuite/extensionmethods25.pas @@ -0,0 +1,5 @@ +begin + var l := Lst(1,2,3); + l.Reverse(); + assert(l[0]=3); +end. \ No newline at end of file diff --git a/TreeConverter/SymbolTable/symbol_information.cs b/TreeConverter/SymbolTable/symbol_information.cs index 59754e56c..cd652a4d5 100644 --- a/TreeConverter/SymbolTable/symbol_information.cs +++ b/TreeConverter/SymbolTable/symbol_information.cs @@ -527,6 +527,14 @@ namespace PascalABCCompiler.TreeConverter return 0; } + public bool HasOnlyExtensionMethods() + { + for (int i = 0; i < list.Count; ++i) + if (!(list[i].sym_info is function_node && (list[i].sym_info as function_node).is_extension_method)) + return false; + return true; + } + public void Insert(int index, SymbolInfo item) { if (list != null) diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index aa1537117..341021f92 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -5284,6 +5284,19 @@ namespace PascalABCCompiler.TreeConverter throw LastError(); } } + else if (fn != null && skip_first_parameter && sil.Count() > 1 && !sil.HasOnlyExtensionMethods()) + { + function_node tmp_fn = fn; + exprs.remove_at(0); + sil = tmp_sil; + fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters); + if (fn == null) + { + fn = tmp_fn; + RemoveLastError(); + exprs.AddElementFirst(exp); + } + } } catch (Exception ex) {