From 314ae55066d521cbd15135a8ed7124d7ca9405e7 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: Sun, 25 Mar 2018 18:12:20 +0200 Subject: [PATCH] bug fix #735 --- TestSuite/extensionmethods27.pas | 11 +++++++++ TestSuite/extensionmethods28.pas | 23 +++++++++++++++++++ .../TreeConversion/compilation_context.cs | 4 ++++ .../TreeConversion/syntax_tree_visitor.cs | 4 +++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 TestSuite/extensionmethods27.pas create mode 100644 TestSuite/extensionmethods28.pas diff --git a/TestSuite/extensionmethods27.pas b/TestSuite/extensionmethods27.pas new file mode 100644 index 000000000..3da8b2dea --- /dev/null +++ b/TestSuite/extensionmethods27.pas @@ -0,0 +1,11 @@ +procedure Add(self:List; item: T; b: boolean); extensionmethod; +begin + self.Add(item); +end; + +begin + var l: List := new List; + l.Add(1, true); + l.Add(6); + assert(l[0] = 1); +end. \ No newline at end of file diff --git a/TestSuite/extensionmethods28.pas b/TestSuite/extensionmethods28.pas new file mode 100644 index 000000000..0f799a251 --- /dev/null +++ b/TestSuite/extensionmethods28.pas @@ -0,0 +1,23 @@ +var i: integer; +type + t1=class + + procedure p1(a:byte; b:word); + begin + i := 2; + end; + + end; + +procedure p1(self:t1;c:single); extensionmethod; +begin + i := 3; +end; + +begin + var o: t1 := new t1; + o.p1(2,3); + assert(i = 2); + o.p1(4); + assert(i = 3); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index 57bbcb0de..1cd482758 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -2564,6 +2564,10 @@ namespace PascalABCCompiler.TreeConverter } if (error_on_false) { + if (def is common_namespace_function_node && (def as common_namespace_function_node).ConnectedToType != null && predef is common_method_node) + { + return false; + } AddError(def.loc, "FUNCTION_DEFINITION_HAVE_DIFFERENT_PARAMS_WITH_PREDEFINITION"); } return false; diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index adc03472c..2fbfead5d 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -13041,7 +13041,9 @@ namespace PascalABCCompiler.TreeConverter } if (top_function.ConnectedToType.Scope == null) AddError(context.top_function.loc, "EXTENSION_METHODS_FOR_CONSTRUCTED_TYPES_NOT_ALLOWED"); - top_function.ConnectedToType.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); + SymbolInfo si = new SymbolInfo(context.top_function); + si.symbol_kind = symbol_kind.sk_overload_function; + top_function.ConnectedToType.Scope.AddSymbol(top_function.name, si); if (top_function.ConnectedToType.type_special_kind == SemanticTree.type_special_kind.array_kind && top_function.ConnectedToType.element_type.is_generic_parameter) top_function.ConnectedToType.base_type.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); else if (top_function.ConnectedToType.is_generic_parameter)