Browse Source

fix #397 - Incorrect code generated for adding event handler in VB.NET.

pull/368/merge
Siegfried Pammer 13 years ago
parent
commit
a52e0b2e64
  1. 14
      ILSpy/VB/ILSpyEnvironmentProvider.cs
  2. 38
      NRefactory/ICSharpCode.NRefactory.VB/Ast/Statements/AddRemoveHandlerStatement.cs
  3. 1
      NRefactory/ICSharpCode.NRefactory.VB/IAstVisitor.cs
  4. 1
      NRefactory/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj
  5. 22
      NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
  6. 35
      NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

14
ILSpy/VB/ILSpyEnvironmentProvider.cs

@ -139,5 +139,19 @@ namespace ICSharpCode.ILSpy.VB
} }
} }
public bool HasEvent(NRefactory.VB.Ast.Expression expression)
{
return expression.Annotation<EventDefinition>() != null;
}
public bool IsMethodGroup(ICSharpCode.NRefactory.CSharp.Expression expression)
{
var annotation = expression.Annotation<MethodDefinition>();
if (annotation != null) {
return true;
}
return false;
}
} }
} }

38
NRefactory/ICSharpCode.NRefactory.VB/Ast/Statements/AddRemoveHandlerStatement.cs

@ -0,0 +1,38 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.NRefactory.VB.Ast
{
/// <summary>
/// ( AddHandler | RemoveHandler ) Expression, Expression
/// </summary>
public class AddRemoveHandlerStatement : Statement
{
public static readonly Role<Expression> EventExpressionRole = new Role<Expression>("EventExpression", Expression.Null);
public static readonly Role<Expression> DelegateExpressionRole = new Role<Expression>("DelegateExpression", Expression.Null);
public bool IsAddHandler { get; set; }
public Expression EventExpression {
get { return GetChildByRole(EventExpressionRole); }
set { SetChildByRole(EventExpressionRole, value); }
}
public Expression DelegateExpression {
get { return GetChildByRole(DelegateExpressionRole); }
set { SetChildByRole(DelegateExpressionRole, value); }
}
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data)
{
return visitor.VisitAddRemoveHandlerStatement(this, data);
}
protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match)
{
throw new NotImplementedException();
}
}
}

1
NRefactory/ICSharpCode.NRefactory.VB/IAstVisitor.cs

