From 5f6386aed69f686c4bfb0f5a3940844ee80141be Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 15 May 2011 16:42:15 +0200 Subject: [PATCH] implement translation of EnumDeclaration --- .../Ast/GlobalScope/EnumDeclaration.cs | 4 +- .../OutputVisitor/OutputVisitor.cs | 41 ++++++++- .../Visitors/CSharpToVBConverterVisitor.cs | 86 ++++++++++++------- 3 files changed, 97 insertions(+), 34 deletions(-) diff --git a/NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs b/NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs index 49fe3f239..b24fc4b23 100644 --- a/NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs +++ b/NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.NRefactory.VB.Ast set { SetChildByRole(UnderlyingTypeRole, value); } } - public AstNodeCollection Member { + public AstNodeCollection Members { get { return GetChildrenByRole(MemberRole); } } @@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.VB.Ast MatchAttributesAndModifiers(decl, match) && Name.DoMatch(decl.Name, match) && UnderlyingType.DoMatch(decl.UnderlyingType, match) && - Member.DoMatch(decl.Member, match); + Members.DoMatch(decl.Members, match); } public override S AcceptVisitor(IAstVisitor visitor, T data) diff --git a/NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs b/NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs index 94efbb685..7d069f9fd 100644 --- a/NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs +++ b/NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs @@ -241,6 +241,7 @@ namespace ICSharpCode.NRefactory.VB case ICSharpCode.NRefactory.TypeSystem.ClassType.Enum: break; case ICSharpCode.NRefactory.TypeSystem.ClassType.Interface: + WriteKeyword("Interface"); break; case ICSharpCode.NRefactory.TypeSystem.ClassType.Struct: WriteKeyword("Structure"); @@ -262,12 +263,48 @@ namespace ICSharpCode.NRefactory.VB public object VisitEnumDeclaration(EnumDeclaration enumDeclaration, object data) { - throw new NotImplementedException(); + StartNode(enumDeclaration); + + WriteAttributes(enumDeclaration.Attributes); + WriteModifiers(enumDeclaration.ModifierTokens); + WriteKeyword("Enum"); + WriteIdentifier(enumDeclaration.Name.Name); + if (!enumDeclaration.UnderlyingType.IsNull) { + Space(); + WriteKeyword("As"); + enumDeclaration.UnderlyingType.AcceptVisitor(this, data); + } + NewLine(); + + Indent(); + foreach (var member in enumDeclaration.Members) { + member.AcceptVisitor(this, null); + } + Unindent(); + + WriteKeyword("End"); + WriteKeyword("Enum"); + NewLine(); + + return EndNode(enumDeclaration); } public object VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDeclaration, object data) { - throw new NotImplementedException(); + StartNode(enumMemberDeclaration); + + WriteAttributes(enumMemberDeclaration.Attributes); + WriteIdentifier(enumMemberDeclaration.Name.Name); + + if (!enumMemberDeclaration.Value.IsNull) { + Space(); + WriteToken("=", EnumMemberDeclaration.Roles.Assign); + Space(); + enumMemberDeclaration.Value.AcceptVisitor(this, data); + } + NewLine(); + + return EndNode(enumMemberDeclaration); } public object VisitDelegateDeclaration(DelegateDeclaration delegateDeclaration, object data) diff --git a/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index 43eb59c1a..8a0e33d78 100644 --- a/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -314,39 +314,59 @@ namespace ICSharpCode.NRefactory.VB.Visitors public AstNode VisitTypeDeclaration(CSharp.TypeDeclaration typeDeclaration, object data) { // TODO add missing features! - var type = new TypeDeclaration(); - CSharp.Attribute stdModAttr; - - if (typeDeclaration.ClassType == ClassType.Class && HasAttribute(typeDeclaration.Attributes, "Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute", out stdModAttr)) { - type.ClassType = ClassType.Module; - // remove AttributeSection if only one attribute is present - var attrSec = (CSharp.AttributeSection)stdModAttr.Parent; - if (attrSec.Attributes.Count == 1) - attrSec.Remove(); - else - stdModAttr.Remove(); - } else - type.ClassType = typeDeclaration.ClassType; - - ConvertNodes(typeDeclaration.Attributes, type.Attributes); - ConvertNodes(typeDeclaration.ModifierTokens, type.ModifierTokens); - - if (typeDeclaration.BaseTypes.Any()) { - var first = typeDeclaration.BaseTypes.First(); + if (typeDeclaration.ClassType == ClassType.Enum) { + var type = new EnumDeclaration(); + + ConvertNodes(typeDeclaration.Attributes, type.Attributes); + ConvertNodes(typeDeclaration.ModifierTokens, type.ModifierTokens); + + if (typeDeclaration.BaseTypes.Any()) { + var first = typeDeclaration.BaseTypes.First(); + + type.UnderlyingType = (AstType)first.AcceptVisitor(this, data); + } + + type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty); + + ConvertNodes(typeDeclaration.Members, type.Members); + + return EndNode(typeDeclaration, type); + } else { + var type = new TypeDeclaration(); + + CSharp.Attribute stdModAttr; - if (provider.GetClassTypeForAstType(first) != ClassType.Interface) { - ConvertNodes(typeDeclaration.BaseTypes.Skip(1), type.ImplementsTypes); - type.InheritsType = (AstType)first.AcceptVisitor(this, data); + if (typeDeclaration.ClassType == ClassType.Class && HasAttribute(typeDeclaration.Attributes, "Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute", out stdModAttr)) { + type.ClassType = ClassType.Module; + // remove AttributeSection if only one attribute is present + var attrSec = (CSharp.AttributeSection)stdModAttr.Parent; + if (attrSec.Attributes.Count == 1) + attrSec.Remove(); + else + stdModAttr.Remove(); } else - ConvertNodes(typeDeclaration.BaseTypes, type.ImplementsTypes); + type.ClassType = typeDeclaration.ClassType; + + ConvertNodes(typeDeclaration.Attributes, type.Attributes); + ConvertNodes(typeDeclaration.ModifierTokens, type.ModifierTokens); + + if (typeDeclaration.BaseTypes.Any()) { + var first = typeDeclaration.BaseTypes.First(); + + if (provider.GetClassTypeForAstType(first) != ClassType.Interface) { + ConvertNodes(typeDeclaration.BaseTypes.Skip(1), type.ImplementsTypes); + type.InheritsType = (AstType)first.AcceptVisitor(this, data); + } else + ConvertNodes(typeDeclaration.BaseTypes, type.ImplementsTypes); + } + + type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty); + + ConvertNodes(typeDeclaration.Members, type.Members); + + return EndNode(typeDeclaration, type); } - - type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty); - - ConvertNodes(typeDeclaration.Members, type.Members); - - return EndNode(typeDeclaration, type); } public AstNode VisitUsingAliasDeclaration(CSharp.UsingAliasDeclaration usingAliasDeclaration, object data) @@ -565,7 +585,13 @@ namespace ICSharpCode.NRefactory.VB.Visitors public AstNode VisitEnumMemberDeclaration(CSharp.EnumMemberDeclaration enumMemberDeclaration, object data) { - throw new NotImplementedException(); + var result = new EnumMemberDeclaration(); + + ConvertNodes(enumMemberDeclaration.Attributes, result.Attributes); + result.Name = new Identifier(enumMemberDeclaration.Name, AstLocation.Empty); + result.Value = (Expression)enumMemberDeclaration.Initializer.AcceptVisitor(this, data); + + return EndNode(enumMemberDeclaration, result); } public AstNode VisitEventDeclaration(CSharp.EventDeclaration eventDeclaration, object data)