From 1d31faee2b20be5ec8a3f308cf9e8f9b52983be4 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: Tue, 10 Jan 2017 13:31:39 +0100 Subject: [PATCH] bug fix #327 --- TestSuite/extensionmethods19.pas | 5 ++++ .../TreeConversion/syntax_tree_visitor.cs | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 TestSuite/extensionmethods19.pas diff --git a/TestSuite/extensionmethods19.pas b/TestSuite/extensionmethods19.pas new file mode 100644 index 000000000..dbef8b67e --- /dev/null +++ b/TestSuite/extensionmethods19.pas @@ -0,0 +1,5 @@ +begin + var a := Arr(1,3,5,4,3); + var b := a.Println.ToArray; + assert(b[2] = 5); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index b073cb7c4..195aca181 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -8969,6 +8969,30 @@ namespace PascalABCCompiler.TreeConverter { return new indefinite_reference(dn as indefinite_definition_node, get_location(id_right)); } + if (expected_delegate && en != null) + { + SymbolInfo tmp_si = si; + function_node tmp_fn = null; + bool has_empty_methods = false; + bool only_extension_methods = true; + while (tmp_si != null) + { + tmp_fn = tmp_si.sym_info as function_node; + if (tmp_fn != null) + { + if (!tmp_fn.is_extension_method) + only_extension_methods = false; + else + { + if (tmp_fn.parameters.Count == 1 || tmp_fn.parameters.Count == 2 && (tmp_fn.parameters[1].is_params || tmp_fn.parameters[1].default_value != null)) + has_empty_methods = true; + } + } + tmp_si = tmp_si.Next; + } + if (has_empty_methods && only_extension_methods) + expected_delegate = false; + } if (expected_delegate) return make_delegate_wrapper(en, si, get_location(id_right), false); else