diff --git a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs index ff378b376b..c76643c53e 100644 --- a/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs +++ b/ICSharpCode.NRefactory.VB/OutputVisitor/OutputVisitor.cs @@ -526,15 +526,17 @@ namespace ICSharpCode.NRefactory.VB } WriteHandlesClause(methodDeclaration.HandlesClause); WriteImplementsClause(methodDeclaration.ImplementsClause); - NewLine(); - Indent(); - WriteBlock(methodDeclaration.Body); - Unindent(); - WriteKeyword("End"); - if (methodDeclaration.IsSub) - WriteKeyword("Sub"); - else - WriteKeyword("Function"); + if (!methodDeclaration.Body.IsNull) { + NewLine(); + Indent(); + WriteBlock(methodDeclaration.Body); + Unindent(); + WriteKeyword("End"); + if (methodDeclaration.IsSub) + WriteKeyword("Sub"); + else + WriteKeyword("Function"); + } NewLine(); return EndNode(methodDeclaration); @@ -1317,20 +1319,25 @@ namespace ICSharpCode.NRefactory.VB WriteAttributes(propertyDeclaration.ReturnTypeAttributes); propertyDeclaration.ReturnType.AcceptVisitor(this, data); } - NewLine(); - Indent(); - if (!propertyDeclaration.Getter.IsNull) { - propertyDeclaration.Getter.AcceptVisitor(this, data); - } + bool needsBody = !propertyDeclaration.Getter.Body.IsNull || !propertyDeclaration.Setter.Body.IsNull; - if (!propertyDeclaration.Setter.IsNull) { - propertyDeclaration.Setter.AcceptVisitor(this, data); + if (needsBody) { + NewLine(); + Indent(); + + if (!propertyDeclaration.Getter.Body.IsNull) { + propertyDeclaration.Getter.AcceptVisitor(this, data); + } + + if (!propertyDeclaration.Setter.Body.IsNull) { + propertyDeclaration.Setter.AcceptVisitor(this, data); + } + Unindent(); + + WriteKeyword("End"); + WriteKeyword("Property"); } - Unindent(); - - WriteKeyword("End"); - WriteKeyword("Property"); NewLine(); return EndNode(propertyDeclaration); diff --git a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index 680b88ce74..4f5c37203a 100644 --- a/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -272,7 +272,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors var expr = new ObjectCreationExpression((AstType)objectCreateExpression.Type.AcceptVisitor(this, data)); ConvertNodes(objectCreateExpression.Arguments, expr.Arguments); if (!objectCreateExpression.Initializer.IsNull) - expr.Initializer = (ArrayInitializerExpression)objectCreateExpression.Initializer.AcceptVisitor(this, data); + expr.Initializer = (ArrayInitializerExpression)objectCreateExpression.Initializer.AcceptVisitor(this, data); return EndNode(objectCreateExpression, expr); } @@ -1101,10 +1101,49 @@ namespace ICSharpCode.NRefactory.VB.Visitors mod |= Modifiers.Friend; if ((modifier & CSharp.Modifiers.Private) == CSharp.Modifiers.Private) mod |= Modifiers.Private; + if (container is CSharp.IndexerDeclaration) + mod |= Modifiers.Default; + bool writeable = IsWriteableProperty(container); + bool readable = IsReadableProperty(container); + if (writeable && !readable) + mod |= Modifiers.WriteOnly; + if (readable && !writeable) + mod |= Modifiers.ReadOnly; + return mod; } + bool IsReadableProperty(ICSharpCode.NRefactory.CSharp.AstNode container) + { + if (container is CSharp.IndexerDeclaration) { + var i = container as CSharp.IndexerDeclaration; + return !i.Getter.IsNull; + } + + if (container is CSharp.PropertyDeclaration) { + var p = container as CSharp.PropertyDeclaration; + return !p.Getter.IsNull; + } + + return false; + } + + bool IsWriteableProperty(ICSharpCode.NRefactory.CSharp.AstNode container) + { + if (container is CSharp.IndexerDeclaration) { + var i = container as CSharp.IndexerDeclaration; + return !i.Setter.IsNull; + } + + if (container is CSharp.PropertyDeclaration) { + var p = container as CSharp.PropertyDeclaration; + return !p.Setter.IsNull; + } + + return false; + } + public AstNode VisitIdentifier(CSharp.Identifier identifier, object data) { var ident = new Identifier(identifier.Name, ConvertLocation(identifier.StartLocation));