From c7e62da426684e849aa84a3309b612429d2376e9 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 17 Nov 2006 21:53:43 +0000 Subject: [PATCH] Fixed SD2-1202: NullReferenceException for incomplete type argument list git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2048 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Parser/CSharp/Parser.cs | 4 +-- .../Project/Src/Parser/CSharp/cs.ATG | 4 +-- .../ObjectCreateExpressionTests.cs | 35 ++++++++++++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs index 777d95c9bf..036941804b 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs @@ -4723,7 +4723,7 @@ canBeUnbound && (la.kind == Tokens.GreaterThan || la.kind == Tokens.Comma)) { out type); #line 2007 "cs.ATG" - types.Add(type); + if (type != null) { types.Add(type); } while (la.kind == 14) { lexer.NextToken(); Type( @@ -4731,7 +4731,7 @@ out type); out type); #line 2008 "cs.ATG" - types.Add(type); + if (type != null) { types.Add(type); } } } else SynErr(185); Expect(22); diff --git a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG index f02a1a2fa4..f06820a3aa 100644 --- a/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG +++ b/src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG @@ -2004,8 +2004,8 @@ TypeArgumentList types, bool canBeUnbound> ( IF (canBeUnbound && (la.kind == Tokens.GreaterThan || la.kind == Tokens.Comma)) (. types.Add(TypeReference.Null); .) { "," (. types.Add(TypeReference.Null); .) } - | Type (. types.Add(type); .) - { "," Type (. types.Add(type); .) } + | Type (. if (type != null) { types.Add(type); } .) + { "," Type (. if (type != null) { types.Add(type); } .) } ) ">" . diff --git a/src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs b/src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs index 0e05c46cf5..ba7354048e 100644 --- a/src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs +++ b/src/Libraries/NRefactory/Test/Parser/Expressions/ObjectCreateExpressionTests.cs @@ -47,6 +47,23 @@ namespace ICSharpCode.NRefactory.Tests.Ast Assert.IsTrue(expr.Arguments[0] is ObjectCreateExpression); CheckSimpleObjectCreateExpression((ObjectCreateExpression)expr.Arguments[0]); } + + [Test] + public void CSharpInvalidTypeArgumentListObjectCreateExpressionTest() + { + // this test was written because this bug caused the AbstractASTVisitor to crash + + InvocationExpression expr = ParseUtilCSharp.ParseExpression("WriteLine(new SomeGenericType())", true); + Assert.IsTrue(expr.TargetObject is IdentifierExpression); + Assert.AreEqual("WriteLine", ((IdentifierExpression)expr.TargetObject).Identifier); + Assert.AreEqual(1, expr.Arguments.Count); // here a second null parameter was added incorrectly + + Assert.IsTrue(expr.Arguments[0] is ObjectCreateExpression); + TypeReference typeRef = ((ObjectCreateExpression)expr.Arguments[0]).CreateType; + Assert.AreEqual("SomeGenericType", typeRef.Type); + Assert.AreEqual(1, typeRef.GenericTypes.Count); + Assert.AreEqual("int", typeRef.GenericTypes[0].Type); + } #endregion #region VB.NET @@ -55,7 +72,23 @@ namespace ICSharpCode.NRefactory.Tests.Ast { CheckSimpleObjectCreateExpression(ParseUtilVBNet.ParseExpression("New MyObject(1, 2, 3)")); } - + + [Test] + public void VBNetInvalidTypeArgumentListObjectCreateExpressionTest() + { + // this test was written because this bug caused the AbstractASTVisitor to crash + + InvocationExpression expr = ParseUtilVBNet.ParseExpression("WriteLine(New SomeGenericType(Of Integer, )())", true); + Assert.IsTrue(expr.TargetObject is IdentifierExpression); + Assert.AreEqual("WriteLine", ((IdentifierExpression)expr.TargetObject).Identifier); + Assert.AreEqual(1, expr.Arguments.Count); // here a second null parameter was added incorrectly + + Assert.IsTrue(expr.Arguments[0] is ObjectCreateExpression); + TypeReference typeRef = ((ObjectCreateExpression)expr.Arguments[0]).CreateType; + Assert.AreEqual("SomeGenericType", typeRef.Type); + Assert.AreEqual(1, typeRef.GenericTypes.Count); + Assert.AreEqual("Integer", typeRef.GenericTypes[0].Type); + } #endregion } }