From 85230686b7a5d326c798abb89c5d9bdeb6af694f Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 26 Apr 2012 14:37:55 +0200 Subject: [PATCH] [Completion] Fixed object initializer unit tests. --- .../Completion/CSharpCompletionEngine.cs | 32 ++++++++++++++++--- .../CodeCompletion/ObjectInitializerTests.cs | 3 -- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 5f35bd970f..cba56bf327 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -221,19 +221,41 @@ namespace ICSharpCode.NRefactory.CSharp.Completion while (p != null && !(p is ObjectCreateExpression)) { p = p.Parent; } + var parent = (ArrayInitializerExpression)n.Parent; + if (parent.IsSingleElement) + parent = (ArrayInitializerExpression)parent.Parent; if (p != null) { var contextList = new CompletionDataWrapper(this); var initializerResult = ResolveExpression(p, unit); if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { + // check 3 cases: + // New initalizer { xpr + // Object initializer { prop = val1, field = val2, xpr + // Array initializer { new Foo (), a, xpr + // in case 1 all object/array initializer options should be given - in the others not. + + AstNode prev = null; + if (parent.Elements.Count > 1) { + prev = parent.Elements.First(); + if (prev is ArrayInitializerExpression && ((ArrayInitializerExpression)prev).IsSingleElement) + prev = ((ArrayInitializerExpression)prev).Elements.FirstOrDefault(); + } + + if (prev != null && !(prev is NamedExpression)) { + AddContextCompletion(contextList, GetState(), n, unit); + return contextList.Result; + } foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { contextList.AddMember(m); } - var enumerableType = typeof(IEnumerable<>).ToTypeReference().Resolve(ctx); - // check if we may be in a collection initializer, or enumerable initializer - if (enumerableType.Kind == TypeKind.Unknown || !initializerResult.Item1.Type.GetDefinition().IsDerivedFrom(enumerableType.GetDefinition())) { + + if (prev != null && (prev is NamedExpression)) return contextList.Result; - } + + AddContextCompletion(contextList, GetState(), n, unit); + return contextList.Result; + } } return null; @@ -745,6 +767,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } + if (n is ArrayInitializerExpression) { // check for new [] {...} expression -> no need to resolve the type there var parent = n.Parent as ArrayCreateExpression; @@ -759,7 +782,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (concreteNode != null && concreteNode.Parent != null && concreteNode.Parent.Parent != null && concreteNode.Identifier != "a" && concreteNode.Parent.Parent is NamedExpression) { return DefaultControlSpaceItems(); } - if (initalizerResult != null && initalizerResult.Item1.Type.Kind != TypeKind.Unknown) { foreach (var property in initalizerResult.Item1.Type.GetProperties ()) { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs index b1471e0262..f4b4f03897 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs @@ -499,7 +499,6 @@ class MyTest ); } - [Ignore ()] [Test()] public void TestObjectCreationEnumerable() { @@ -521,7 +520,6 @@ class MyTest ); } - [Ignore ()] [Test()] public void TestObjectCreationForbiddenInArrayInitializers() { @@ -543,7 +541,6 @@ class MyTest ); } - [Ignore ()] [Test()] public void TestArrayInitializersForbiddenInObjectCreation() {