@ -75,6 +75,7 @@ namespace ICSharpCode.NRefactory.VB {
S VisitLabelDeclarationStatement(LabelDeclarationStatement labelDeclarationStatement, T data); S VisitLabelDeclarationStatement(LabelDeclarationStatement labelDeclarationStatement, T data);
S VisitLocalDeclarationStatement(LocalDeclarationStatement localDeclarationStatement, T data); S VisitLocalDeclarationStatement(LocalDeclarationStatement localDeclarationStatement, T data);
S VisitExpressionStatement(ExpressionStatement expressionStatement, T data); S VisitExpressionStatement(ExpressionStatement expressionStatement, T data);
S VisitAddRemoveHandlerStatement(AddRemoveHandlerStatement addRemoveHandlerStatement, T data);
S VisitWithStatement(WithStatement withStatement, T data); S VisitWithStatement(WithStatement withStatement, T data);
S VisitSyncLockStatement(SyncLockStatement syncLockStatement, T data); S VisitSyncLockStatement(SyncLockStatement syncLockStatement, T data);
S VisitIfElseStatement(IfElseStatement ifElseStatement, T data); S VisitIfElseStatement(IfElseStatement ifElseStatement, T data);

1
NRefactory/ICSharpCode.NRefactory.VB/ICSharpCode.NRefactory.VB.csproj

@ -103,6 +103,7 @@
<Compile Include="Ast\GlobalScope\OptionStatement.cs" /> <Compile Include="Ast\GlobalScope\OptionStatement.cs" />
<Compile Include="Ast\Identifier.cs" /> <Compile Include="Ast\Identifier.cs" />
<Compile Include="Ast\INullable.cs" /> <Compile Include="Ast\INullable.cs" />
<Compile Include="Ast\Statements\AddRemoveHandlerStatement.cs" />
<Compile Include="Ast\Statements\BlockStatement.cs" /> <Compile Include="Ast\Statements\BlockStatement.cs" />
<Compile Include="Ast\Statements\ContinueStatement.cs" /> <Compile Include="Ast\Statements\ContinueStatement.cs" />
<Compile Include="Ast\Statements\DoLoopStatement.cs" /> <Compile Include="Ast\Statements\DoLoopStatement.cs" />

22
NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs

@ -397,6 +397,8 @@ namespace ICSharpCode.NRefactory.VB
{ {
StartNode(primitiveExpression); StartNode(primitiveExpression);
if (lastWritten == LastWritten.KeywordOrIdentifier)
Space();
WritePrimitiveValue(primitiveExpression.Value); WritePrimitiveValue(primitiveExpression.Value);
return EndNode(primitiveExpression); return EndNode(primitiveExpression);
@ -895,6 +897,10 @@ namespace ICSharpCode.NRefactory.VB
// formatter.Space(); // formatter.Space();
// } // }
formatter.WriteToken(token); formatter.WriteToken(token);
if (token == ",") {
lastWritten = LastWritten.Whitespace;
Space();
}
// if (token == "+") // if (token == "+")
// lastWritten = LastWritten.Plus; // lastWritten = LastWritten.Plus;
// else if (token == "-") // else if (token == "-")
@ -2655,5 +2661,21 @@ namespace ICSharpCode.NRefactory.VB
return EndNode(groupJoinQueryOperator); return EndNode(groupJoinQueryOperator);
} }
public object VisitAddRemoveHandlerStatement(AddRemoveHandlerStatement addRemoveHandlerStatement, object data)
{
StartNode(addRemoveHandlerStatement);
if (addRemoveHandlerStatement.IsAddHandler)
WriteKeyword("AddHandler");
else
WriteKeyword("RemoveHandler");
addRemoveHandlerStatement.EventExpression.AcceptVisitor(this, data);
WriteToken(",", VBTokenNode.Roles.Comma);
addRemoveHandlerStatement.DelegateExpression.AcceptVisitor(this, data);
return EndNode(addRemoveHandlerStatement);
}
} }
} }

35
NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

