From a941b3ebba2000e2d91d7ae8d2c3115de2b05b7a 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, 19 Feb 2017 21:20:56 +0100 Subject: [PATCH] bug fix #349 --- CodeCompletion/DomSyntaxTreeVisitor.cs | 37 +++++++--- CodeCompletion/SymTable.cs | 98 +++++++++----------------- Compiler/PCU/PCUReader.cs | 9 +++ 3 files changed, 69 insertions(+), 75 deletions(-) diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs index 17606d33e..9e46ade8f 100644 --- a/CodeCompletion/DomSyntaxTreeVisitor.cs +++ b/CodeCompletion/DomSyntaxTreeVisitor.cs @@ -2577,11 +2577,15 @@ namespace CodeCompletion return false; } } - - private ProcScope select_method(SymScope[] procs, TypeScope tleft, TypeScope tright, TypeScope obj, params expression[] args) + + private SymScope[] selected_methods = null; + + private ProcScope select_method(SymScope[] meths, TypeScope tleft, TypeScope tright, TypeScope obj, params expression[] args) { List arg_types = new List(); List arg_types2 = new List(); + SymScope[] saved_selected_methods = selected_methods; + selected_methods = meths; if (tleft != null || tright != null) { if (tleft != null) @@ -2605,18 +2609,19 @@ namespace CodeCompletion arg_types2.Add(returned_scope as TypeScope); } } + selected_methods = saved_selected_methods; List good_procs = new List(); - for (int i=0; i 1) @@ -4401,7 +4406,19 @@ namespace CodeCompletion if (_function_lambda_definition.ident_list != null) foreach (ident id in _function_lambda_definition.ident_list.idents) { - ElementScope es = new ElementScope(new SymInfo(id.name, SymbolKind.Parameter, ""), new UnknownScope(new SymInfo("T", SymbolKind.Type, "T")), ps); + TypeScope param_type = new UnknownScope(new SymInfo("T", SymbolKind.Type, "T")); + /*if (selected_methods != null) + { + foreach (ProcScope meth in selected_methods) + { + if (meth.parameters != null && meth.parameters.Count > 0 && (meth.parameters[1].sc as TypeScope).IsDelegate + && (meth.parameters[1].sc as TypeScope).IsGeneric) + { + + } + } + }*/ + ElementScope es = new ElementScope(new SymInfo(id.name, SymbolKind.Parameter, ""), param_type, ps); ps.AddName(id.name, es); ps.AddParameter(es); es.loc = get_location(id); diff --git a/CodeCompletion/SymTable.cs b/CodeCompletion/SymTable.cs index 1e7f9c8cf..511c62da3 100644 --- a/CodeCompletion/SymTable.cs +++ b/CodeCompletion/SymTable.cs @@ -671,11 +671,6 @@ namespace CodeCompletion { //SortedDictionary dict = new SortedDictionary(); List lst = new List(); - /*foreach (string s in ht.Keys) - { - SymScope sc = ht[s] as SymScope; - if (sc != this) lst.Add(sc.si); - }*/ foreach (SymScope ss in members) { if (ss != this && !ss.si.name.StartsWith("$")) @@ -706,11 +701,6 @@ namespace CodeCompletion public virtual SymInfo[] GetNamesInAllTopScopes(bool all_names, ExpressionVisitor ev, bool is_static) { List lst = new List(); - /*foreach (string s in ht.Keys) - { - SymScope sc = ht[s] as SymScope; - lst.Add(sc.si); - }*/ foreach (SymScope ss in members) { if (ss != this && !ss.si.name.StartsWith("$")) @@ -927,10 +917,6 @@ namespace CodeCompletion sc = used_units[i].FindNameOnlyInType(name); if (sc != null) return sc; } - //Type t = PascalABCCompiler.NetHelper.NetHelper.FindType(name,unl); - //if (t != null && !t.IsNested) return new CompiledScope(new SymInfo(t.Name, SymbolKind.Type,t.FullName),t); - //if (PascalABCCompiler.NetHelper.NetHelper.IsNetNamespace(name)) - // return new NamespaceScope(name); return null; } @@ -963,10 +949,6 @@ namespace CodeCompletion sc = used_units[i].FindNameOnlyInType(name); if (sc != null) return sc; } - //Type t = PascalABCCompiler.NetHelper.NetHelper.FindType(name,unl); - //if (t != null && !t.IsNested) return new CompiledScope(new SymInfo(t.Name, SymbolKind.Type,t.FullName),t); - //if (PascalABCCompiler.NetHelper.NetHelper.IsNetNamespace(name)) - // return new NamespaceScope(name); return null; } } @@ -1138,11 +1120,6 @@ namespace CodeCompletion if (sc != null) return sc; } if (topScope != null) return topScope.FindName(name); - - //Type t = PascalABCCompiler.NetHelper.NetHelper.FindType(name,unl); - //if (t != null && !t.IsNested) return new CompiledScope(new SymInfo(t.Name, SymbolKind.Type,t.FullName),t); - //if (PascalABCCompiler.NetHelper.NetHelper.IsNetNamespace(name)) - // return new NamespaceScope(name); return null; } } @@ -1615,6 +1592,14 @@ namespace CodeCompletion } } + public override bool IsDelegate + { + get + { + return true; + } + } + public override PascalABCCompiler.Parsers.SymbolKind ElemKind { get { return PascalABCCompiler.Parsers.SymbolKind.Delegate; } @@ -2145,14 +2130,6 @@ namespace CodeCompletion public override bool IsEqual(SymScope ts) { - /*ProcScope ps = ts as ProcScope; - if (ps == null) return false; - if (ps is ProcRealization) ps = (ps as ProcRealization).def_proc; - if (this == ps) return true; - if (equal_parameters_and_result(ps)) - return true; - if (ps.nextProc != null) return IsEqual(ps.nextProc); - return false;*/ ProcScope ps = ts as ProcScope; if (ps == null) return false; if (ps is ProcRealization) ps = (ps as ProcRealization).def_proc; @@ -2445,12 +2422,6 @@ namespace CodeCompletion return null; } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // //SortedDictionary dict = new SortedDictionary(); - // return new SymInfo[0]; - // } - public override SymInfo[] GetNamesAsInObject() { //SortedDictionary dict = new SortedDictionary(); @@ -2695,11 +2666,6 @@ namespace CodeCompletion return actType.GetConstructors(search_in_base); } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // return actType.GetNamesAsInObject(ev); - // } - public override SymInfo[] GetNamesAsInObject(ExpressionVisitor ev) { return actType.GetNamesAsInObject(ev); @@ -2862,11 +2828,6 @@ namespace CodeCompletion return actType.GetConstructors(search_in_base); } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // return actType.GetNamesAsInObject(ev); - // } - public override SymInfo[] GetNamesAsInObject(ExpressionVisitor ev) { return actType.GetNamesAsInObject(ev); @@ -3068,12 +3029,6 @@ namespace CodeCompletion } return syms; } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // if (is_dynamic_arr) - // return base.GetNames(ev); - // return new SymInfo[0]; - // } public override SymScope FindName(string name) { @@ -3269,11 +3224,6 @@ namespace CodeCompletion return new SymInfo[0]; } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // //SortedDictionary dict = new SortedDictionary(); - // return new SymInfo[0]; - // } public override SymInfo[] GetNamesAsInObject(ExpressionVisitor ev) { @@ -3393,12 +3343,6 @@ namespace CodeCompletion return new SymInfo[0]; } - // public override SymInfo[] GetNames(ExpressionVisitor ev) - // { - // //SortedDictionary dict = new SortedDictionary(); - // return new SymInfo[0]; - // } - public override SymInfo[] GetNamesAsInObject(ExpressionVisitor ev) { //SortedDictionary dict = new SortedDictionary(); @@ -3455,7 +3399,6 @@ namespace CodeCompletion if ((ts as PointerScope).ref_type == null) return true; return ref_type == (ts as PointerScope).ref_type; - return base.IsEqual(ts); } public override string GetDescription() @@ -3625,6 +3568,14 @@ namespace CodeCompletion } } + public virtual bool IsDelegate + { + get + { + return false; + } + } + public virtual bool IsArray { get @@ -4695,6 +4646,7 @@ namespace CodeCompletion this.si.name = CodeCompletionController.CurrentParser.LanguageInformation.GetShortName(this); this.si.kind = get_kind(); this.si.description = GetDescription(); + if (ctn.IsGenericType && !ctn.IsGenericTypeDefinition) { this.original_type = TypeTable.get_compiled_type(ctn.GetGenericTypeDefinition()); @@ -4757,6 +4709,22 @@ namespace CodeCompletion return TypeTable.get_compiled_type(t); } + public override bool IsGeneric + { + get + { + return original_type != null; + } + } + + public override bool IsDelegate + { + get + { + return ctn == PascalABCCompiler.NetHelper.NetHelper.MulticastDelegateType || ctn.BaseType == PascalABCCompiler.NetHelper.NetHelper.MulticastDelegateType; + } + } + public override int Rank { get diff --git a/Compiler/PCU/PCUReader.cs b/Compiler/PCU/PCUReader.cs index 57aa0e0e2..1328a5cf9 100644 --- a/Compiler/PCU/PCUReader.cs +++ b/Compiler/PCU/PCUReader.cs @@ -484,7 +484,12 @@ namespace PascalABCCompiler.PCU else if (tn is generic_instance_type_node) tn.Scope.AddSymbol(names[i].name, si); else if (tn is common_type_node) + { (tn as common_type_node).scope.AddSymbol(names[i].name, si); + if (tn.IsDelegate) + SystemLibrary.SystemLibrary.system_delegate_type.Scope.AddSymbol(names[i].name, si); + } + else throw new NotSupportedException(); } @@ -2903,6 +2908,10 @@ namespace PascalABCCompiler.PCU for (int i=0; i