diff --git a/Compiler/PCU/PCUReader.cs b/Compiler/PCU/PCUReader.cs index aeaf770d7..e90974266 100644 --- a/Compiler/PCU/PCUReader.cs +++ b/Compiler/PCU/PCUReader.cs @@ -2804,6 +2804,8 @@ namespace PascalABCCompiler.PCU cnfn.ConnectedToType.base_type.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)); + else if (cnfn.ConnectedToType != null && cnfn.ConnectedToType.IsDelegate && cnfn.ConnectedToType.base_type.IsDelegate) + compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(cnfn.name, new SymbolInfo(cnfn)); return cnfn; } diff --git a/TreeConverter/NetWrappers/NetHelper.cs b/TreeConverter/NetWrappers/NetHelper.cs index 190824b06..2bdb4d82d 100644 --- a/TreeConverter/NetWrappers/NetHelper.cs +++ b/TreeConverter/NetWrappers/NetHelper.cs @@ -1060,7 +1060,9 @@ namespace PascalABCCompiler.NetHelper if (si.sym_info is common_namespace_function_node) { function_node fn = si.sym_info as function_node; - if (fn.return_value_type == to && fn.parameters.Count == 1 && fn.parameters[0].type == from) + if ((fn.return_value_type == to || fn.return_value_type.original_generic == to) && + fn.parameters.Count == 1 && + (fn.parameters[0].type == from || fn.parameters[0].type.original_generic == from)) { return fn; } diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 794e25f47..3d5b59cb1 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -12171,6 +12171,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 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) + compiled_type_node.get_type_node(typeof(Delegate)).Scope.AddSymbol(top_function.name, new SymbolInfo(context.top_function)); break; } default: diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index 7a20f3def..548a1f0ab 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -3398,6 +3398,17 @@ namespace PascalABCCompiler.TreeRealization fn = NetHelper.NetHelper.get_implicit_conversion(this, this, cctn, scope); if (fn is compiled_function_node) _implicit_convertions_to.Add(cctn, fn); + /*else if (_compiled_type.IsGenericType && !_compiled_type.IsGenericTypeDefinition) + { + compiled_type_node orig_generic = compiled_type_node.get_type_node(_compiled_type.GetGenericTypeDefinition()); + compiled_type_node orig_generic2 = compiled_type_node.get_type_node(cctn.compiled_type.GetGenericTypeDefinition()); + fn = NetHelper.NetHelper.get_implicit_conversion(orig_generic, orig_generic, orig_generic2, orig_generic.scope); + if (fn != null) + { + //fn = fn.get_instance(this.ge) + _implicit_convertions_to.Add(cctn, fn); + } + }*/ } return fn; @@ -4317,7 +4328,8 @@ namespace PascalABCCompiler.TreeRealization } } } - return null; + return compiled_type_node.get_type_node(typeof(Delegate)).find(name); + //return null; } public override SymbolInfo find_in_type(string name, SymbolTable.Scope CurrentScope) {