This commit is contained in:
Бондарев Иван 2017-03-02 20:27:17 +01:00
parent 594fe0833c
commit 22e529d3bd
7 changed files with 144 additions and 117 deletions

View file

@ -109,7 +109,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
} }
DomConverter dconv = new DomConverter(this); DomConverter dconv = new DomConverter(this);
if (cu != null) if (cu != null)
@ -144,7 +146,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
} }
if (cu != null) if (cu != null)
{ {

View file

@ -938,7 +938,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
} }
RestoreCurrentUsedAssemblies(); RestoreCurrentUsedAssemblies();
string description = ss.si.description; string description = ss.si.description;

View file

@ -60,6 +60,9 @@ namespace CodeCompletion
} }
catch(Exception e) catch(Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
throw e; throw e;
//System.Diagnostics.Debug.WriteLine(e.StackTrace); //System.Diagnostics.Debug.WriteLine(e.StackTrace);
} }
@ -225,6 +228,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
cnst_val.prim_val = null; cnst_val.prim_val = null;
ev.eval_stack.Clear(); ev.eval_stack.Clear();
returned_scope = null; returned_scope = null;
@ -491,8 +497,10 @@ namespace CodeCompletion
} }
catch(Exception e) catch(Exception e)
{ {
#if DEBUG
} File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
}
} }
public document doc; public document doc;
@ -2000,79 +2008,79 @@ namespace CodeCompletion
public override void visit(program_module _program_module) public override void visit(program_module _program_module)
{ {
//Assembly _as = System.Reflection.Assembly.LoadFrom(get_assembly_path("mscorlib.dll",_program_module.file_name)); //Assembly _as = System.Reflection.Assembly.LoadFrom(get_assembly_path("mscorlib.dll",_program_module.file_name));
string path = get_assembly_path("mscorlib.dll",_program_module.file_name); string path = get_assembly_path("mscorlib.dll", _program_module.file_name);
System.Reflection.Assembly _as = PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path); System.Reflection.Assembly _as = PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path);
List<string> namespaces = new List<string>(); List<string> namespaces = new List<string>();
PascalABCCompiler.NetHelper.NetHelper.init_namespaces(_as); PascalABCCompiler.NetHelper.NetHelper.init_namespaces(_as);
AssemblyDocCache.Load(_as,path); AssemblyDocCache.Load(_as, path);
namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(_as)); namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(_as));
//List<Scope> netScopes = new List<Scope>(); //List<Scope> netScopes = new List<Scope>();
//PascalABCCompiler.NetHelper.NetScope ns=new PascalABCCompiler.NetHelper.NetScope(unl,_as,tcst); //PascalABCCompiler.NetHelper.NetScope ns=new PascalABCCompiler.NetHelper.NetScope(unl,_as,tcst);
InterfaceUnitScope unit_scope = null; InterfaceUnitScope unit_scope = null;
cur_scope = unit_scope = new InterfaceUnitScope(new SymInfo("", SymbolKind.Namespace,"program"),null); cur_scope = unit_scope = new InterfaceUnitScope(new SymInfo("", SymbolKind.Namespace, "program"), null);
CodeCompletionController.comp_modules[_program_module.file_name] = this.converter; CodeCompletionController.comp_modules[_program_module.file_name] = this.converter;
Stack<Position> regions_stack = new Stack<Position>(); Stack<Position> regions_stack = new Stack<Position>();
if (CodeCompletionController.comp.CompilerOptions.CurrentProject != null && CodeCompletionController.comp.CompilerOptions.CurrentProject.ContainsSourceFile(_program_module.file_name)) if (CodeCompletionController.comp.CompilerOptions.CurrentProject != null && CodeCompletionController.comp.CompilerOptions.CurrentProject.ContainsSourceFile(_program_module.file_name))
{ {
IReferenceInfo[] refs = CodeCompletionController.comp.CompilerOptions.CurrentProject.References; IReferenceInfo[] refs = CodeCompletionController.comp.CompilerOptions.CurrentProject.References;
if (_program_module.compiler_directives == null) if (_program_module.compiler_directives == null)
_program_module.compiler_directives = new List<PascalABCCompiler.SyntaxTree.compiler_directive>(); _program_module.compiler_directives = new List<PascalABCCompiler.SyntaxTree.compiler_directive>();
foreach (IReferenceInfo ri in refs) foreach (IReferenceInfo ri in refs)
{ {
_program_module.compiler_directives.Add _program_module.compiler_directives.Add
(new PascalABCCompiler.SyntaxTree.compiler_directive(new token_info("reference"),new token_info(ri.FullAssemblyName))); (new PascalABCCompiler.SyntaxTree.compiler_directive(new token_info("reference"), new token_info(ri.FullAssemblyName)));
} }
} }
if (_program_module.compiler_directives != null) if (_program_module.compiler_directives != null)
foreach (PascalABCCompiler.SyntaxTree.compiler_directive dir in _program_module.compiler_directives) foreach (PascalABCCompiler.SyntaxTree.compiler_directive dir in _program_module.compiler_directives)
{
if (dir.Name.text.ToLower() == "reference")
{ {
try if (dir.Name.text.ToLower() == "reference")
{ {
//System.Reflection.Assembly assm = System.Reflection.Assembly.LoadFrom(get_assembly_path(dir.Directive.text,_program_module.file_name)); try
path = get_assembly_path(dir.Directive.text,_program_module.file_name);
System.Reflection.Assembly assm = PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path);
if (assm != null)
{ {
PascalABCCompiler.NetHelper.NetHelper.init_namespaces(assm); //System.Reflection.Assembly assm = System.Reflection.Assembly.LoadFrom(get_assembly_path(dir.Directive.text,_program_module.file_name));
AssemblyDocCache.Load(assm, path); path = get_assembly_path(dir.Directive.text, _program_module.file_name);
namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(assm)); System.Reflection.Assembly assm = PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path);
unit_scope.AddReferencedAssembly(assm); if (assm != null)
{
PascalABCCompiler.NetHelper.NetHelper.init_namespaces(assm);
AssemblyDocCache.Load(assm, path);
namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(assm));
unit_scope.AddReferencedAssembly(assm);
}
}
catch (Exception e)
{
} }
} }
catch (Exception e) else
if (dir.Name.text.ToLower() == "region")
{ {
if (cur_scope.regions == null)
cur_scope.regions = new List<Position>();
regions_stack.Push(new Position(dir.source_context.begin_position.line_num, dir.source_context.begin_position.column_num, dir.source_context.end_position.line_num, dir.source_context.end_position.column_num, dir.source_context.FileName));
}
else if (dir.Name.text.ToLower() == "endregion")
{
if (regions_stack.Count > 0)
{
Position pos = regions_stack.Pop();
if (cur_scope.regions != null)
{
cur_scope.regions.Add(new Position(pos.end_line, pos.end_column, dir.source_context.end_position.line_num, dir.source_context.end_position.column_num, pos.file_name));
}
}
} }
} }
else
if (dir.Name.text.ToLower() == "region")
{
if (cur_scope.regions == null)
cur_scope.regions = new List<Position>();
regions_stack.Push(new Position(dir.source_context.begin_position.line_num,dir.source_context.begin_position.column_num,dir.source_context.end_position.line_num,dir.source_context.end_position.column_num,dir.source_context.FileName));
}
else if (dir.Name.text.ToLower() == "endregion")
{
if (regions_stack.Count > 0)
{
Position pos = regions_stack.Pop();
if (cur_scope.regions != null)
{
cur_scope.regions.Add(new Position(pos.end_line,pos.end_column,dir.source_context.end_position.line_num,dir.source_context.end_position.column_num,pos.file_name));
}
}
}
}
doc = new document(_program_module.file_name); doc = new document(_program_module.file_name);
cur_scope.loc = get_location(_program_module); cur_scope.loc = get_location(_program_module);
entry_scope = cur_scope; entry_scope = cur_scope;
if (_program_module.program_name != null) if (_program_module.program_name != null)
cur_scope.head_loc = get_location(_program_module.program_name); cur_scope.head_loc = get_location(_program_module.program_name);
Hashtable ns_cache = new Hashtable(StringComparer.CurrentCultureIgnoreCase); Hashtable ns_cache = new Hashtable(StringComparer.CurrentCultureIgnoreCase);
bool has_system_unit = false; bool has_system_unit = false;
bool has_extensions_unit = false; bool has_extensions_unit = false;
@ -2168,41 +2176,43 @@ namespace CodeCompletion
} }
if (!has_system_unit) if (!has_system_unit)
add_system_unit(); add_system_unit();
if (!has_extensions_unit) if (!has_extensions_unit)
add_extensions_unit(); add_extensions_unit();
foreach (string s in namespaces) foreach (string s in namespaces)
{ {
if (!ns_cache.ContainsKey(s)) if (!ns_cache.ContainsKey(s))
{ {
NamespaceScope ns_scope = new NamespaceScope(s); NamespaceScope ns_scope = new NamespaceScope(s);
cur_scope.AddName(s,ns_scope); cur_scope.AddName(s, ns_scope);
ns_cache[s] = s; ns_cache[s] = s;
} }
} }
//PascalABCCompiler.TreeRealization.common_type_node ctn = new ; //PascalABCCompiler.TreeRealization.common_type_node ctn = new ;
if (_program_module.program_block.defs != null) if (_program_module.program_block.defs != null)
foreach (declaration decl in _program_module.program_block.defs.defs) foreach (declaration decl in _program_module.program_block.defs.defs)
{
try
{
decl.visit(this);
}
catch (Exception e)
{
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
}
}
if (_program_module.program_block.program_code != null)
{ {
try cur_scope.body_loc = new location(_program_module.program_block.program_code.left_logical_bracket.source_context.end_position.line_num,
{ _program_module.program_block.program_code.left_logical_bracket.source_context.end_position.column_num,
decl.visit(this); _program_module.program_block.program_code.source_context.end_position.line_num, _program_module.program_block.program_code.source_context.end_position.column_num,
} doc);
catch(Exception e) _program_module.program_block.program_code.visit(this);
{
}
} }
if (_program_module.program_block.program_code != null)
{
cur_scope.body_loc = new location(_program_module.program_block.program_code.left_logical_bracket.source_context.end_position.line_num,
_program_module.program_block.program_code.left_logical_bracket.source_context.end_position.column_num,
_program_module.program_block.program_code.source_context.end_position.line_num,_program_module.program_block.program_code.source_context.end_position.column_num,
doc);
_program_module.program_block.program_code.visit(this);
}
} }
private void add_standart_types(SymScope cur_scope) private void add_standart_types(SymScope cur_scope)
@ -2393,13 +2403,16 @@ namespace CodeCompletion
if (returned_scope is ProcScope) if (returned_scope is ProcScope)
ts = (returned_scope as ProcScope).return_type; ts = (returned_scope as ProcScope).return_type;
returned_scopes = returned_scope.FindOverloadNamesOnlyInType((_dot_node.right as ident).name); returned_scopes = returned_scope.FindOverloadNamesOnlyInType((_dot_node.right as ident).name);
List<ProcScope> meths = entry_scope.GetExtensionMethods((_dot_node.right as ident).name, ts); if (ts != null)
if (meths.Count > 0)
{ {
if (returned_scopes == null) List<ProcScope> meths = entry_scope.GetExtensionMethods((_dot_node.right as ident).name, ts);
returned_scopes = new List<SymScope>(); if (meths.Count > 0)
foreach (ProcScope meth in meths) {
returned_scopes.Add(meth); if (returned_scopes == null)
returned_scopes = new List<SymScope>();
foreach (ProcScope meth in meths)
returned_scopes.Add(meth);
}
} }
search_all = false; search_all = false;
} }
@ -3687,7 +3700,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
} }
} }
} }
@ -3712,6 +3727,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
cur_scope = impl_scope; cur_scope = impl_scope;
} }
} }
@ -3887,13 +3905,12 @@ namespace CodeCompletion
public override void visit(exception_block _exception_block) public override void visit(exception_block _exception_block)
{ {
//throw new Exception("The method or operation is not implemented.");
if (_exception_block.handlers != null) if (_exception_block.handlers != null)
_exception_block.handlers.visit(this); _exception_block.handlers.visit(this);
if (_exception_block.stmt_list != null) if (_exception_block.stmt_list != null)
_exception_block.stmt_list.visit(this); _exception_block.stmt_list.visit(this);
if (_exception_block.else_stmt_list != null) if (_exception_block.else_stmt_list != null)
_exception_block.else_stmt_list.visit(this); _exception_block.else_stmt_list.visit(this);
} }
public override void visit(try_handler _try_handler) public override void visit(try_handler _try_handler)
@ -3903,23 +3920,20 @@ namespace CodeCompletion
public override void visit(try_handler_finally _try_handler_finally) public override void visit(try_handler_finally _try_handler_finally)
{ {
//throw new Exception("The method or operation is not implemented.");
_try_handler_finally.stmt_list.visit(this); _try_handler_finally.stmt_list.visit(this);
} }
public override void visit(try_handler_except _try_handler_except) public override void visit(try_handler_except _try_handler_except)
{ {
//throw new Exception("The method or operation is not implemented.");
_try_handler_except.except_block.visit(this); _try_handler_except.except_block.visit(this);
} }
public override void visit(try_stmt _try_stmt) public override void visit(try_stmt _try_stmt)
{ {
//throw new Exception("The method or operation is not implemented.");
if (_try_stmt.stmt_list != null) if (_try_stmt.stmt_list != null)
_try_stmt.stmt_list.visit(this); _try_stmt.stmt_list.visit(this);
if (_try_stmt.handler != null) if (_try_stmt.handler != null)
_try_stmt.handler.visit(this); _try_stmt.handler.visit(this);
} }
public override void visit(inherited_message _inherited_message) public override void visit(inherited_message _inherited_message)
@ -3997,7 +4011,6 @@ namespace CodeCompletion
public override void visit(template_type_reference _template_type_reference) public override void visit(template_type_reference _template_type_reference)
{ {
//throw new Exception("The method or operation is not implemented.");
returned_scope = null; returned_scope = null;
converted_template_type = _template_type_reference; converted_template_type = _template_type_reference;
_template_type_reference.name.visit(this); _template_type_reference.name.visit(this);
@ -4264,7 +4277,9 @@ namespace CodeCompletion
} }
catch (Exception e) catch (Exception e)
{ {
#if DEBUG
File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine);
#endif
} }
} }
} }