@ -20,6 +20,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
bool? IsReferenceType(CSharp.Expression expression); bool? IsReferenceType(CSharp.Expression expression);
//ITypeResolveContext ResolveContext { get; } //ITypeResolveContext ResolveContext { get; }
IType ResolveType(AstType type, TypeDeclaration entity = null); IType ResolveType(AstType type, TypeDeclaration entity = null);
bool IsMethodGroup(CSharp.Expression expression);
bool HasEvent(Expression expression);
} }
/// <summary> /// <summary>
@ -126,9 +128,21 @@ namespace ICSharpCode.NRefactory.VB.Visitors
op = AssignmentOperatorType.Assign; op = AssignmentOperatorType.Assign;
break; break;
case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Add: case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Add:
if (provider.HasEvent(left)) {
var addHandler = new AddRemoveHandlerStatement { IsAddHandler = true };
addHandler.EventExpression = left;
addHandler.DelegateExpression = right;
return EndNode(assignmentExpression, addHandler);
}
op = AssignmentOperatorType.Add; op = AssignmentOperatorType.Add;
break; break;
case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Subtract: case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Subtract:
if (provider.HasEvent(left)) {
var addHandler = new AddRemoveHandlerStatement { IsAddHandler = false };
addHandler.EventExpression = left;
addHandler.DelegateExpression = right;
return EndNode(assignmentExpression, addHandler);
}
op = AssignmentOperatorType.Subtract; op = AssignmentOperatorType.Subtract;
break; break;
case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Multiply: case ICSharpCode.NRefactory.CSharp.AssignmentOperatorType.Multiply:
@ -359,6 +373,9 @@ namespace ICSharpCode.NRefactory.VB.Visitors
var expr = new IdentifierExpression(); var expr = new IdentifierExpression();
expr.Identifier = new Identifier(identifierExpression.Identifier, TextLocation.Empty); expr.Identifier = new Identifier(identifierExpression.Identifier, TextLocation.Empty);
ConvertNodes(identifierExpression.TypeArguments, expr.TypeArguments); ConvertNodes(identifierExpression.TypeArguments, expr.TypeArguments);
if (provider.IsMethodGroup(identifierExpression)) {
return EndNode(identifierExpression, new UnaryOperatorExpression(UnaryOperatorType.AddressOf, expr));
}
return EndNode(identifierExpression, expr); return EndNode(identifierExpression, expr);
} }
@ -372,10 +389,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitInvocationExpression(CSharp.InvocationExpression invocationExpression, object data) public AstNode VisitInvocationExpression(CSharp.InvocationExpression invocationExpression, object data)
{ {
var expr = new InvocationExpression( var expr = new InvocationExpression((Expression)invocationExpression.Target.AcceptVisitor(this, data));
(Expression)invocationExpression.Target.AcceptVisitor(this, data));
ConvertNodes(invocationExpression.Arguments, expr.Arguments); ConvertNodes(invocationExpression.Arguments, expr.Arguments);
return EndNode(invocationExpression, expr); return EndNode(invocationExpression, expr);
} }
@ -412,6 +427,9 @@ namespace ICSharpCode.NRefactory.VB.Visitors
memberAccessExpression.Target = (Expression)memberReferenceExpression.Target.AcceptVisitor(this, data); memberAccessExpression.Target = (Expression)memberReferenceExpression.Target.AcceptVisitor(this, data);
memberAccessExpression.MemberName = new Identifier(memberReferenceExpression.MemberName, TextLocation.Empty); memberAccessExpression.MemberName = new Identifier(memberReferenceExpression.MemberName, TextLocation.Empty);
ConvertNodes(memberReferenceExpression.TypeArguments, memberAccessExpression.TypeArguments); ConvertNodes(memberReferenceExpression.TypeArguments, memberAccessExpression.TypeArguments);
if (provider.IsMethodGroup(memberReferenceExpression)) {
return EndNode(memberReferenceExpression, new UnaryOperatorExpression(UnaryOperatorType.AddressOf, memberAccessExpression));
}
return EndNode(memberReferenceExpression, memberAccessExpression); return EndNode(memberReferenceExpression, memberAccessExpression);
} }
@ -445,6 +463,11 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
var expr = new ObjectCreationExpression((AstType)objectCreateExpression.Type.AcceptVisitor(this, data)); var expr = new ObjectCreationExpression((AstType)objectCreateExpression.Type.AcceptVisitor(this, data));
ConvertNodes(objectCreateExpression.Arguments, expr.Arguments); ConvertNodes(objectCreateExpression.Arguments, expr.Arguments);
var arg1 = expr.Arguments.FirstOrDefault() as UnaryOperatorExpression;
if (arg1 != null && arg1.Operator == UnaryOperatorType.AddressOf) {
arg1.Remove();
return EndNode(objectCreateExpression, arg1);
}
if (!objectCreateExpression.Initializer.IsNull) if (!objectCreateExpression.Initializer.IsNull)
expr.Initializer = (ArrayInitializerExpression)objectCreateExpression.Initializer.AcceptVisitor(this, data); expr.Initializer = (ArrayInitializerExpression)objectCreateExpression.Initializer.AcceptVisitor(this, data);
@ -1036,8 +1059,10 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitExpressionStatement(CSharp.ExpressionStatement expressionStatement, object data) public AstNode VisitExpressionStatement(CSharp.ExpressionStatement expressionStatement, object data)
{ {
var expr = new ExpressionStatement((Expression)expressionStatement.Expression.AcceptVisitor(this, data)); var node = expressionStatement.Expression.AcceptVisitor(this, data);
return EndNode(expressionStatement, expr); if (node is Expression)
node = new ExpressionStatement((Expression)node);
return EndNode(expressionStatement, node);
} }
public AstNode VisitFixedStatement(CSharp.FixedStatement fixedStatement, object data) public AstNode VisitFixedStatement(CSharp.FixedStatement fixedStatement, object data)

Loading…
Cancel
Save