diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 7ead2cce85..76c266244c 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -173,6 +173,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (invoke.Node is ObjectCreateExpression) { var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type, invoke.Unit); + if (createType.Item1.Type.Kind == TypeKind.Unknown) + return null; return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index 8af7a17498..047b956062 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -4951,5 +4951,25 @@ $#region S$ }"); Assert.IsTrue(provider == null || provider.Count == 0); } + + /// + /// Bug 4323 - Parameter completion exception while attempting to instantiate unknown class + /// + [Test()] + public void TestBug4323() + { + // just test for exception + ParameterCompletionTests.CreateProvider( +@"namespace Test +{ + class TestClass + { + public static void Main(string[] args) + { + $object foo = new Foo($ + } + } +}"); + } } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 43bdc4e93f..747cee5f57 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -212,9 +212,9 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } #region IParameterCompletionDataFactory implementation - public IParameterDataProvider CreateConstructorProvider (int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type) + public IParameterDataProvider CreateConstructorProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type) { - + Assert.IsTrue(type.Kind != TypeKind.Unknown); return new Provider () { Data = type.GetConstructors (m => m.Accessibility == Accessibility.Public) }; @@ -227,15 +227,17 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion }; } - public IParameterDataProvider CreateDelegateDataProvider (int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type) + public IParameterDataProvider CreateDelegateDataProvider(int startOffset, ICSharpCode.NRefactory.TypeSystem.IType type) { + Assert.IsTrue(type.Kind != TypeKind.Unknown); return new Provider () { Data = new [] { type.GetDelegateInvokeMethod () } }; } - public IParameterDataProvider CreateIndexerParameterDataProvider (int startOffset, IType type, AstNode resolvedNode) + public IParameterDataProvider CreateIndexerParameterDataProvider(int startOffset, IType type, AstNode resolvedNode) { + Assert.IsTrue(type.Kind != TypeKind.Unknown); if (type.Kind == TypeKind.Array) return new ArrayProvider (); return new IndexerProvider () {