Browse Source

improve conversion of event declarations

pull/254/head
Siegfried Pammer 14 years ago
parent
commit
3e729ee910
  1. 2
      NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
  2. 68
      NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

2
NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs

@ -1766,7 +1766,7 @@ namespace ICSharpCode.NRefactory.VB
Space(); Space();
WriteKeyword("As"); WriteKeyword("As");
eventDeclaration.ReturnType.AcceptVisitor(this, data); eventDeclaration.ReturnType.AcceptVisitor(this, data);
} }
WriteImplementsClause(eventDeclaration.ImplementsClause); WriteImplementsClause(eventDeclaration.ImplementsClause);
if (eventDeclaration.IsCustom) { if (eventDeclaration.IsCustom) {

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

@ -5,7 +5,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using ICSharpCode.NRefactory.PatternMatching; using ICSharpCode.NRefactory.PatternMatching;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.VB.Ast; using ICSharpCode.NRefactory.VB.Ast;
@ -27,13 +26,20 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
IEnvironmentProvider provider; IEnvironmentProvider provider;
Stack<BlockStatement> blocks; Stack<BlockStatement> blocks;
// TODO this should belong to the current type member or lambda Stack<TypeDeclaration> types;
bool inIterator; Stack<MemberInfo> members;
class MemberInfo
{
public bool inIterator;
}
public CSharpToVBConverterVisitor(IEnvironmentProvider provider) public CSharpToVBConverterVisitor(IEnvironmentProvider provider)
{ {
this.provider = provider; this.provider = provider;
this.blocks = new Stack<BlockStatement>(); this.blocks = new Stack<BlockStatement>();
this.types = new Stack<TypeDeclaration>();
this.members = new Stack<MemberInfo>();
} }
public AstNode VisitAnonymousMethodExpression(CSharp.AnonymousMethodExpression anonymousMethodExpression, object data) public AstNode VisitAnonymousMethodExpression(CSharp.AnonymousMethodExpression anonymousMethodExpression, object data)
@ -716,7 +722,9 @@ namespace ICSharpCode.NRefactory.VB.Visitors
type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty); type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty);
types.Push(type);
ConvertNodes(typeDeclaration.Members, type.Members); ConvertNodes(typeDeclaration.Members, type.Members);
types.Pop();
return EndNode(typeDeclaration, type); return EndNode(typeDeclaration, type);
} }
@ -1131,13 +1139,15 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitYieldBreakStatement(CSharp.YieldBreakStatement yieldBreakStatement, object data) public AstNode VisitYieldBreakStatement(CSharp.YieldBreakStatement yieldBreakStatement, object data)
{ {
inIterator = true; var frame = members.Peek();
frame.inIterator = true;
return EndNode(yieldBreakStatement, new ReturnStatement()); return EndNode(yieldBreakStatement, new ReturnStatement());
} }
public AstNode VisitYieldStatement(CSharp.YieldStatement yieldStatement, object data) public AstNode VisitYieldStatement(CSharp.YieldStatement yieldStatement, object data)
{ {
inIterator = true; var frame = members.Peek();
frame.inIterator = true;
return EndNode(yieldStatement, new YieldStatement((Expression)yieldStatement.Expression.AcceptVisitor(this, data))); return EndNode(yieldStatement, new YieldStatement((Expression)yieldStatement.Expression.AcceptVisitor(this, data)));
} }
@ -1197,19 +1207,30 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitEventDeclaration(CSharp.EventDeclaration eventDeclaration, object data) public AstNode VisitEventDeclaration(CSharp.EventDeclaration eventDeclaration, object data)
{ {
var result = new EventDeclaration(); members.Push(new MemberInfo());
// TODO event declaration
foreach (var evt in eventDeclaration.Variables) {
var result = new EventDeclaration();
ConvertNodes(eventDeclaration.Attributes, result.Attributes);
result.Modifiers = ConvertModifiers(eventDeclaration.Modifiers, eventDeclaration);
result.Name = evt.Name;
result.ReturnType = (AstType)eventDeclaration.ReturnType.AcceptVisitor(this, data);
types.Peek().Members.Add(result);
}
// ConvertNodes(eventDeclaration.Attributes, result.Attributes); members.Pop();
// result.Modifiers = ConvertModifiers(eventDeclaration.Modifiers, eventDeclaration);
// result.Name = new Identifier(eventDeclaration., AstLocation.Empty);
return EndNode(eventDeclaration, result); return EndNode<EventDeclaration>(eventDeclaration, null);
} }
public AstNode VisitCustomEventDeclaration(CSharp.CustomEventDeclaration customEventDeclaration, object data) public AstNode VisitCustomEventDeclaration(CSharp.CustomEventDeclaration customEventDeclaration, object data)
{ {
var result = new EventDeclaration(); var result = new EventDeclaration();
members.Push(new MemberInfo());
ConvertNodes(customEventDeclaration.Attributes, result.Attributes); ConvertNodes(customEventDeclaration.Attributes, result.Attributes);
result.Modifiers = ConvertModifiers(customEventDeclaration.Modifiers, customEventDeclaration); result.Modifiers = ConvertModifiers(customEventDeclaration.Modifiers, customEventDeclaration);
result.IsCustom = true; result.IsCustom = true;
@ -1222,6 +1243,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
result.AddHandlerBlock = (Accessor)customEventDeclaration.AddAccessor.AcceptVisitor(this, data); result.AddHandlerBlock = (Accessor)customEventDeclaration.AddAccessor.AcceptVisitor(this, data);
result.RemoveHandlerBlock = (Accessor)customEventDeclaration.RemoveAccessor.AcceptVisitor(this, data); result.RemoveHandlerBlock = (Accessor)customEventDeclaration.RemoveAccessor.AcceptVisitor(this, data);
members.Pop();
return EndNode(customEventDeclaration, result); return EndNode(customEventDeclaration, result);
} }
@ -1229,10 +1252,14 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
var decl = new FieldDeclaration(); var decl = new FieldDeclaration();
members.Push(new MemberInfo());
ConvertNodes(fieldDeclaration.Attributes, decl.Attributes); ConvertNodes(fieldDeclaration.Attributes, decl.Attributes);
decl.Modifiers = ConvertModifiers(fieldDeclaration.Modifiers, fieldDeclaration); decl.Modifiers = ConvertModifiers(fieldDeclaration.Modifiers, fieldDeclaration);
ConvertNodes(fieldDeclaration.Variables, decl.Variables); ConvertNodes(fieldDeclaration.Variables, decl.Variables);
members.Pop();
return EndNode(fieldDeclaration, decl); return EndNode(fieldDeclaration, decl);
} }
@ -1240,6 +1267,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
var decl = new PropertyDeclaration(); var decl = new PropertyDeclaration();
members.Push(new MemberInfo());
ConvertNodes(indexerDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), decl.Attributes); ConvertNodes(indexerDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), decl.Attributes);
decl.Getter = (Accessor)indexerDeclaration.Getter.AcceptVisitor(this, data); decl.Getter = (Accessor)indexerDeclaration.Getter.AcceptVisitor(this, data);
decl.Modifiers = ConvertModifiers(indexerDeclaration.Modifiers, indexerDeclaration); decl.Modifiers = ConvertModifiers(indexerDeclaration.Modifiers, indexerDeclaration);
@ -1260,6 +1289,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
}); });
} }
members.Pop();
return EndNode(indexerDeclaration, decl); return EndNode(indexerDeclaration, decl);
} }
@ -1267,6 +1298,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
var result = new MethodDeclaration(); var result = new MethodDeclaration();
members.Push(new MemberInfo());
ConvertNodes(methodDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), result.Attributes); ConvertNodes(methodDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), result.Attributes);
ConvertNodes(methodDeclaration.ModifierTokens, result.ModifierTokens); ConvertNodes(methodDeclaration.ModifierTokens, result.ModifierTokens);
result.Name = new Identifier(methodDeclaration.Name, AstLocation.Empty); result.Name = new Identifier(methodDeclaration.Name, AstLocation.Empty);
@ -1282,9 +1315,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
result.ReturnType = (AstType)methodDeclaration.ReturnType.AcceptVisitor(this, data); result.ReturnType = (AstType)methodDeclaration.ReturnType.AcceptVisitor(this, data);
result.Body = (BlockStatement)methodDeclaration.Body.AcceptVisitor(this, data); result.Body = (BlockStatement)methodDeclaration.Body.AcceptVisitor(this, data);
if (inIterator) { if (members.Pop().inIterator) {
result.Modifiers |= Modifiers.Iterator; result.Modifiers |= Modifiers.Iterator;
inIterator = false;
} }
return EndNode(methodDeclaration, result); return EndNode(methodDeclaration, result);
@ -1299,6 +1331,9 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitOperatorDeclaration(CSharp.OperatorDeclaration operatorDeclaration, object data) public AstNode VisitOperatorDeclaration(CSharp.OperatorDeclaration operatorDeclaration, object data)
{ {
var result = new OperatorDeclaration(); var result = new OperatorDeclaration();
members.Push(new MemberInfo());
ConvertNodes(operatorDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), result.Attributes); ConvertNodes(operatorDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), result.Attributes);
ConvertNodes(operatorDeclaration.ModifierTokens, result.ModifierTokens); ConvertNodes(operatorDeclaration.ModifierTokens, result.ModifierTokens);
switch (operatorDeclaration.OperatorType) { switch (operatorDeclaration.OperatorType) {
@ -1381,6 +1416,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
result.ReturnType = (AstType)operatorDeclaration.ReturnType.AcceptVisitor(this, data); result.ReturnType = (AstType)operatorDeclaration.ReturnType.AcceptVisitor(this, data);
result.Body = (BlockStatement)operatorDeclaration.Body.AcceptVisitor(this, data); result.Body = (BlockStatement)operatorDeclaration.Body.AcceptVisitor(this, data);
members.Pop();
return EndNode(operatorDeclaration, result); return EndNode(operatorDeclaration, result);
} }
@ -1427,6 +1464,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
{ {
var decl = new PropertyDeclaration(); var decl = new PropertyDeclaration();
members.Push(new MemberInfo());
ConvertNodes(propertyDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), decl.Attributes); ConvertNodes(propertyDeclaration.Attributes.Where(section => section.AttributeTarget != "return"), decl.Attributes);
decl.Getter = (Accessor)propertyDeclaration.Getter.AcceptVisitor(this, data); decl.Getter = (Accessor)propertyDeclaration.Getter.AcceptVisitor(this, data);
decl.Modifiers = ConvertModifiers(propertyDeclaration.Modifiers, propertyDeclaration); decl.Modifiers = ConvertModifiers(propertyDeclaration.Modifiers, propertyDeclaration);
@ -1446,9 +1485,8 @@ namespace ICSharpCode.NRefactory.VB.Visitors
}); });
} }
if (inIterator) { if (members.Pop().inIterator) {
decl.Modifiers |= Modifiers.Iterator; decl.Modifiers |= Modifiers.Iterator;
inIterator = false;
} }
return EndNode(propertyDeclaration, decl); return EndNode(propertyDeclaration, decl);

Loading…
Cancel
Save