Skip to content

Commit 4dad869

Browse files
committed
C# -> VB: add partial methods
1 parent 6dd5500 commit 4dad869

3 files changed

Lines changed: 27 additions & 19 deletions

File tree

ICSharpCode.CodeConverter/VB/CommonConversions.cs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -405,24 +405,20 @@ public void ConvertBaseList(CSS.BaseTypeDeclarationSyntax type, List<InheritsSta
405405
}
406406

407407

408-
private static IEnumerable<SyntaxToken> ConvertModifiersCore(IReadOnlyCollection<SyntaxToken> modifiers,
409-
TokenContext context, bool isConstructor)
410-
{
411-
if (context != TokenContext.Local && context != TokenContext.MemberInInterface && context != TokenContext.MemberInProperty) {
412-
bool visibility = false;
413-
foreach (var token in modifiers) {
414-
if (token.IsCsVisibility(true, isConstructor)) { //TODO Don't always treat as variable or const, pass in more context to detect this
415-
visibility = true;
416-
break;
417-
}
418-
}
419-
if (!visibility)
420-
yield return CSharpDefaultVisibility(context);
421-
}
422-
foreach (var token in modifiers.Where(m => !IgnoreInContext(m, context))) {
423-
var m = ConvertModifier(token, context);
424-
if (m.HasValue) yield return m.Value;
425-
}
408+
private static IEnumerable<SyntaxToken> ConvertModifiersCore(IReadOnlyCollection<SyntaxToken> modifiers, TokenContext context, bool isConstructor) {
409+
var needsExplicitVisibility = context != TokenContext.Local
410+
&& context != TokenContext.MemberInInterface
411+
&& context != TokenContext.MemberInProperty
412+
&& !modifiers.Any(x => x.IsCsVisibility(true, isConstructor)); //TODO Don't always treat as variable or const, pass in more context to detect this
413+
var vbModifiers = modifiers
414+
.Where(m => !IgnoreInContext(m, context))
415+
.Select(x => ConvertModifier(x, context))
416+
.Where(x => x.HasValue)
417+
.Select(x => x.Value)
418+
.ToList();
419+
if(needsExplicitVisibility)
420+
vbModifiers.Insert(vbModifiers.FirstOrDefault().IsKind(SyntaxKind.PartialKeyword) ? 1 : 0, CSharpDefaultVisibility(context));
421+
return vbModifiers;
426422
}
427423

428424
private static bool IgnoreInContext(SyntaxToken m, TokenContext context)

ICSharpCode.CodeConverter/VB/NodesVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ public override VisualBasicSyntaxNode VisitDestructorDeclaration(CSS.DestructorD
431431
public override VisualBasicSyntaxNode VisitMethodDeclaration(CSS.MethodDeclarationSyntax node)
432432
{
433433
var isIteratorState = new MethodBodyExecutableStatementVisitor(_semanticModel, TriviaConvertingVisitor, TriviaConvertingVisitor.TriviaConverter, _commonConversions);
434-
bool requiresBody = node.Body != null || node.ExpressionBody != null || node.Modifiers.Any(m => SyntaxTokenExtensions.IsKind(m, CS.SyntaxKind.ExternKeyword));
434+
bool requiresBody = node.Body != null || node.ExpressionBody != null || node.Modifiers.Any(m => SyntaxTokenExtensions.IsKind(m, CS.SyntaxKind.ExternKeyword, CS.SyntaxKind.PartialKeyword));
435435
var block = _commonConversions.ConvertBody(node.Body, node.ExpressionBody, isIteratorState);
436436
var id = _commonConversions.ConvertIdentifier(node.Identifier);
437437
var attributes = SyntaxFactory.List(node.AttributeLists.Select(a => (AttributeListSyntax)a.Accept(TriviaConvertingVisitor)));

Tests/VB/MemberTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,5 +1293,17 @@ await TestConversionCSharpToVisualBasic(
12931293
WriteOnly Property Parameters As IEnumerable(Of Object)
12941294
End Interface");
12951295
}
1296+
[Fact]
1297+
public async Task PartialMethod() {
1298+
await TestConversionCSharpToVisualBasic(
1299+
@"public partial class Entities {
1300+
partial void OnContextCreated();
1301+
}",
1302+
@"Public Partial Class Entities
1303+
Partial Private Sub OnContextCreated()
1304+
End Sub
1305+
End Class");
1306+
}
1307+
12961308
}
12971309
}

0 commit comments

Comments
 (0)