Skip to content

Commit 7e3d1eb

Browse files
committed
C# -> VB: fully qualify generated methods
1 parent 4dad869 commit 7e3d1eb

5 files changed

Lines changed: 52 additions & 38 deletions

File tree

ICSharpCode.CodeConverter/VB/CommonConversions.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -567,22 +567,21 @@ private static bool KeywordRequiresEscaping(SyntaxToken id)
567567
}
568568

569569

570-
public static ExpressionSyntax Literal(object o, string valueText = null) => GetLiteralExpression(o, valueText);
570+
public ExpressionSyntax Literal(object o, string valueText = null) => GetLiteralExpression(o, valueText, VbSyntaxGenerator);
571571

572-
internal static ExpressionSyntax GetLiteralExpression(object value, string valueText = null)
572+
internal static ExpressionSyntax GetLiteralExpression(object value, string valueText, SyntaxGenerator generator)
573573
{
574574
if (value is char)
575-
return SyntaxFactory.LiteralExpression(SyntaxKind.CharacterLiteralExpression, SyntaxFactory.Literal((char)value));
575+
return (ExpressionSyntax)generator.LiteralExpression((char)value);
576576

577577
if (value is string)
578-
return SyntaxFactory.LiteralExpression(SyntaxKind.StringLiteralExpression, SyntaxFactory.Literal((string)value));
578+
return (ExpressionSyntax)generator.LiteralExpression((string)value);
579579

580580
if (value == null)
581-
return SyntaxFactory.NothingLiteralExpression(SyntaxFactory.Token(SyntaxKind.NothingKeyword));
581+
return (ExpressionSyntax)generator.NullLiteralExpression();
582582

583583
if (value is bool)
584-
return (bool)value ? SyntaxFactory.TrueLiteralExpression(SyntaxFactory.Token(SyntaxKind.TrueKeyword)) : SyntaxFactory.FalseLiteralExpression(SyntaxFactory.Token(SyntaxKind.FalseKeyword));
585-
584+
return (ExpressionSyntax)((bool)value ? generator.TrueLiteralExpression() : generator.FalseLiteralExpression());
586585

587586
valueText = valueText != null ? ConvertNumericLiteralValueText(valueText) : value.ToString();
588587

ICSharpCode.CodeConverter/VB/MethodBodyExecutableStatementVisitor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public override SyntaxList<StatementSyntax> VisitForStatement(CSS.ForStatementSy
281281
} else {
282282
var stmts = SyntaxFactory.List(convertedStatements)
283283
.AddRange(node.Incrementors.Select(ConvertSingleExpression));
284-
var condition = node.Condition == null ? CommonConversions.Literal(true) : (ExpressionSyntax)node.Condition.Accept(_nodesVisitor);
284+
var condition = node.Condition == null ? _commonConversions.Literal(true) : (ExpressionSyntax)node.Condition.Accept(_nodesVisitor);
285285
block = SyntaxFactory.WhileBlock(
286286
SyntaxFactory.WhileStatement(condition),
287287
stmts
@@ -344,13 +344,13 @@ private bool ConvertForToSimpleForNextWithoutStatements(CSS.ForStatementSyntax n
344344
if (condition.IsKind(CS.SyntaxKind.GreaterThanOrEqualExpression))
345345
end = (ExpressionSyntax)condition.Right.Accept(_nodesVisitor);
346346
else if (condition.IsKind(CS.SyntaxKind.GreaterThanExpression))
347-
end = SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression, (ExpressionSyntax)condition.Right.Accept(_nodesVisitor), SyntaxFactory.Token(SyntaxKind.PlusToken), CommonConversions.Literal(1));
347+
end = SyntaxFactory.BinaryExpression(SyntaxKind.AddExpression, (ExpressionSyntax)condition.Right.Accept(_nodesVisitor), SyntaxFactory.Token(SyntaxKind.PlusToken), _commonConversions.Literal(1));
348348
else return false;
349349
} else {
350350
if (condition.IsKind(CS.SyntaxKind.LessThanOrEqualExpression))
351351
end = (ExpressionSyntax)condition.Right.Accept(_nodesVisitor);
352352
else if (condition.IsKind(CS.SyntaxKind.LessThanExpression))
353-
end = SyntaxFactory.BinaryExpression(SyntaxKind.SubtractExpression, (ExpressionSyntax)condition.Right.Accept(_nodesVisitor), SyntaxFactory.Token(SyntaxKind.MinusToken), CommonConversions.Literal(1));
353+
end = SyntaxFactory.BinaryExpression(SyntaxKind.SubtractExpression, (ExpressionSyntax)condition.Right.Accept(_nodesVisitor), SyntaxFactory.Token(SyntaxKind.MinusToken), _commonConversions.Literal(1));
354354
else return false;
355355
}
356356

@@ -379,7 +379,7 @@ private bool ConvertForToSimpleForNextWithoutStatements(CSS.ForStatementSyntax n
379379
}
380380

381381
blockWithoutStatements = SyntaxFactory.ForBlock(
382-
SyntaxFactory.ForStatement(variable, start, end, step == 1 ? null : SyntaxFactory.ForStepClause(CommonConversions.Literal(step))),
382+
SyntaxFactory.ForStatement(variable, start, end, step == 1 ? null : SyntaxFactory.ForStepClause(_commonConversions.Literal(step))),
383383
SyntaxFactory.List<StatementSyntax>(),
384384
SyntaxFactory.NextStatement()
385385
);

ICSharpCode.CodeConverter/VB/NodesVisitor.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ public override VisualBasicSyntaxNode VisitLiteralExpression(CSS.LiteralExpressi
846846
)
847847
);
848848
} else {
849-
return CommonConversions.Literal(node.Token.Value, node.Token.Text);
849+
return _commonConversions.Literal(node.Token.Value, node.Token.Text);
850850
}
851851
}
852852

