Browse Source

Fixed SD2-1499: Parser null reference exception when parsing an incomplete VB.NET class

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3735 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
363aced498
  1. 16
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  2. 16
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  3. 8
      src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs

16
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

@ -580,7 +580,7 @@ newType.Templates); @@ -580,7 +580,7 @@ newType.Templates);
out typeRef);
#line 443 "VBNET.ATG"
newType.BaseTypes.Add(typeRef);
SafeAdd(newType, newType.BaseTypes, typeRef);
}
while (la.kind == 123) {
TypeImplementsClause(
@ -695,7 +695,7 @@ newType); @@ -695,7 +695,7 @@ newType);
out typeRef, false);
#line 497 "VBNET.ATG"
newType.BaseTypes.Add(typeRef);
SafeAdd(newType, newType.BaseTypes, typeRef);
}
EndOfStmt();
@ -975,7 +975,7 @@ out List<TypeReference> baseInterfaces) { @@ -975,7 +975,7 @@ out List<TypeReference> baseInterfaces) {
out type);
#line 1570 "VBNET.ATG"
baseInterfaces.Add(type);
if (type != null) baseInterfaces.Add(type);
while (la.kind == 12) {
lexer.NextToken();
@ -984,7 +984,7 @@ out type); @@ -984,7 +984,7 @@ out type);
out type);
#line 1574 "VBNET.ATG"
baseInterfaces.Add(type);
if (type != null) baseInterfaces.Add(type);
}
EndOfStmt();
}
@ -1223,7 +1223,7 @@ out List<TypeReference> bases) { @@ -1223,7 +1223,7 @@ out List<TypeReference> bases) {
out type);
#line 1554 "VBNET.ATG"
bases.Add(type);
if (type != null) bases.Add(type);
while (la.kind == 12) {
lexer.NextToken();
TypeName(
@ -1231,7 +1231,7 @@ out type); @@ -1231,7 +1231,7 @@ out type);
out type);
#line 1557 "VBNET.ATG"
bases.Add(type);
if (type != null) bases.Add(type);
}
EndOfStmt();
}
@ -2512,7 +2512,7 @@ out List<string> handlesClause) { @@ -2512,7 +2512,7 @@ out List<string> handlesClause) {
out name);
#line 1543 "VBNET.ATG"
handlesClause.Add(name);
if (name != null) handlesClause.Add(name);
while (la.kind == 12) {
lexer.NextToken();
EventMemberSpecifier(
@ -2520,7 +2520,7 @@ out name); @@ -2520,7 +2520,7 @@ out name);
out name);
#line 1544 "VBNET.ATG"
handlesClause.Add(name);
if (name != null) handlesClause.Add(name);
}
}

16
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -440,7 +440,7 @@ NonModuleDeclaration<ModifierList m, List<AttributeSection> attributes> @@ -440,7 +440,7 @@ NonModuleDeclaration<ModifierList m, List<AttributeSection> attributes>
TypeParameterList<newType.Templates>
EndOfStmt
(. newType.BodyStartLocation = t.Location; .)
[ ClassBaseType<out typeRef> (. newType.BaseTypes.Add(typeRef); .) ]
[ ClassBaseType<out typeRef> (. SafeAdd(newType, newType.BaseTypes, typeRef); .) ]
{ TypeImplementsClause<out baseInterfaces> (. newType.BaseTypes.AddRange(baseInterfaces); .) }
ClassBody<newType>
"End" "Class" (. newType.EndLocation = t.EndLocation; .)
@ -494,7 +494,7 @@ NonModuleDeclaration<ModifierList m, List<AttributeSection> attributes> @@ -494,7 +494,7 @@ NonModuleDeclaration<ModifierList m, List<AttributeSection> attributes>
newType.Type = ClassType.Enum;
.)
Identifier (. newType.Name = t.val; .)
[ "As" NonArrayTypeName<out typeRef, false> (. newType.BaseTypes.Add(typeRef); .) ]
[ "As" NonArrayTypeName<out typeRef, false> (. SafeAdd(newType, newType.BaseTypes, typeRef); .) ]
EndOfStmt
(. newType.BodyStartLocation = t.Location; .)
EnumBody<newType>
@ -1540,8 +1540,8 @@ HandlesClause<out List<string> handlesClause> @@ -1540,8 +1540,8 @@ HandlesClause<out List<string> handlesClause>
handlesClause = new List<string>();
string name;
.) =
"Handles" EventMemberSpecifier<out name> (. handlesClause.Add(name); .)
{ "," EventMemberSpecifier<out name> (. handlesClause.Add(name); .) }
"Handles" EventMemberSpecifier<out name> (. if (name != null) handlesClause.Add(name); .)
{ "," EventMemberSpecifier<out name> (. if (name != null) handlesClause.Add(name); .) }
.
/* 7.8. */
@ -1551,10 +1551,10 @@ InterfaceBase <out List<TypeReference> bases> @@ -1551,10 +1551,10 @@ InterfaceBase <out List<TypeReference> bases>
bases = new List<TypeReference>();
.) =
"Inherits"
TypeName<out type> (. bases.Add(type); .)
TypeName<out type> (. if (type != null) bases.Add(type); .)
{
","
TypeName<out type> (. bases.Add(type); .)
TypeName<out type> (. if (type != null) bases.Add(type); .)
}
EndOfStmt
.
@ -1567,11 +1567,11 @@ TypeImplementsClause<out List<TypeReference> baseInterfaces> @@ -1567,11 +1567,11 @@ TypeImplementsClause<out List<TypeReference> baseInterfaces>
.) =
"Implements" TypeName<out type>
(.
baseInterfaces.Add(type);
if (type != null) baseInterfaces.Add(type);
.)
{
"," TypeName<out type>
(. baseInterfaces.Add(type); .)
(. if (type != null) baseInterfaces.Add(type); .)
}
EndOfStmt
.

8
src/Libraries/NRefactory/Test/Parser/GlobalScope/TypeDeclarationTests.cs

@ -196,6 +196,14 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2 @@ -196,6 +196,14 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2
Assert.AreEqual(2, td.EndLocation.Line, "end line");
}
[Test]
public void VBNetMissingBaseClassTest()
{
// SD2-1499: test that this invalid code doesn't crash
TypeDeclaration td = ParseUtilVBNet.ParseGlobal<TypeDeclaration>("public class test inherits", true);
Assert.AreEqual(0, td.BaseTypes.Count);
}
[Test]
public void VBNetEnumWithBaseClassDeclarationTest()
{

Loading…
Cancel
Save