Browse Source

Fixed C# parser: multiple event declarations on the same line.

pull/2/head
Daniel Grunwald 15 years ago
parent
commit
f1beb21aa5
  1. 2
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VbcEncodingFixingLogger.cs
  2. 2
      src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
  3. 1796
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  4. 19
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  5. 17
      src/Libraries/NRefactory/Test/Parser/TypeLevel/EventDeclarationTests.cs

2
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VbcEncodingFixingLogger.cs

@ -31,6 +31,8 @@ namespace ICSharpCode.VBNetBinding @@ -31,6 +31,8 @@ namespace ICSharpCode.VBNetBinding
static string FixEncoding(string text)
{
if (text == null)
return text;
return Encoding.Default.GetString(ICSharpCode.SharpDevelop.Util.ProcessRunner.OemEncoding.GetBytes(text));
}

2
src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs

@ -74,7 +74,7 @@ namespace ICSharpCode.NRefactory.Parser @@ -74,7 +74,7 @@ namespace ICSharpCode.NRefactory.Parser
protected int ReaderRead()
{
int val = reader.Read();
if (recordRead)
if (recordRead && val >= 0)
recordedText.Append ((char)val);
if ((val == '\r' && reader.Peek() != '\n') || val == '\n') {
++line;

1796
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

19
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -837,9 +837,26 @@ StructMemberDecl<ModifierList m, List<AttributeSection> attributes> @@ -837,9 +837,26 @@ StructMemberDecl<ModifierList m, List<AttributeSection> attributes>
(. eventDecl.InterfaceImplementations.Add(new InterfaceImplementation(explicitInterface, qualident)); .)
| Identifier (. qualident = t.val; .)
[ "=" Expr<out expr> (. eventDecl.Initializer = expr; .) ]
{ "," /* multiple event declarations on single line */
/* our AST isn't built to handle this, so let's create multiple overlapping EventDeclarations */
/* commit the current EventDeclaration */
(. eventDecl.Name = qualident; eventDecl.EndLocation = t.EndLocation; BlockEnd(); .)
/* create a new EventDeclaration for the next identifier */
(. eventDecl = new EventDeclaration {
Modifier = eventDecl.Modifier,
Attributes = eventDecl.Attributes,
StartLocation = eventDecl.StartLocation,
TypeReference = eventDecl.TypeReference.Clone()
};
AddChild(eventDecl);
BlockStart(eventDecl);
.)
Identifier (. qualident = t.val; .)
[ "=" Expr<out expr> (. eventDecl.Initializer = expr; .) ]
}
)
(. eventDecl.Name = qualident; eventDecl.EndLocation = t.EndLocation; .)
[ "=" Expr<out expr> (. eventDecl.Initializer = expr; .) ]
[ "{" (. eventDecl.BodyStart = t.Location; .)
EventAccessorDecls<out addBlock, out removeBlock>
"}" (. eventDecl.BodyEnd = t.EndLocation; .)

17
src/Libraries/NRefactory/Test/Parser/TypeLevel/EventDeclarationTests.cs

@ -22,6 +22,23 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -22,6 +22,23 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Assert.IsFalse(ed.HasRemoveRegion);
}
[Test]
public void CSharpMultipleEventDeclarationTest()
{
TypeDeclaration t = ParseUtilCSharp.ParseGlobal<TypeDeclaration>("class C { public event EventHandler A, B; }");
Assert.AreEqual(2, t.Children.Count);
EventDeclaration ed = (EventDeclaration)t.Children[0];
Assert.AreEqual(Modifiers.Public, ed.Modifier);
Assert.AreEqual("EventHandler", ed.TypeReference.Type);
Assert.AreEqual("A", ed.Name);
ed = (EventDeclaration)t.Children[1];
Assert.AreEqual(Modifiers.Public, ed.Modifier);
Assert.AreEqual("EventHandler", ed.TypeReference.Type);
Assert.AreEqual("B", ed.Name);
}
[Test]
public void CSharpEventImplementingInterfaceDeclarationTest()
{

Loading…
Cancel
Save