From ea12ccdd095146bbb47a2ed05753a091c2bd9a3f 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, 5 Nov 2017 14:16:57 +0100 Subject: [PATCH] bug fix #543 --- Compiler/PCU/PCUReader.cs | 4 ++++ TestSuite/extensionmethods24.pas | 11 +++++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 2 ++ 3 files changed, 17 insertions(+) create mode 100644 TestSuite/extensionmethods24.pas diff --git a/Compiler/PCU/PCUReader.cs b/Compiler/PCU/PCUReader.cs index 2385e1769..a71214d8f 100644 --- a/Compiler/PCU/PCUReader.cs +++ b/Compiler/PCU/PCUReader.cs @@ -2805,6 +2805,8 @@ namespace PascalABCCompiler.PCU cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.is_generic_parameter) cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); + else if (cnfn.ConnectedToType is compiled_type_node && cnfn.ConnectedToType.is_generic_type_instance && cnfn.ConnectedToType.original_generic.Scope != null) + cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); else if (cnfn.ConnectedToType is compiled_generic_instance_type_node && cnfn.ConnectedToType.original_generic.Scope != null) { cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); @@ -2910,6 +2912,8 @@ namespace PascalABCCompiler.PCU cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.is_generic_parameter) cnfn.ConnectedToType.base_type.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); + else if (cnfn.ConnectedToType is compiled_type_node && cnfn.ConnectedToType.is_generic_type_instance && cnfn.ConnectedToType.original_generic.Scope != null) + cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); else if (cnfn.ConnectedToType is compiled_generic_instance_type_node && cnfn.ConnectedToType.original_generic.Scope != null) { cnfn.ConnectedToType.original_generic.Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); diff --git a/TestSuite/extensionmethods24.pas b/TestSuite/extensionmethods24.pas new file mode 100644 index 000000000..788301d5f --- /dev/null +++ b/TestSuite/extensionmethods24.pas @@ -0,0 +1,11 @@ +var i: integer; +procedure p1(Self: sequence of real); extensionmethod; +begin + i := 1; +end; + +begin + var r := new List; + r.p1; + assert(i = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 72841477d..19ad209ec 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -12720,6 +12720,8 @@ namespace PascalABCCompiler.TreeConverter top_function.ConnectedToType.base_type.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); else if (top_function.ConnectedToType.is_generic_parameter) top_function.ConnectedToType.base_type.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); + else if (top_function.ConnectedToType is compiled_type_node && top_function.ConnectedToType.is_generic_type_instance && top_function.ConnectedToType.original_generic.Scope != null) + top_function.ConnectedToType.original_generic.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); else if (top_function.ConnectedToType is compiled_generic_instance_type_node && top_function.ConnectedToType.original_generic.Scope != null) top_function.ConnectedToType.original_generic.Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); else if (top_function.ConnectedToType.IsDelegate && top_function.ConnectedToType.base_type.IsDelegate)