@@ -915,7 +915,7 @@ public override VisualBasicSyntaxNode VisitPrefixUnaryExpression(CSS.PrefixUnary
915915
return SyntaxFactory.AssignmentStatement(
916916
kind,
917917
(ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor),
918-
SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(kind)), CommonConversions.Literal(1)
918+
SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(kind)), _commonConversions.Literal(1)
919919
);
920920
}
921921
if (kind == SyntaxKind.AddAssignmentStatement || kind == SyntaxKind.SubtractAssignmentStatement) {
@@ -925,12 +925,15 @@ public override VisualBasicSyntaxNode VisitPrefixUnaryExpression(CSS.PrefixUnary
925925
else
926926
operatorName = "Decrement";
927927
return SyntaxFactory.InvocationExpression(
928-
SyntaxFactory.ParseName(nameof(System) + "." + nameof(System.Threading) + "." + nameof(System.Threading.Interlocked) + "." + operatorName),
928+
SyntaxFactory.ParseName(GetQualifiedName(nameof(System), nameof(System.Threading), nameof(System.Threading.Interlocked), operatorName)),
929929
ExpressionSyntaxExtensions.CreateArgList((ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor))
930930
);
931931
}
932932
return SyntaxFactory.UnaryExpression(kind, SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(kind)), (ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor));
933933
}
934+
private static string GetQualifiedName(params string[] names) {
935+
return names.Aggregate((seed, current) => seed + '.' + current);
936+
}
934937

