From a12aca7533e2d80d3b3a1aefd5643ced1c96e78f 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: Mon, 30 May 2016 20:46:09 +0200 Subject: [PATCH] bug fix #175 --- CodeCompletion/DomSyntaxTreeVisitor.cs | 43 ++++++++++++++++++++++--- TestSuite/intellisense_tests/where1.pas | 15 +++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 TestSuite/intellisense_tests/where1.pas diff --git a/CodeCompletion/DomSyntaxTreeVisitor.cs b/CodeCompletion/DomSyntaxTreeVisitor.cs index 6144bba47..fb6be1a51 100644 --- a/CodeCompletion/DomSyntaxTreeVisitor.cs +++ b/CodeCompletion/DomSyntaxTreeVisitor.cs @@ -387,7 +387,7 @@ namespace CodeCompletion for (int i = 0; i < _named_type_reference.names.Count; i++) { if (i == _named_type_reference.names.Count - 1 && converted_template_type != null) - suffix = "`" + _named_type_reference.names.Count; + suffix = "`" + converted_template_type.params_list.params_list.Count; if (i > 0) returned_scope = returned_scope.FindNameOnlyInType(_named_type_reference.names[i].name+suffix); else @@ -1081,10 +1081,27 @@ namespace CodeCompletion ps.declaringUnit = entry_scope; if (_procedure_header.template_args != null && !ps.IsGeneric()) { + Dictionary where_types = new Dictionary(); + if (_procedure_header.where_defs != null) + { + foreach (where_definition wd in _procedure_header.where_defs.defs) + { + for (int i = 0; i < wd.names.idents.Count; i++) + { + string name = wd.names.idents[i].name; + wd.types.defs[i].visit(this); + where_types[name] = returned_scope as TypeScope; + } + } + } foreach (ident s in _procedure_header.template_args.idents) { ps.AddTemplateParameter(s.name); - TemplateParameterScope tps = new TemplateParameterScope(s.name, TypeTable.obj_type, ps); + TypeScope where_ts = null; + where_types.TryGetValue(s.name, out where_ts); + if (where_ts == null) + where_ts = TypeTable.obj_type; + TemplateParameterScope tps = new TemplateParameterScope(s.name, where_ts, ps); tps.loc = get_location(s); ps.AddName(s.name, tps); } @@ -1393,10 +1410,28 @@ namespace CodeCompletion SymScope tmp = cur_scope; if (_function_header.template_args != null && !ps.IsGeneric()) { - foreach (ident s in _function_header.template_args.idents) + Dictionary where_types = new Dictionary(); + if (_function_header.where_defs != null) + { + foreach (where_definition wd in _function_header.where_defs.defs) + { + for (int i = 0; i < wd.names.idents.Count; i++) + { + string name = wd.names.idents[i].name; + wd.types.defs[i].visit(this); + where_types[name] = returned_scope as TypeScope; + } + } + } + foreach (ident s in _function_header.template_args.idents) { ps.AddTemplateParameter(s.name); - TemplateParameterScope tps = new TemplateParameterScope(s.name, TypeTable.obj_type, ps); + TypeScope where_ts = null; + where_types.TryGetValue(s.name, out where_ts); + if (where_ts == null) + where_ts = TypeTable.obj_type; + TemplateParameterScope tps = new TemplateParameterScope(s.name, where_ts, ps); + tps.loc = get_location(s); ps.AddName(s.name, tps); } diff --git a/TestSuite/intellisense_tests/where1.pas b/TestSuite/intellisense_tests/where1.pas new file mode 100644 index 000000000..e5e07125a --- /dev/null +++ b/TestSuite/intellisense_tests/where1.pas @@ -0,0 +1,15 @@ +//ä +function Test(a, b: T): integer; where T:System.IComparable; +begin + var x: T; + x.CompareTo{@function IComparable<>.CompareTo(other: T): integer; virtual;@}(a); +end; + +procedure Test2(a, b: T); where T:System.IComparable; +begin + var x: T; + x.CompareTo{@function IComparable<>.CompareTo(other: real): integer; virtual;@}(a); +end; + +begin +end. \ No newline at end of file