diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2014-06-03 10:54:44 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2014-06-03 10:54:44 +0400 |
commit | e5958a86edd21df81256ea44b090a3f1c6e420cf (patch) | |
tree | 4814b4c2f98bb470b70401c6559e296e6fd72b78 | |
parent | 37368afca38bdb241999b11723837a13f796ddbd (diff) |
Fixed another completion bug case.
-rw-r--r-- | ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs | 6 | ||||
-rw-r--r-- | ICSharpCode.NRefactory.Tests/CSharp/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 @@ -794,6 +794,32 @@ class Test Assert.IsNotNull(provider.Find("Children"), "'Children' not found."); }); } + + [Test] + public void TestBug19908_Case2() + { + CodeCompletionBugTests.CombinedProviderTest( + @"using System.Collections.Generic; + +class Foo +{ + public IList<int> Children { get {} } +} + +class Test +{ + public static void Main(string [] args) + { + var dict = new Foo { + $c$ + } + } +} +", + provider => { + Assert.IsNotNull(provider.Find("Children"), "'Children' not found."); + }); + } } } |