View file

@ -4852,7 +4852,8 @@ namespace CodeCompletion
if (lst[0].instances != null && lst[0].instances.Count > 0) if (lst[0].instances != null && lst[0].instances.Count > 0)
lst[0] = lst[0].instances[0]; lst[0] = lst[0].instances[0];
sc.instances.Add(this.instances[i].GetInstance(lst)); sc.instances.Add(this.instances[i].GetInstance(lst));
sc.generic_params.Add(gen_args[i].si.name); if (i < gen_args.Count)
sc.generic_params.Add(gen_args[i].si.name);
} }
else else
{ {
@ -4861,11 +4862,13 @@ namespace CodeCompletion
List<TypeScope> lst = new List<TypeScope>(); List<TypeScope> lst = new List<TypeScope>();
lst.Add(gen_args[i].elementType); lst.Add(gen_args[i].elementType);
sc.instances.Add(this.instances[i].GetInstance(lst)); sc.instances.Add(this.instances[i].GetInstance(lst));
sc.generic_params.Add(gen_args[i].elementType.si.name); if (i < gen_args.Count)
sc.generic_params.Add(gen_args[i].elementType.si.name);
} }
else else
{ {
sc.generic_params.Add(gen_args[i].si.name); if (i < gen_args.Count)
sc.generic_params.Add(gen_args[i].si.name);
sc.instances.Add(this.instances[i].GetInstance(gen_args)); sc.instances.Add(this.instances[i].GetInstance(gen_args));
} }
@ -4874,7 +4877,8 @@ namespace CodeCompletion
else else
for (int i = 0; i < gen_args.Count; i++) for (int i = 0; i < gen_args.Count; i++)
{ {
sc.generic_params.Add(gen_args[i].si.name); if (i < gen_args.Count)
sc.generic_params.Add(gen_args[i].si.name);
sc.instances.Add(gen_args[i]); sc.instances.Add(gen_args[i]);
} }
sc.si.description = sc.GetDescription(); sc.si.description = sc.GetDescription();

