From e5958a86edd21df81256ea44b090a3f1c6e420cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Tue, 3 Jun 2014 08:54:44 +0200 Subject: Fixed another completion bug case. --- .../Completion/CSharpCompletionEngine.cs | 6 +++-- .../CodeCompletion/ObjectInitializerTests.cs | 26 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 9bfc8a41..613d1326 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -350,6 +350,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); var list = typeof(System.Collections.IList).ToTypeReference().Resolve(Compilation); + var list1 = typeof(System.Collections.Generic.IList<>).ToTypeReference().Resolve(Compilation); bool isProtectedAllowed = ctx.CurrentTypeDefinition != null && initializerType.GetDefinition() != null ? ctx.CurrentTypeDefinition.IsDerivedFrom(initializerType.GetDefinition()) : false; @@ -366,7 +367,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion foreach (IProperty m in initializerType.GetMembers (m => m.SymbolKind == SymbolKind.Property)) { if (m.CanSet && lookup.IsAccessible(m.Setter, isProtectedAllowed) || - m.CanGet && lookup.IsAccessible(m.Getter, isProtectedAllowed) && m.ReturnType.GetDefinition() != null && m.ReturnType.GetDefinition().IsDerivedFrom(list.GetDefinition())) { + m.CanGet && lookup.IsAccessible(m.Getter, isProtectedAllowed) && m.ReturnType.GetDefinition() != null && + (m.ReturnType.GetDefinition().IsDerivedFrom(list.GetDefinition()) || m.ReturnType.GetDefinition().IsDerivedFrom(list1.GetDefinition()))) { var data = contextList.AddMember(m); if (data != null) data.DisplayFlags |= DisplayFlags.NamedArgument; @@ -383,7 +385,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // check if the object is a list, if not only provide object initalizers if (initializerType.Kind != TypeKind.Array && list != null) { var def = initializerType.GetDefinition(); - if (def != null && !def.IsDerivedFrom(list.GetDefinition())) + if (def != null && !def.IsDerivedFrom(list.GetDefinition()) && !def.IsDerivedFrom(list1.GetDefinition())) return contextList.Result; } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs index f3994bc0..dc3dd08e 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs @@ -780,6 +780,32 @@ class Foo public List Children { get {} } } +class Test +{ + public static void Main(string [] args) + { + var dict = new Foo { + $c$ + } + } +} +", + provider => { + Assert.IsNotNull(provider.Find("Children"), "'Children' not found."); + }); + } + + [Test] + public void TestBug19908_Case2() + { + CodeCompletionBugTests.CombinedProviderTest( + @"using System.Collections.Generic; + +class Foo +{ + public IList Children { get {} } +} + class Test { public static void Main(string [] args) -- cgit v1.2.3