diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index cb1c1338d6..29e2715260 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -420,7 +420,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var contextList = new CompletionDataWrapper (this); var identifierStart = GetExpressionAtCursor (); - if (identifierStart != null && identifierStart.Item2 is TypeParameterDeclaration) return null; @@ -472,6 +471,11 @@ 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; + if (parent != null && parent.Type.IsNull) + return DefaultControlSpaceItems (); + var initalizerResult = ResolveExpression (identifierStart.Item1, n.Parent, identifierStart.Item3); var concreteNode = identifierStart.Item3.GetNodeAt (location); @@ -479,8 +483,8 @@ 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) { + + if (initalizerResult != null && initalizerResult.Item1.Type.Kind != TypeKind.Unknown) { foreach (var property in initalizerResult.Item1.Type.GetProperties ()) { if (!property.IsPublic) @@ -494,7 +498,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return contextList.Result; } - return null; + Console.WriteLine ("blub"); + return DefaultControlSpaceItems (); } if (n != null/* && !(identifierStart.Item2 is TypeDeclaration)*/) { csResolver = new CSharpResolver (ctx); @@ -1894,6 +1899,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); } + if (expr == null) return null; var member = Unit.GetNodeAt (memberLocation); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 4e8fe5be47..4fbcff65c8 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -413,7 +413,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { memberLocation = new TextLocation (1, 1); } - using (var stream = new System.IO.StringReader (wrapper.ToString ())) { try { var parser = new CSharpParser (); @@ -477,13 +476,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var mref = baseUnit.GetNodeAt (location.Line, location.Column - 1, n => n is InvocationExpression || n is ObjectCreateExpression); - AstNode expr; + AstNode expr = null; if (mref is InvocationExpression) { expr = ((InvocationExpression)mref).Target; } else if (mref is ObjectCreateExpression) { expr = mref; } else { - return null; + baseUnit = ParseStub (")};", false); + mref = baseUnit.GetNodeAt (location.Line, location.Column - 1, n => n is InvocationExpression || n is ObjectCreateExpression); + if (mref is InvocationExpression) { + expr = ((InvocationExpression)mref).Target; + } else if (mref is ObjectCreateExpression) { + expr = mref; + } + if (expr == null) + return null; } var member = Unit.GetNodeAt (memberLocation); var member2 = baseUnit.GetNodeAt (memberLocation); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs index 60881c6df3..8705796241 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ObjectInitializerTests.cs @@ -31,6 +31,24 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion { public class ObjectInitializerTests : TestBase { + [Test()] + public void TestArrayInitializerStart () + { + CodeCompletionBugTests.CombinedProviderTest ( +@"using System; + +class MyTest +{ + public void Test () + { + $new [] { M$ + } +} +", provider => { + Assert.IsNotNull (provider.Find ("Tuple"), "class 'MyTest' not found."); + }); + } + [Test()] public void TestArrayInitializerSimple () { @@ -49,6 +67,25 @@ class MyTest }); } + /// + /// Bug 432727 - No completion if no constructor + /// + [Test()] + public void TestArrayInitializerParameterContext () + { + var provider = ParameterCompletionTests.CreateProvider ( +@"using System; + +class MyTest +{ + public void Test () + { + $new [] { Tuple.Create($ + } +}"); + Assert.IsNotNull (provider, "provider was not created."); + Assert.Greater (provider.OverloadCount, 1); + } /// /// Bug 487236 - Object initializer completion uses wrong type