1- using Microsoft . CodeAnalysis . CSharp . Syntax ;
1+ using Microsoft . CodeAnalysis . CSharp . Syntax ;
22using Microsoft . VisualBasic . CompilerServices ;
33using SyntaxFactory = Microsoft . CodeAnalysis . CSharp . SyntaxFactory ;
44using SyntaxKind = Microsoft . CodeAnalysis . CSharp . SyntaxKind ;
@@ -58,7 +58,7 @@ public async Task<ExpressionSyntax> ConvertReferenceOrNothingComparisonOrNullAsy
5858
5959 var equalityCheck = new KnownMethod ( nameof ( System ) , nameof ( Object ) , nameof ( object . ReferenceEquals ) )
6060 . Invoke ( _visualBasicEqualityComparison . ExtraUsingDirectives ,
61- ConvertTo ( node . Left , lhs , SpecialType . System_Object ) , rhs ) ;
61+ ConvertToIfNecessary ( node . Left , lhs , SpecialType . System_Object ) , ConvertToIfNecessary ( node . Right , rhs , SpecialType . System_Object ) ) ;
6262 return notted
6363 ? SyntaxFactory . PrefixUnaryExpression ( SyntaxKind . LogicalNotExpression , equalityCheck )
6464 : equalityCheck ;
@@ -80,9 +80,14 @@ private static VBSyntax.ExpressionSyntax ArgComparedToNull(VBSyntax.BinaryExpres
8080 return null ;
8181 }
8282
83- private async Task < ExpressionSyntax > ConvertIsOrIsNotExpressionArgAsync ( VBSyntax . ExpressionSyntax binaryExpressionArg ) =>
84- await ConvertMyGroupCollectionPropertyGetWithUnderlyingFieldAsync ( binaryExpressionArg )
85- ?? await binaryExpressionArg . AcceptAsync < ExpressionSyntax > ( _triviaConvertingVisitor ) ;
83+ private async Task < ExpressionSyntax > ConvertIsOrIsNotExpressionArgAsync ( VBSyntax . ExpressionSyntax binaryExpressionArg )
84+ {
85+ if ( binaryExpressionArg is VBSyntax . GetTypeExpressionSyntax getTypeExpr && getTypeExpr . Type . DescendantNodesAndSelf ( ) . OfType < VBSyntax . TypeArgumentListSyntax > ( ) . Any ( t => t . Arguments . Any ( a => a is VBSyntax . IdentifierNameSyntax id && id . Identifier . IsMissing ) ) ) {
86+ return await getTypeExpr . AcceptAsync < ExpressionSyntax > ( _triviaConvertingVisitor ) ;
87+ }
88+ return await ConvertMyGroupCollectionPropertyGetWithUnderlyingFieldAsync ( binaryExpressionArg )
89+ ?? await binaryExpressionArg . AcceptAsync < ExpressionSyntax > ( _triviaConvertingVisitor ) ;
90+ }
8691
8792 private async Task < ExpressionSyntax > ConvertMyGroupCollectionPropertyGetWithUnderlyingFieldAsync ( SyntaxNode node )
8893 {
@@ -122,6 +127,17 @@ private ExpressionSyntax ConvertTo(VBSyntax.ExpressionSyntax vbNode, ExpressionS
122127 return _typeConversionAnalyzer . AddExplicitConversion ( vbNode , csNode , forceTargetType : _semanticModel . Compilation . GetSpecialType ( targetType ) ) ;
123128 }
124129
130+ private ExpressionSyntax ConvertToIfNecessary ( VBSyntax . ExpressionSyntax vbNode , ExpressionSyntax csNode , SpecialType targetType )
131+ {
132+ if ( vbNode is VBSyntax . GetTypeExpressionSyntax getTypeExpr && getTypeExpr . Type . DescendantNodesAndSelf ( ) . OfType < VBSyntax . TypeArgumentListSyntax > ( ) . Any ( t => t . Arguments . Any ( a => a is VBSyntax . IdentifierNameSyntax id && id . Identifier . IsMissing ) ) ) {
133+ return csNode ;
134+ }
135+ if ( csNode is TypeOfExpressionSyntax typeOfExpr && typeOfExpr . Type is GenericNameSyntax gen && gen . TypeArgumentList . Arguments . Any ( a => a is OmittedTypeArgumentSyntax ) ) {
136+ return csNode ;
137+ }
138+ return ConvertTo ( vbNode , csNode , targetType ) ;
139+ }
140+
125141 /// <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>
126142 private static async Task < ExpressionSyntax > ConvertToDecimalBinaryOperatorAsync ( VBSyntax . BinaryExpressionSyntax node , KnownMethod member ) =>
127143 default ;
0 commit comments