@@ -22,24 +22,26 @@ namespace ICSharpCode.CodeConverter.CSharp
2222{
2323 internal static class VbOperatorConversion
2424 {
25- public static IOperatorConverter Create ( CommentConvertingVisitorWrapper expressionVisitor , SemanticModel semanticModel , VisualBasicEqualityComparison visualBasicEqualityComparison )
25+ public static IOperatorConverter Create ( CommentConvertingVisitorWrapper expressionVisitor , SemanticModel semanticModel , VisualBasicEqualityComparison visualBasicEqualityComparison , TypeConversionAnalyzer typeConversionAnalyzer )
2626 {
27- return new BuiltInVisualBasicOperatorSubsitutions ( expressionVisitor , semanticModel , visualBasicEqualityComparison ) ;
27+ return new BuiltInVisualBasicOperatorSubstitutions ( expressionVisitor , semanticModel , visualBasicEqualityComparison , typeConversionAnalyzer ) ;
2828 }
2929
30- private class BuiltInVisualBasicOperatorSubsitutions : IOperatorConverter
30+ private class BuiltInVisualBasicOperatorSubstitutions : IOperatorConverter
3131 {
3232 private const string _compilerServices = nameof ( Microsoft ) + "." + nameof ( Microsoft . VisualBasic ) + "." + nameof ( Microsoft . VisualBasic . CompilerServices ) ;
3333 private const string _operators = nameof ( Operators ) ;
3434 private readonly SemanticModel _semanticModel ;
3535 private readonly VisualBasicEqualityComparison _visualBasicEqualityComparison ;
3636 private readonly CommentConvertingVisitorWrapper _triviaConvertingVisitor ;
37+ private readonly TypeConversionAnalyzer _typeConversionAnalyzer ;
3738
38- public BuiltInVisualBasicOperatorSubsitutions ( CommentConvertingVisitorWrapper triviaConvertingVisitor , SemanticModel semanticModel , VisualBasicEqualityComparison visualBasicEqualityComparison )
39+ public BuiltInVisualBasicOperatorSubstitutions ( CommentConvertingVisitorWrapper triviaConvertingVisitor , SemanticModel semanticModel , VisualBasicEqualityComparison visualBasicEqualityComparison , TypeConversionAnalyzer typeConversionAnalyzer )
3940 {
4041 _semanticModel = semanticModel ;
4142 _visualBasicEqualityComparison = visualBasicEqualityComparison ;
4243 _triviaConvertingVisitor = triviaConvertingVisitor ;
44+ _typeConversionAnalyzer = typeConversionAnalyzer ;
4345 }
4446
4547 public async Task < ExpressionSyntax > ConvertNothingComparisonOrNullAsync ( VBSyntax . ExpressionSyntax exprNode , bool negateExpression = false )
@@ -93,11 +95,18 @@ private async Task<ExpressionSyntax> ConvertToLikeOperatorAsync(VBSyntax.BinaryE
9395
9496 private async Task < ExpressionSyntax > ConvertToPowOperatorAsync ( VBSyntax . BinaryExpressionSyntax node )
9597 {
96- var ( lhs , rhs ) = await AcceptSidesAsync ( node ) ;
98+ var ( lhs , rhs ) = await AcceptSidesAsync ( node ) ;
99+ lhs = ConvertTo ( node . Left , lhs , SpecialType . System_Double ) ;
100+ rhs = ConvertTo ( node . Right , rhs , SpecialType . System_Double ) ;
97101 return new KnownMethod ( nameof ( System ) , nameof ( Math ) , nameof ( Math . Pow ) )
98102 . Invoke ( _visualBasicEqualityComparison . ExtraUsingDirectives , lhs , rhs ) ;
99103 }
100104
105+ private ExpressionSyntax ConvertTo ( VBSyntax . ExpressionSyntax node , ExpressionSyntax lhs , SpecialType targetType )
106+ {
107+ return _typeConversionAnalyzer . AddExplicitConversion ( node , lhs , forceTargetType : _semanticModel . Compilation . GetSpecialType ( targetType ) ) ;
108+ }
109+
101110 /// <remarks>No need to implement these since this is only called for things that are already decimal and hence will resolve operator in C#</remarks>
102111 private async Task < ExpressionSyntax > ConvertToDecimalBinaryOperatorAsync ( VBSyntax . BinaryExpressionSyntax node , KnownMethod member ) =>
103112 default ;
0 commit comments