diff --git a/CodeCompletion/SymTable.cs b/CodeCompletion/SymTable.cs index 490266594..42fe0f23a 100644 --- a/CodeCompletion/SymTable.cs +++ b/CodeCompletion/SymTable.cs @@ -4771,6 +4771,8 @@ namespace CodeCompletion public override TypeScope GetInstance(List gen_args) { Type t = this.ctn; + if (!ctn.IsGenericType) + return this; if (!ctn.IsGenericTypeDefinition) t = PascalABCCompiler.NetHelper.NetHelper.FindType(this.ctn.Namespace + "." + this.ctn.Name); else if (this.instances != null && this.instances.Count > 0) diff --git a/ParserTools/ParserTools/DefaultLanguageInformation.cs b/ParserTools/ParserTools/DefaultLanguageInformation.cs index de5da99ac..34d4c6a18 100644 --- a/ParserTools/ParserTools/DefaultLanguageInformation.cs +++ b/ParserTools/ParserTools/DefaultLanguageInformation.cs @@ -1634,7 +1634,22 @@ namespace PascalABCCompiler.Parsers Type[] tt = scope.CompiledMethod.GetGenericArguments(); int gen_ind = 0; if (!scope.IsExtension) + { sb.Append(GetShortTypeName(scope.CompiledMethod.DeclaringType)); + int ind = 0; + foreach (Type gen_arg in scope.CompiledMethod.DeclaringType.GetGenericArguments()) + { + if (gen_arg.IsGenericParameter) + { + if (generic_param_args == null) + generic_param_args = new Dictionary(); + if (scope.GenericArgs.Count > ind) + generic_param_args.Add(gen_arg.Name, scope.GenericArgs[ind]); + } + ind++; + } + + } else { gen_ind = 1; @@ -1648,6 +1663,8 @@ namespace PascalABCCompiler.Parsers { if (!class_generic_table.ContainsKey(class_generic_args[i].Name)) class_generic_table.Add(class_generic_args[i].Name, j); + if (scope.GenericArgs.Count > j) + generic_param_args.Add(class_generic_args[i].Name, scope.GenericArgs[j]); } break; } diff --git a/TestSuite/intellisense_tests/extensionmethods1.pas b/TestSuite/intellisense_tests/extensionmethods1.pas index bd90a1a99..b6cc867c4 100644 --- a/TestSuite/intellisense_tests/extensionmethods1.pas +++ b/TestSuite/intellisense_tests/extensionmethods1.pas @@ -2,4 +2,9 @@ begin var l := Seq(2,1,4); l.OfType&().ForEach{@(расширение) procedure ForEach(Self: sequence of T; action: T->());@}(x->Print(x)); + var l1 := new List; + var seq1{@var seq1: sequence of integer;@} := l1.Where{@(расширение) function IEnumerable<>.Where<>(predicate: integer->boolean): sequence of integer;@}(i->true); + var l2 := l1.ConvertAll&{@function List<>.ConvertAll(converter: Converter): List;@}(); + var seq2{@var seq2: sequence of integer;@} := l1.Skip{@(расширение) function IEnumerable<>.Skip<>(count: integer): sequence of integer;@}(3); + l1.OrderBy(i->i).Skip{@(расширение) function IEnumerable<>.Skip<>(count: integer): sequence of integer;@}(3); end. \ No newline at end of file