Skip to content

Commit

Permalink
VB -> C#: Operator overload support - fixes #46
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamTheCoder committed Mar 31, 2018
1 parent f35adf0 commit 731a7e6
Show file tree
Hide file tree
Showing 2 changed files with 190 additions and 0 deletions.
31 changes: 31 additions & 0 deletions ICSharpCode.CodeConverter/CSharp/SyntaxKindExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,37 @@ public static SyntaxKind ConvertToken(this Microsoft.CodeAnalysis.VisualBasic.Sy
return SyntaxKind.ExplicitKeyword;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.WideningKeyword:
return SyntaxKind.ImplicitKeyword;
// Operator overloads
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.PlusToken:
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.AmpersandToken:
return SyntaxKind.PlusToken; //Problematic clash if two operator overloads defined
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.MinusToken:
return SyntaxKind.MinusToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.NotKeyword:
return SyntaxKind.ExclamationToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.AsteriskToken:
return SyntaxKind.AsteriskToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.SlashToken:
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.BackslashToken:
return SyntaxKind.SlashToken; //Problematic clash if two operator overloads defined
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.ModKeyword:
return SyntaxKind.PercentToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.LessThanLessThanToken:
return SyntaxKind.LessThanLessThanToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.GreaterThanGreaterThanToken:
return SyntaxKind.GreaterThanGreaterThanToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.EqualsToken:
return SyntaxKind.EqualsEqualsToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.LessThanGreaterThanToken:
return SyntaxKind.ExclamationEqualsToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.GreaterThanToken:
return SyntaxKind.GreaterThanToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.LessThanToken:
return SyntaxKind.LessThanToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.GreaterThanEqualsToken:
return SyntaxKind.GreaterThanEqualsToken;
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.LessThanEqualsToken:
return SyntaxKind.LessThanEqualsToken;
//
case Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.AssemblyKeyword:
return SyntaxKind.AssemblyKeyword;
Expand Down
159 changes: 159 additions & 0 deletions Tests/CSharp/MemberTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,165 @@ public static implicit operator int(MyInt myInt)
}");
}

[Fact]
public void OperatorOverloads()
{
// Note a couple map to the same thing in C# so occasionally the result won't compile. The user can manually decide what to do in such scenarios.
TestConversionVisualBasicToCSharpWithoutComments(@"Public Class AcmeClass
Public Shared Operator +(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator &(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator -(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Not(ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator *(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator /(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator \(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Mod(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <<(ac As AcmeClass, i As Integer) As AcmeClass
Return ac
End Operator
Public Shared Operator >>(ac As AcmeClass, i As Integer) As AcmeClass
Return ac
End Operator
Public Shared Operator =(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <>(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator >(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator <=(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator >=(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
End Class", @"public class AcmeClass
{
public static AcmeClass operator +(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator +(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator -(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator !(AcmeClass ac)
{
return ac;
}
public static AcmeClass operator *(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator /(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator /(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator %(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <<(AcmeClass ac, int i)
{
return ac;
}
public static AcmeClass operator >>(AcmeClass ac, int i)
{
return ac;
}
public static AcmeClass operator ==(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator !=(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator >(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator <=(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator >=(string s, AcmeClass ac)
{
return ac;
}
}");
}

[Fact(Skip = "No obvious C# equivalent")]
public void OperatorOverloadsWithNoCSharpEquivalent()
{
TestConversionVisualBasicToCSharpWithoutComments(@"Public Class AcmeClass
Public Shared Operator ^(i As Integer, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Like(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator And(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
Public Shared Operator Or(s As String, ac As AcmeClass) As AcmeClass
Return ac
End Operator
End Class", @"public class AcmeClass" + /* not valid C#, just a starter */ @"
{
public static AcmeClass operator ^(int i, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator Like(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator And(string s, AcmeClass ac)
{
return ac;
}
public static AcmeClass operator Or(string s, AcmeClass ac)
{
return ac;
}
}");
}

[Fact]
public void ClassWithGloballyQualifiedAttribute()
{
Expand Down

0 comments on commit 731a7e6

Please sign in to comment.