Browse Source

implement translation of EnumDeclaration

pull/254/head
Siegfried Pammer 14 years ago
parent
commit
5f6386aed6
  1. 4
      NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs
  2. 41
      NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs
  3. 86
      NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs

4
NRefactory/ICSharpCode.NRefactory.VB/Ast/GlobalScope/EnumDeclaration.cs

@ -22,7 +22,7 @@ namespace ICSharpCode.NRefactory.VB.Ast
set { SetChildByRole(UnderlyingTypeRole, value); } set { SetChildByRole(UnderlyingTypeRole, value); }
} }
public AstNodeCollection<EnumMemberDeclaration> Member { public AstNodeCollection<EnumMemberDeclaration> Members {
get { return GetChildrenByRole(MemberRole); } get { return GetChildrenByRole(MemberRole); }
} }
@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.VB.Ast
MatchAttributesAndModifiers(decl, match) && MatchAttributesAndModifiers(decl, match) &&
Name.DoMatch(decl.Name, match) && Name.DoMatch(decl.Name, match) &&
UnderlyingType.DoMatch(decl.UnderlyingType, match) && UnderlyingType.DoMatch(decl.UnderlyingType, match) &&
Member.DoMatch(decl.Member, match); Members.DoMatch(decl.Members, match);
} }
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data)

41
NRefactory/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs

@ -241,6 +241,7 @@ namespace ICSharpCode.NRefactory.VB
case ICSharpCode.NRefactory.TypeSystem.ClassType.Enum: case ICSharpCode.NRefactory.TypeSystem.ClassType.Enum:
break; break;
case ICSharpCode.NRefactory.TypeSystem.ClassType.Interface: case ICSharpCode.NRefactory.TypeSystem.ClassType.Interface:
WriteKeyword("Interface");
break; break;
case ICSharpCode.NRefactory.TypeSystem.ClassType.Struct: case ICSharpCode.NRefactory.TypeSystem.ClassType.Struct:
WriteKeyword("Structure"); WriteKeyword("Structure");
@ -262,12 +263,48 @@ namespace ICSharpCode.NRefactory.VB
public object VisitEnumDeclaration(EnumDeclaration enumDeclaration, object data) 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) 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) public object VisitDelegateDeclaration(DelegateDeclaration delegateDeclaration, object data)

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

@ -314,39 +314,59 @@ namespace ICSharpCode.NRefactory.VB.Visitors
public AstNode VisitTypeDeclaration(CSharp.TypeDeclaration typeDeclaration, object data) public AstNode VisitTypeDeclaration(CSharp.TypeDeclaration typeDeclaration, object data)
{ {
// TODO add missing features! // TODO add missing features!
var type = new TypeDeclaration();
CSharp.Attribute stdModAttr; if (typeDeclaration.ClassType == ClassType.Enum) {
var type = new EnumDeclaration();
if (typeDeclaration.ClassType == ClassType.Class && HasAttribute(typeDeclaration.Attributes, "Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute", out stdModAttr)) {
type.ClassType = ClassType.Module; ConvertNodes(typeDeclaration.Attributes, type.Attributes);
// remove AttributeSection if only one attribute is present ConvertNodes(typeDeclaration.ModifierTokens, type.ModifierTokens);
var attrSec = (CSharp.AttributeSection)stdModAttr.Parent;
if (attrSec.Attributes.Count == 1) if (typeDeclaration.BaseTypes.Any()) {
attrSec.Remove(); var first = typeDeclaration.BaseTypes.First();
else
stdModAttr.Remove(); type.UnderlyingType = (AstType)first.AcceptVisitor(this, data);
} else }
type.ClassType = typeDeclaration.ClassType;
type.Name = new Identifier(typeDeclaration.Name, AstLocation.Empty);
ConvertNodes(typeDeclaration.Attributes, type.Attributes);
ConvertNodes(typeDeclaration.ModifierTokens, type.ModifierTokens); ConvertNodes(typeDeclaration.Members, type.Members);
if (typeDeclaration.BaseTypes.Any()) { return EndNode(typeDeclaration, type);
var first = typeDeclaration.BaseTypes.First(); } else {
var type = new TypeDeclaration();
CSharp.Attribute stdModAttr;
if (provider.GetClassTypeForAstType(first) != ClassType.Interface) { if (typeDeclaration.ClassType == ClassType.Class && HasAttribute(typeDeclaration.Attributes, "Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute", out stdModAttr)) {
ConvertNodes(typeDeclaration.BaseTypes.Skip(1), type.ImplementsTypes); type.ClassType = ClassType.Module;
type.InheritsType = (AstType)first.AcceptVisitor(this, data); // 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 } 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) 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) 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) public AstNode VisitEventDeclaration(CSharp.EventDeclaration eventDeclaration, object data)

Loading…
Cancel
Save