From 28a64634ae8879fa5a40c911aef1520a566bafce 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, 29 Jan 2018 21:17:51 +0100 Subject: [PATCH] bug fix #648 --- TestSuite/extensionmethods26.pas | 13 +++++++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 TestSuite/extensionmethods26.pas diff --git a/TestSuite/extensionmethods26.pas b/TestSuite/extensionmethods26.pas new file mode 100644 index 000000000..9b2eec7b6 --- /dev/null +++ b/TestSuite/extensionmethods26.pas @@ -0,0 +1,13 @@ +begin + var a:array of char; + a := Arr('A','B','C'); + var b := a + 'D';//'D' is char + assert(b.First = 'A'); + assert(b is IEnumerable); + var c := a + 'DE';//'DE' is string + assert(c is IEnumerable); + assert(c.Last = 'E'); + var e := 'D' + a; + assert(e is IEnumerable); + assert(e.Last = 'C'); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index f6f7e5402..4309d842b 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -1088,6 +1088,8 @@ namespace PascalABCCompiler.TreeConverter } } } + if (name == "+" && right_type == SystemLibrary.SystemLibrary.char_type && left_type != SystemLibrary.SystemLibrary.string_type) + no_search_in_extension_methods = false; SymbolInfoList sil = left_type.find_in_type(name, left_type.Scope, no_search_in_extension_methods); int added_symbols = -1; SymbolInfoList sil2 = null; @@ -1096,6 +1098,8 @@ namespace PascalABCCompiler.TreeConverter //SymbolInfo si2 = right_type.find(name, context.CurrentScope); if (sil != null) sil = sil.copy(); + if (name == "+" && right_type != SystemLibrary.SystemLibrary.string_type && left_type == SystemLibrary.SystemLibrary.char_type) + no_search_in_extension_methods = false; sil2 = right_type.find_in_type(name, right_type.Scope, no_search_in_extension_methods); if ((sil != null) && (sil2 != null)) {