View file

@ -356,7 +356,7 @@
</Node> </Node>
<Node Name="Реализуем (var a, var b) := (1,2)" NL="0" NG="0"> <Node Name="Реализуем (var a, var b) := (1,2)" NL="0" NG="0">
<Items> <Items>
<Node ID="visit" Name="visit(SyntaxTree.assign_var_tuple" NL="0,9414063" NG="-1"> <Node Name="visit(SyntaxTree.assign_var_tuple" NL="0,9414063" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<Text>public override void visit(SyntaxTree.assign_var_tuple assvartup) // сахарный узел</Text> <Text>public override void visit(SyntaxTree.assign_var_tuple assvartup) // сахарный узел</Text>
<OCtx> <OCtx>
@ -367,7 +367,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="for (var i=0; i&lt;_statement_list.subnodes.Count" NL="0,9306641" NG="-1"> <Node Name="for (var i=0; i&lt;_statement_list.subnodes.Count" NL="0,9306641" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">public override void visit ( SyntaxTree . statement_list _statement_list )</i> <i Type="Method">public override void visit ( SyntaxTree . statement_list _statement_list )</i>
@ -377,7 +377,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="Проверка на labelled_statement" NL="0,9423828" NG="-1"> <Node Name="Проверка на labelled_statement" NL="0,9423828" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">public override void visit ( SyntaxTree . labeled_statement _labeled_statement )</i> <i Type="Method">public override void visit ( SyntaxTree . labeled_statement _labeled_statement )</i>
@ -387,7 +387,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="convert_strong" Name="convert_strong" NL="0,8408203" NG="-1"> <Node Name="convert_strong" NL="0,8408203" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<Text>internal expression_node convert_strong(SyntaxTree.expression expr)</Text> <Text>internal expression_node convert_strong(SyntaxTree.expression expr)</Text>
<OCtx> <OCtx>
@ -398,7 +398,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="LambdaProcessingState.TypeInferencePhase" NL="0,9238281" NG="-1"> <Node Name="LambdaProcessingState.TypeInferencePhase" NL="0,9238281" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<Text>case LambdaProcessingState.TypeInferencePhase:</Text> <Text>case LambdaProcessingState.TypeInferencePhase:</Text>
<OCtx> <OCtx>
@ -476,7 +476,7 @@
</Node> </Node>
<Node Name="foreach" NL="0" NG="0"> <Node Name="foreach" NL="0" NG="0">
<Items> <Items>
<Node ID="visit" Name="visit(foreach_stmt" NL="0,9033203" NG="-1"> <Node Name="visit(foreach_stmt" NL="0,9033203" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">public override void visit ( SyntaxTree . foreach_stmt _foreach_stmt )</i> <i Type="Method">public override void visit ( SyntaxTree . foreach_stmt _foreach_stmt )</i>
@ -893,7 +893,7 @@
</Node> </Node>
<Node Name="Преобразование синт дерева" NL="0" NG="0"> <Node Name="Преобразование синт дерева" NL="0" NG="0">
<Items> <Items>
<Node ID="CompileUnit" Name="Вызов Convert контроллера SyntaxTrees" NL="0,7451172" NG="0,5644531"> <Node Name="Вызов Convert контроллера SyntaxTrees" NL="0,7451172" NG="0,5644531">
<FileName>\Compiler\Compiler.cs</FileName> <FileName>\Compiler\Compiler.cs</FileName>
<Text>CurrentUnit.SyntaxTree = syntaxTreeConvertersController.Convert(CurrentUnit.SyntaxTree) as SyntaxTree.compilation_unit;</Text> <Text>CurrentUnit.SyntaxTree = syntaxTreeConvertersController.Convert(CurrentUnit.SyntaxTree) as SyntaxTree.compilation_unit;</Text>
<OCtx> <OCtx>
@ -1274,7 +1274,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="Обработка auto_type в assign_node" NL="0,8925781" NG="-1"> <Node Name="Обработка auto_type в assign_node" NL="0,8925781" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<Note>Обработка auto_type в assign_node</Note> <Note>Обработка auto_type в assign_node</Note>
<Text>if (to.type is auto_type)</Text> <Text>if (to.type is auto_type)</Text>
@ -1286,7 +1286,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="visit(SyntaxTree.yield_unknown_expression_type" NL="0,9160156" NG="-1"> <Node Name="visit(SyntaxTree.yield_unknown_expression_type" NL="0,9160156" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<Text>public override void visit(SyntaxTree.yield_unknown_expression_type _unk_expr)</Text> <Text>public override void visit(SyntaxTree.yield_unknown_expression_type _unk_expr)</Text>
<OCtx> <OCtx>
@ -1364,7 +1364,7 @@
</Node> </Node>
<Node Name="[::]" NL="0" NG="0"> <Node Name="[::]" NL="0" NG="0">
<Items> <Items>
<Node ID="visit" Name="visit(slice_expr" NL="0,9521484" NG="-1"> <Node Name="visit(slice_expr" NL="0,9521484" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">public override void visit ( SyntaxTree . slice_expr sl )</i> <i Type="Method">public override void visit ( SyntaxTree . slice_expr sl )</i>
@ -1374,7 +1374,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="visit" Name="visit(slice_expr_question" NL="0,9521484" NG="-1"> <Node Name="visit(slice_expr_question" NL="0,9521484" NG="-1">
<FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName> <FileName>\TreeConverter\TreeConversion\syntax_tree_visitor.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">public override void visit ( SyntaxTree . slice_expr_question sl )</i> <i Type="Method">public override void visit ( SyntaxTree . slice_expr_question sl )</i>
@ -1414,7 +1414,7 @@
</Node> </Node>
<Node Name="Ядро преобраз-я синт. деревьев" NL="0" NG="0"> <Node Name="Ядро преобраз-я синт. деревьев" NL="0" NG="0">
<Items> <Items>
<Node ID="StandardSyntaxTreeConverter" Name="StandardSyntaxTreeConverter" NL="-1" NG="0,2734375"> <Node Name="StandardSyntaxTreeConverter" NL="-1" NG="0,2734375">
<FileName>\standardsyntaxtreeconverter\standardsyntaxconverter.cs</FileName> <FileName>\standardsyntaxtreeconverter\standardsyntaxconverter.cs</FileName>
<OCtx> <OCtx>
<i Type="ClassOrNamespace">public class StandardSyntaxTreeConverter : ISyntaxTreeConverter</i> <i Type="ClassOrNamespace">public class StandardSyntaxTreeConverter : ISyntaxTreeConverter</i>
@ -1439,7 +1439,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="AddConverters" Name="AddConverters() - semantic" NL="0,6904297" NG="-1"> <Node Name="AddConverters() - semantic" NL="0,6904297" NG="-1">
<FileName>\compiler\semantictreeconverters\semantictreeconverterscontroller.cs</FileName> <FileName>\compiler\semantictreeconverters\semantictreeconverterscontroller.cs</FileName>
<OCtx> <OCtx>
<i Type="Method">private void AddConverters ( string DirectoryName )</i> <i Type="Method">private void AddConverters ( string DirectoryName )</i>
@ -1449,7 +1449,7 @@
</i> </i>
</OCtx> </OCtx>
</Node> </Node>
<Node ID="AddConverters" Name="AddConverters() - syntax" NL="0,6904297" NG="-1"> <Node Name="AddConverters() - syntax" NL="0,6904297" NG="-1">
<FileName>\Compiler\SyntaxTreeConvertersController\SyntaxTreeConvertersController.cs</FileName> <FileName>\Compiler\SyntaxTreeConvertersController\SyntaxTreeConvertersController.cs</FileName>
<Text>private void AddConverters(string DirectoryName)</Text> <Text>private void AddConverters(string DirectoryName)</Text>
<OCtx> <OCtx>

View file

@ -1186,7 +1186,7 @@ namespace PascalABCCompiler.TreeConverter
} }
//if (si == null) //if (si == null)
{ {
if (/*si2 == null && */left_type.semantic_node_type == semantic_node_type.delegated_method && right_type.semantic_node_type == semantic_node_type.delegated_method) if (left_type.semantic_node_type == semantic_node_type.delegated_method && right_type.semantic_node_type == semantic_node_type.delegated_method)
{ {
SymbolInfo saved_si = si; SymbolInfo saved_si = si;
SymbolInfo saved_si2 = si2; SymbolInfo saved_si2 = si2;

View file

@ -1003,6 +1003,8 @@ namespace PascalABCCompiler.TreeRealization
if (deduced[par_num] == null) if (deduced[par_num] == null)
{ {
//Этот тип-параметр ещё не был выведен. //Этот тип-параметр ещё не был выведен.
if (fact_type is delegated_methods && (fact_type as delegated_methods).empty_param_method != null && (fact_type as delegated_methods).empty_param_method.ret_type != null)
fact_type = (fact_type as delegated_methods).empty_param_method.ret_type;
deduced[par_num] = fact_type; deduced[par_num] = fact_type;
return true; return true;
} }