From 22e529d3bd0fc41c1ea3dfaa9efdad920f5749ee 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: Thu, 2 Mar 2017 20:27:17 +0100 Subject: [PATCH] bug fix #360 --- CodeCompletion/CodeCompletion.cs | 8 +- CodeCompletion/DomConverter.cs | 4 +- CodeCompletion/DomSyntaxTreeVisitor.cs | 205 ++++++++++-------- CodeCompletion/SymTable.cs | 12 +- PascalABCNET.axml | 28 +-- .../TreeConversion/syntax_tree_visitor.cs | 2 +- TreeConverter/TreeRealization/generics.cs | 2 + 7 files changed, 144 insertions(+), 117 deletions(-) diff --git a/CodeCompletion/CodeCompletion.cs b/CodeCompletion/CodeCompletion.cs index 1fbb4e1be..f6e60d1e9 100644 --- a/CodeCompletion/CodeCompletion.cs +++ b/CodeCompletion/CodeCompletion.cs @@ -109,7 +109,9 @@ namespace CodeCompletion } catch (Exception e) { - +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif } DomConverter dconv = new DomConverter(this); if (cu != null) @@ -144,7 +146,9 @@ namespace CodeCompletion } catch (Exception e) { - +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif } if (cu != null) { diff --git a/CodeCompletion/DomConverter.cs b/CodeCompletion/DomConverter.cs index 28b6faca1..738e30aee 100644 --- a/CodeCompletion/DomConverter.cs +++ b/CodeCompletion/DomConverter.cs @@ -938,7 +938,9 @@ namespace CodeCompletion } catch (Exception e) { - +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif } RestoreCurrentUsedAssemblies(); string description = ss.si.description; diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs index 9e46ade8f..81460118f 100644 --- a/CodeCompletion/DomSyntaxTreeVisitor.cs +++ b/CodeCompletion/DomSyntaxTreeVisitor.cs @@ -60,6 +60,9 @@ namespace CodeCompletion } catch(Exception e) { +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif throw e; //System.Diagnostics.Debug.WriteLine(e.StackTrace); } @@ -225,6 +228,9 @@ namespace CodeCompletion } catch (Exception e) { +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif cnst_val.prim_val = null; ev.eval_stack.Clear(); returned_scope = null; @@ -491,8 +497,10 @@ namespace CodeCompletion } catch(Exception e) { - - } +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif + } } public document doc; @@ -2000,79 +2008,79 @@ namespace CodeCompletion public override void visit(program_module _program_module) { //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); List namespaces = new List(); PascalABCCompiler.NetHelper.NetHelper.init_namespaces(_as); - AssemblyDocCache.Load(_as,path); - + AssemblyDocCache.Load(_as, path); + namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(_as)); //List netScopes = new List(); //PascalABCCompiler.NetHelper.NetScope ns=new PascalABCCompiler.NetHelper.NetScope(unl,_as,tcst); 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; Stack regions_stack = new Stack(); if (CodeCompletionController.comp.CompilerOptions.CurrentProject != null && CodeCompletionController.comp.CompilerOptions.CurrentProject.ContainsSourceFile(_program_module.file_name)) { - IReferenceInfo[] refs = CodeCompletionController.comp.CompilerOptions.CurrentProject.References; - if (_program_module.compiler_directives == null) - _program_module.compiler_directives = new List(); - foreach (IReferenceInfo ri in refs) - { - _program_module.compiler_directives.Add - (new PascalABCCompiler.SyntaxTree.compiler_directive(new token_info("reference"),new token_info(ri.FullAssemblyName))); - } + IReferenceInfo[] refs = CodeCompletionController.comp.CompilerOptions.CurrentProject.References; + if (_program_module.compiler_directives == null) + _program_module.compiler_directives = new List(); + foreach (IReferenceInfo ri in refs) + { + _program_module.compiler_directives.Add + (new PascalABCCompiler.SyntaxTree.compiler_directive(new token_info("reference"), new token_info(ri.FullAssemblyName))); + } } if (_program_module.compiler_directives != null) - foreach (PascalABCCompiler.SyntaxTree.compiler_directive dir in _program_module.compiler_directives) - { - if (dir.Name.text.ToLower() == "reference") + foreach (PascalABCCompiler.SyntaxTree.compiler_directive dir in _program_module.compiler_directives) { - 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)); - path = get_assembly_path(dir.Directive.text,_program_module.file_name); - System.Reflection.Assembly assm = PascalABCCompiler.NetHelper.NetHelper.LoadAssembly(path); - if (assm != null) + try { - PascalABCCompiler.NetHelper.NetHelper.init_namespaces(assm); - AssemblyDocCache.Load(assm, path); - namespaces.AddRange(PascalABCCompiler.NetHelper.NetHelper.GetNamespaces(assm)); - unit_scope.AddReferencedAssembly(assm); + //System.Reflection.Assembly assm = System.Reflection.Assembly.LoadFrom(get_assembly_path(dir.Directive.text,_program_module.file_name)); + 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); + 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(); + 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(); - 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); cur_scope.loc = get_location(_program_module); entry_scope = cur_scope; 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); bool has_system_unit = false; bool has_extensions_unit = false; @@ -2168,41 +2176,43 @@ namespace CodeCompletion } if (!has_system_unit) add_system_unit(); - + if (!has_extensions_unit) add_extensions_unit(); foreach (string s in namespaces) { - if (!ns_cache.ContainsKey(s)) - { - NamespaceScope ns_scope = new NamespaceScope(s); - cur_scope.AddName(s,ns_scope); + if (!ns_cache.ContainsKey(s)) + { + NamespaceScope ns_scope = new NamespaceScope(s); + cur_scope.AddName(s, ns_scope); ns_cache[s] = s; - } + } } - - //PascalABCCompiler.TreeRealization.common_type_node ctn = new ; - if (_program_module.program_block.defs != null) - foreach (declaration decl in _program_module.program_block.defs.defs) + + //PascalABCCompiler.TreeRealization.common_type_node ctn = new ; + if (_program_module.program_block.defs != null) + 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 - { - decl.visit(this); - } - catch(Exception e) - { - - } + 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); } - 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) @@ -2393,13 +2403,16 @@ namespace CodeCompletion if (returned_scope is ProcScope) ts = (returned_scope as ProcScope).return_type; returned_scopes = returned_scope.FindOverloadNamesOnlyInType((_dot_node.right as ident).name); - List meths = entry_scope.GetExtensionMethods((_dot_node.right as ident).name, ts); - if (meths.Count > 0) + if (ts != null) { - if (returned_scopes == null) - returned_scopes = new List(); - foreach (ProcScope meth in meths) - returned_scopes.Add(meth); + List meths = entry_scope.GetExtensionMethods((_dot_node.right as ident).name, ts); + if (meths.Count > 0) + { + if (returned_scopes == null) + returned_scopes = new List(); + foreach (ProcScope meth in meths) + returned_scopes.Add(meth); + } } search_all = false; } @@ -3687,7 +3700,9 @@ namespace CodeCompletion } 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) { +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif cur_scope = impl_scope; } } @@ -3887,13 +3905,12 @@ namespace CodeCompletion public override void visit(exception_block _exception_block) { - //throw new Exception("The method or operation is not implemented."); if (_exception_block.handlers != null) - _exception_block.handlers.visit(this); + _exception_block.handlers.visit(this); if (_exception_block.stmt_list != null) - _exception_block.stmt_list.visit(this); - if (_exception_block.else_stmt_list != null) - _exception_block.else_stmt_list.visit(this); + _exception_block.stmt_list.visit(this); + if (_exception_block.else_stmt_list != null) + _exception_block.else_stmt_list.visit(this); } public override void visit(try_handler _try_handler) @@ -3903,23 +3920,20 @@ namespace CodeCompletion 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); } 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); } public override void visit(try_stmt _try_stmt) { - //throw new Exception("The method or operation is not implemented."); if (_try_stmt.stmt_list != null) - _try_stmt.stmt_list.visit(this); + _try_stmt.stmt_list.visit(this); if (_try_stmt.handler != null) - _try_stmt.handler.visit(this); + _try_stmt.handler.visit(this); } public override void visit(inherited_message _inherited_message) @@ -3997,7 +4011,6 @@ namespace CodeCompletion public override void visit(template_type_reference _template_type_reference) { - //throw new Exception("The method or operation is not implemented."); returned_scope = null; converted_template_type = _template_type_reference; _template_type_reference.name.visit(this); @@ -4264,7 +4277,9 @@ namespace CodeCompletion } catch (Exception e) { - +#if DEBUG + File.AppendAllText("log.txt", e.Message + Environment.NewLine + e.StackTrace + Environment.NewLine); +#endif } } } diff --git a/CodeCompletion/SymTable.cs b/CodeCompletion/SymTable.cs index 511c62da3..dcce4beb1 100644 --- a/CodeCompletion/SymTable.cs +++ b/CodeCompletion/SymTable.cs @@ -4852,7 +4852,8 @@ namespace CodeCompletion if (lst[0].instances != null && lst[0].instances.Count > 0) lst[0] = lst[0].instances[0]; 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 { @@ -4861,11 +4862,13 @@ namespace CodeCompletion List lst = new List(); lst.Add(gen_args[i].elementType); 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 { - 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)); } @@ -4874,7 +4877,8 @@ namespace CodeCompletion else 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.si.description = sc.GetDescription(); diff --git a/PascalABCNET.axml b/PascalABCNET.axml index 0fb00bb55..819d4e37a 100644 --- a/PascalABCNET.axml +++ b/PascalABCNET.axml @@ -356,7 +356,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.assign_var_tuple assvartup) // сахарный узел @@ -367,7 +367,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . statement_list _statement_list ) @@ -377,7 +377,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . labeled_statement _labeled_statement ) @@ -387,7 +387,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs internal expression_node convert_strong(SyntaxTree.expression expr) @@ -398,7 +398,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs case LambdaProcessingState.TypeInferencePhase: @@ -476,7 +476,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . foreach_stmt _foreach_stmt ) @@ -893,7 +893,7 @@ - + \Compiler\Compiler.cs CurrentUnit.SyntaxTree = syntaxTreeConvertersController.Convert(CurrentUnit.SyntaxTree) as SyntaxTree.compilation_unit; @@ -1274,7 +1274,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs Обработка auto_type в assign_node if (to.type is auto_type) @@ -1286,7 +1286,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit(SyntaxTree.yield_unknown_expression_type _unk_expr) @@ -1364,7 +1364,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . slice_expr sl ) @@ -1374,7 +1374,7 @@ - + \TreeConverter\TreeConversion\syntax_tree_visitor.cs public override void visit ( SyntaxTree . slice_expr_question sl ) @@ -1414,7 +1414,7 @@ - + \standardsyntaxtreeconverter\standardsyntaxconverter.cs public class StandardSyntaxTreeConverter : ISyntaxTreeConverter @@ -1439,7 +1439,7 @@ - + \compiler\semantictreeconverters\semantictreeconverterscontroller.cs private void AddConverters ( string DirectoryName ) @@ -1449,7 +1449,7 @@ - + \Compiler\SyntaxTreeConvertersController\SyntaxTreeConvertersController.cs private void AddConverters(string DirectoryName) diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index b31202763..0ffe65271 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -1186,7 +1186,7 @@ namespace PascalABCCompiler.TreeConverter } //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_si2 = si2; diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 707c8f21b..909e52f55 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1003,6 +1003,8 @@ namespace PascalABCCompiler.TreeRealization 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; return true; }