935938
public override VisualBasicSyntaxNode VisitAssignmentExpression(CSS.AssignmentExpressionSyntax node)
936939
{
@@ -1003,7 +1006,7 @@ public override VisualBasicSyntaxNode VisitPostfixUnaryExpression(CSS.PostfixUna
10031006
if (IsReturnValueDiscarded(node)) {
10041007
return SyntaxFactory.AssignmentStatement(CS.CSharpExtensions.Kind(node).ConvertToken(TokenContext.Local),
10051008
(ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor),
1006-
SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(kind)), CommonConversions.Literal(1)
1009+
SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(kind)), _commonConversions.Literal(1)
10071010
);
10081011
} else {
10091012
string operatorName, minMax;
@@ -1018,13 +1021,13 @@ public override VisualBasicSyntaxNode VisitPostfixUnaryExpression(CSS.PostfixUna
10181021
op = SyntaxKind.AddExpression;
10191022
}
10201023
return SyntaxFactory.InvocationExpression(
1021-
SyntaxFactory.ParseName(nameof(Math) + "." + minMax),
1024+
SyntaxFactory.ParseName(GetQualifiedName(nameof(System), nameof(Math), minMax)),
10221025
new ExpressionSyntax[] {
10231026
SyntaxFactory.InvocationExpression(
1024-
SyntaxFactory.ParseName("System.Threading.Interlocked." + operatorName),
1027+
SyntaxFactory.ParseName(GetQualifiedName(nameof(System), nameof(System.Threading), nameof(System.Threading.Interlocked), operatorName)),
10251028
ExpressionSyntaxExtensions.CreateArgList((ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor))
10261029
),
1027-
SyntaxFactory.BinaryExpression(op, (ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor), SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(op)), CommonConversions.Literal(1))
1030+
SyntaxFactory.BinaryExpression(op, (ExpressionSyntax)node.Operand.Accept(TriviaConvertingVisitor), SyntaxFactory.Token(VBUtil.GetExpressionOperatorTokenKind(op)), _commonConversions.Literal(1))
10281031
}.CreateArgList()
10291032
);
10301033
}
@@ -1262,7 +1265,7 @@ public override VisualBasicSyntaxNode VisitCastExpression(CSS.CastExpressionSynt
12621265
var expr = (ExpressionSyntax)node.Expression.Accept(TriviaConvertingVisitor);
12631266
Func<SyntaxKind, VisualBasicSyntaxNode> toNumber = kind => {
12641267
if (sourceType?.SpecialType == SpecialType.System_Char)
1265-
return SyntaxFactory.InvocationExpression(SyntaxFactory.ParseName(nameof(Strings.AscW)), ExpressionSyntaxExtensions.CreateArgList(expr));
1268+
return SyntaxFactory.InvocationExpression(SyntaxFactory.ParseName(GetQualifiedName(nameof(Microsoft), nameof(Microsoft.VisualBasic), nameof(Microsoft.VisualBasic.Strings.AscW))), ExpressionSyntaxExtensions.CreateArgList(expr));
12661269
return SyntaxFactory.PredefinedCastExpression(SyntaxFactory.Token(kind), expr);
12671270
};
12681271
switch (destType.SpecialType) {
@@ -1272,7 +1275,7 @@ public override VisualBasicSyntaxNode VisitCastExpression(CSS.CastExpressionSynt
12721275
return SyntaxFactory.PredefinedCastExpression(SyntaxFactory.Token(SyntaxKind.CBoolKeyword), expr);
12731276
case SpecialType.System_Char:
12741277
return sourceType?.IsNumericType() == true
1275-
? (VisualBasicSyntaxNode)SyntaxFactory.InvocationExpression(SyntaxFactory.ParseName(nameof(Strings.ChrW)), ExpressionSyntaxExtensions.CreateArgList(expr))
1278+
? (VisualBasicSyntaxNode)SyntaxFactory.InvocationExpression(SyntaxFactory.ParseName(GetQualifiedName(nameof(Microsoft), nameof(Microsoft.VisualBasic), nameof(Microsoft.VisualBasic.Strings.ChrW))), ExpressionSyntaxExtensions.CreateArgList(expr))
12761279
: SyntaxFactory.PredefinedCastExpression(SyntaxFactory.Token(SyntaxKind.CCharKeyword), expr);
12771280
case SpecialType.System_SByte:
12781281
return toNumber(SyntaxKind.CSByteKeyword);

Tests/VB/SpecialConversionTests.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ End Class
3838
public async Task TestSimplePostIncrementAssign()
3939
{
4040
await TestConversionCSharpToVisualBasic(
41-
@"class TestClass
42-
{
41+
@"class TestClass{
4342
void TestMethod()
4443
{
4544
int a = 5, b;
4645
b = a++;
4746
}
48-
}", @"Friend Class TestClass
47+
}",
48+
@"Friend Class TestClass
4949
Private Sub TestMethod()
5050
Dim b As Integer, a As Integer = 5
51-
b = Math.Min(Threading.Interlocked.Increment(a), a - 1)
51+
b = System.Math.Min(System.Threading.Interlocked.Increment(a), a - 1)
5252
End Sub
53-
End Class");
53+
End Class", conversion: EmptyNamespaceOptionStrictOff);
5454
}
5555

5656
[Fact]
@@ -539,5 +539,21 @@ End Property
539539
End Class
540540
End Namespace");
541541
}
542+
[Fact]
543+
public async Task ConstantsShouldBeQualified() {
544+
await TestConversionCSharpToVisualBasic(
545+
@"public class TestClass {
546+
public void Method() {
547+
string vbLf = ""\n""
548+
string vbCrLf = ""\r\n"";
549+
}
550+
}",
551+
@"Public Class TestClass
552+
Public Sub Method()
553+
Dim vbLf As String = Microsoft.VisualBasic.vbLf
554+
Dim vbCrLf As String = Microsoft.VisualBasic.vbCrLf
555+
End Sub
556+
End Class", conversion: EmptyNamespaceOptionStrictOff);
557+
}
542558
}
543559
}

Tests/VB/TypeCastTests.cs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,28 +145,24 @@ End Sub
145145
public async Task CastConstantNumberToCharacter()
146146
{
147147
await TestConversionCSharpToVisualBasic(
148-
@"void Test()
149-
{
148+
@"void Test() {
150149
char CR = (char)0xD;
151-
}
152-
", @"Private Sub Test()
153-
Dim CR As Char = ChrW(&HD)
154-
End Sub
155-
");
150+
}",
151+
@"Private Sub Test()
152+
Dim CR As Char = Microsoft.VisualBasic.ChrW(&HD)
153+
End Sub", conversion: EmptyNamespaceOptionStrictOff);
156154
}
157155
[Fact]
158156
public async Task CastCharacterToNumber() {
159157
await TestConversionCSharpToVisualBasic(
160158
@"void Test() {
161159
byte a = (byte)'A';
162160
decimal b = (byte)'B';
163-
}
164-
",
161+
}",
165162
@"Private Sub Test()
166-
Dim a As Byte = AscW(""A""c)
167-
Dim b As Decimal = AscW(""B""c)
168-
End Sub
169-
");
163+
Dim a As Byte = Microsoft.VisualBasic.AscW(""A""c)
164+
Dim b As Decimal = Microsoft.VisualBasic.AscW(""B""c)
165+
End Sub", conversion: EmptyNamespaceOptionStrictOff);
170166
}
171167
[Fact(Skip="Many code generation")]
172168
public async Task CastCharacterIncrement() {

0 commit comments

Comments
 (0)