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);
out typeRef); out typeRef);
#line 443 "VBNET.ATG" #line 443 "VBNET.ATG"
newType.BaseTypes.Add(typeRef); SafeAdd(newType, newType.BaseTypes, typeRef);
} }
while (la.kind == 123) { while (la.kind == 123) {
TypeImplementsClause( TypeImplementsClause(
@ -695,7 +695,7 @@ newType);
out typeRef, false); out typeRef, false);
#line 497 "VBNET.ATG" #line 497 "VBNET.ATG"
newType.BaseTypes.Add(typeRef); SafeAdd(newType, newType.BaseTypes, typeRef);
} }
EndOfStmt(); EndOfStmt();
@ -975,7 +975,7 @@ out List<TypeReference> baseInterfaces) {
out type); out type);
#line 1570 "VBNET.ATG" #line 1570 "VBNET.ATG"
baseInterfaces.Add(type); if (type != null) baseInterfaces.Add(type);
while (la.kind == 12) { while (la.kind == 12) {
lexer.NextToken(); lexer.NextToken();
@ -984,7 +984,7 @@ out type);
out type); out type);
#line 1574 "VBNET.ATG" #line 1574 "VBNET.ATG"
baseInterfaces.Add(type); if (type != null) baseInterfaces.Add(type);
} }
EndOfStmt(); EndOfStmt();
} }
@ -1223,7 +1223,7 @@ out List<TypeReference> bases) {
out type); out type);
#line 1554 "VBNET.ATG" #line 1554 "VBNET.ATG"
bases.Add(type); if (type != null) bases.Add(type);
while (la.kind == 12) { while (la.kind == 12) {
lexer.NextToken(); lexer.NextToken();
TypeName( TypeName(
@ -1231,7 +1231,7 @@ out type);
out type); out type);
#line 1557 "VBNET.ATG" #line 1557 "VBNET.ATG"
bases.Add(type); if (type != null) bases.Add(type);
} }
EndOfStmt(); EndOfStmt();
} }
@ -2512,7 +2512,7 @@ out List<string> handlesClause) {
out name); out name);
#line 1543 "VBNET.ATG" #line 1543 "VBNET.ATG"
handlesClause.Add(name); if (name != null) handlesClause.Add(name);
while (la.kind == 12) { while (la.kind == 12) {
lexer.NextToken(); lexer.NextToken();
EventMemberSpecifier( EventMemberSpecifier(
@ -2520,7 +2520,7 @@ out name);
out name); out name);
#line 1544 "VBNET.ATG" #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>
TypeParameterList<newType.Templates> TypeParameterList<newType.Templates>
EndOfStmt EndOfStmt
(. newType.BodyStartLocation = t.Location; .) (. 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); .) } { TypeImplementsClause<out baseInterfaces> (. newType.BaseTypes.AddRange(baseInterfaces); .) }
ClassBody<newType> ClassBody<newType>
"End" "Class" (. newType.EndLocation = t.EndLocation; .) "End" "Class" (. newType.EndLocation = t.EndLocation; .)
@ -494,7 +494,7 @@ NonModuleDeclaration<ModifierList m, List<AttributeSection> attributes>
newType.Type = ClassType.Enum; newType.Type = ClassType.Enum;
.) .)
Identifier (. newType.Name = t.val; .) 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 EndOfStmt
(. newType.BodyStartLocation = t.Location; .) (. newType.BodyStartLocation = t.Location; .)
EnumBody<newType> EnumBody<newType>
@ -1540,8 +1540,8 @@ HandlesClause<out List<string> handlesClause>
handlesClause = new List<string>(); handlesClause = new List<string>();
string name; string name;
.) = .) =
"Handles" EventMemberSpecifier<out name> (. handlesClause.Add(name); .) "Handles" EventMemberSpecifier<out name> (. if (name != null) handlesClause.Add(name); .)
{ "," EventMemberSpecifier<out name> (. handlesClause.Add(name); .) } { "," EventMemberSpecifier<out name> (. if (name != null) handlesClause.Add(name); .) }
. .
/* 7.8. */ /* 7.8. */
@ -1551,10 +1551,10 @@ InterfaceBase <out List<TypeReference> bases>
bases = new List<TypeReference>(); bases = new List<TypeReference>();
.) = .) =
"Inherits" "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 EndOfStmt
. .
@ -1567,11 +1567,11 @@ TypeImplementsClause<out List<TypeReference> baseInterfaces>
.) = .) =
"Implements" TypeName<out type> "Implements" TypeName<out type>
(. (.
baseInterfaces.Add(type); if (type != null) baseInterfaces.Add(type);
.) .)
{ {
"," TypeName<out type> "," TypeName<out type>
(. baseInterfaces.Add(type); .) (. if (type != null) baseInterfaces.Add(type); .)
} }
EndOfStmt EndOfStmt
. .

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

@ -196,6 +196,14 @@ public abstract class MyClass : MyBase, Interface1, My.Test.Interface2
Assert.AreEqual(2, td.EndLocation.Line, "end line"); 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] [Test]
public void VBNetEnumWithBaseClassDeclarationTest() public void VBNetEnumWithBaseClassDeclarationTest()
{ {

Loading…
Cancel
Save