Skip to content

Commit 37ef51a

Browse files
Simplify back down now we have the fix
1 parent 78a1610 commit 37ef51a

File tree

6 files changed

+15
-42
lines changed

6 files changed

+15
-42
lines changed

CodeConverter/CSharp/BinaryExpressionConverter.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,19 +101,6 @@ private async Task<CSharpSyntaxNode> ConvertBinaryExpressionAsync(VBasic.Syntax.
101101
lhs = omitConversion ? lhs : CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Left, lhs, forceTargetType: forceLhsTargetType);
102102
rhs = omitConversion || omitRightConversion ? rhs : CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Right, rhs);
103103

104-
if (node.Right is VBSyntax.GetTypeExpressionSyntax getTypeExpr) {
105-
var isUnboundGeneric = getTypeExpr.Type.DescendantNodesAndSelf().OfType<VBSyntax.TypeArgumentListSyntax>().Any(t => t.Arguments.Any(a => a is VBSyntax.IdentifierNameSyntax id && id.Identifier.IsMissing));
106-
if (isUnboundGeneric) {
107-
rhs = await node.Right.AcceptAsync<CSSyntax.ExpressionSyntax>(TriviaConvertingExpressionVisitor);
108-
}
109-
}
110-
if (node.Left is VBSyntax.GetTypeExpressionSyntax getTypeExprLeft) {
111-
var isUnboundGeneric = getTypeExprLeft.Type.DescendantNodesAndSelf().OfType<VBSyntax.TypeArgumentListSyntax>().Any(t => t.Arguments.Any(a => a is VBSyntax.IdentifierNameSyntax id && id.Identifier.IsMissing));
112-
if (isUnboundGeneric) {
113-
lhs = await node.Left.AcceptAsync<CSSyntax.ExpressionSyntax>(TriviaConvertingExpressionVisitor);
114-
}
115-
}
116-
117104
var kind = VBasic.VisualBasicExtensions.Kind(node).ConvertToken();
118105
var op = CS.SyntaxFactory.Token(CSharpUtil.GetExpressionOperatorTokenKind(kind));
119106

CodeConverter/CSharp/BuiltInVisualBasicOperatorSubstitutions.cs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
ConvertToIfNecessary(node.Left, lhs, SpecialType.System_Object), ConvertToIfNecessary(node.Right, rhs, SpecialType.System_Object));
61+
ConvertTo(node.Left, lhs, SpecialType.System_Object), ConvertTo(node.Right, rhs, SpecialType.System_Object));
6262
return notted
6363
? SyntaxFactory.PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, equalityCheck)
6464
: equalityCheck;
@@ -82,9 +82,6 @@ private static VBSyntax.ExpressionSyntax ArgComparedToNull(VBSyntax.BinaryExpres
8282

8383
private async Task<ExpressionSyntax> ConvertIsOrIsNotExpressionArgAsync(VBSyntax.ExpressionSyntax binaryExpressionArg)
8484
{
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-
}
8885
return await ConvertMyGroupCollectionPropertyGetWithUnderlyingFieldAsync(binaryExpressionArg)
8986
?? await binaryExpressionArg.AcceptAsync<ExpressionSyntax>(_triviaConvertingVisitor);
9087
}
@@ -127,18 +124,7 @@ private ExpressionSyntax ConvertTo(VBSyntax.ExpressionSyntax vbNode, ExpressionS
127124
return _typeConversionAnalyzer.AddExplicitConversion(vbNode, csNode, forceTargetType: _semanticModel.Compilation.GetSpecialType(targetType));
128125
}
129126

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-
141-
/// <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>
127+
/// <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>
142128
private static async Task<ExpressionSyntax> ConvertToDecimalBinaryOperatorAsync(VBSyntax.BinaryExpressionSyntax node, KnownMethod member) =>
143129
default;
144130

CodeConverter/CSharp/NameExpressionNodeVisitor.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -622,13 +622,7 @@ private ITypeSymbol[] GetOrNullAllTypeArgsIncludingInferred(IMethodSymbol vbMeth
622622

623623
private async Task<TypeArgumentListSyntax> ConvertTypeArgumentListAsync(VBSyntax.GenericNameSyntax node)
624624
{
625-
var args = await node.TypeArgumentList.Arguments.SelectAsync(async a => {
626-
if (a is VBasic.Syntax.IdentifierNameSyntax id && id.Identifier.IsMissing) {
627-
return CS.SyntaxFactory.OmittedTypeArgument();
628-
}
629-
return await a.AcceptAsync<TypeSyntax>(TriviaConvertingExpressionVisitor);
630-
});
631-
return CS.SyntaxFactory.TypeArgumentList(CS.SyntaxFactory.SeparatedList<TypeSyntax>(args));
625+
return await node.TypeArgumentList.AcceptAsync<TypeArgumentListSyntax>(TriviaConvertingExpressionVisitor);
632626
}
633627

634628
private CSharpSyntaxNode AddEmptyArgumentListIfImplicit(SyntaxNode node, ExpressionSyntax id)

CodeConverter/CSharp/TypeConversionAnalyzer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public TypeConversionAnalyzer(SemanticModel semanticModel, CSharpCompilation csC
4949
public ExpressionSyntax AddExplicitConversion(VBSyntax.ExpressionSyntax vbNode, ExpressionSyntax csNode, bool addParenthesisIfNeeded = true, bool defaultToCast = false, bool isConst = false, ITypeSymbol forceSourceType = null, ITypeSymbol forceTargetType = null)
5050
{
5151
if (csNode == null) return null;
52-
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))) {
52+
if (vbNode.IsUnboundGenericGetType()) {
5353
return csNode;
5454
}
5555

@@ -62,7 +62,7 @@ public ExpressionSyntax AddExplicitConversion(VBSyntax.ExpressionSyntax vbNode,
6262

6363
public (ExpressionSyntax Expr, bool IsConst) AddExplicitConversion(VBSyntax.ExpressionSyntax vbNode, ExpressionSyntax csNode, TypeConversionKind conversionKind, bool addParenthesisIfNeeded = false, bool requiresConst = false, ITypeSymbol forceSourceType = null, ITypeSymbol forceTargetType = null)
6464
{
65-
if (vbNode is VBSyntax.GetTypeExpressionSyntax getTypeExpr2 && getTypeExpr2.Type.DescendantNodesAndSelf().OfType<VBSyntax.TypeArgumentListSyntax>().Any(t => t.Arguments.Any(a => a is VBSyntax.IdentifierNameSyntax id && id.Identifier.IsMissing))) {
65+
if (vbNode.IsUnboundGenericGetType()) {
6666
return (csNode, false);
6767
}
6868
var (vbType, vbConvertedType) = GetTypeInfo(vbNode, forceSourceType, forceTargetType);
@@ -148,7 +148,7 @@ private ExpressionSyntax CreateCast(ExpressionSyntax csNode, ITypeSymbol vbConve
148148

149149
public TypeConversionKind AnalyzeConversion(VBSyntax.ExpressionSyntax vbNode, bool alwaysExplicit = false, bool isConst = false, ITypeSymbol forceSourceType = null, ITypeSymbol forceTargetType = null)
150150
{
151-
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))) {
151+
if (vbNode.IsUnboundGenericGetType()) {
152152
return TypeConversionKind.NonDestructiveCast;
153153
}
154154
var (vbType, vbConvertedType) = GetTypeInfo(vbNode, forceSourceType, forceTargetType);

CodeConverter/CSharp/VbSyntaxNodeExtensions.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ public static bool AlwaysHasBooleanTypeInCSharp(this VBSyntax.ExpressionSyntax v
3131
parent is VBSyntax.WhereClauseSyntax;
3232
}
3333

34+
/// <summary>
35+
/// Returns true if the node is a GetType expression with an unbound generic type argument,
36+
/// e.g. <c>GetType(Nullable(Of))</c> in VB, which maps to <c>typeof(Nullable&lt;&gt;)</c> in C#.
37+
/// </summary>
38+
public static bool IsUnboundGenericGetType(this VBSyntax.ExpressionSyntax node) =>
39+
node is VBSyntax.GetTypeExpressionSyntax getTypeExpr &&
40+
getTypeExpr.Type.DescendantNodesAndSelf().OfType<VBSyntax.TypeArgumentListSyntax>()
41+
.Any(t => t.Arguments.Any(a => a is VBSyntax.IdentifierNameSyntax id && id.Identifier.IsMissing));
42+
3443
public static TokenContext GetMemberContext(this VBSyntax.StatementSyntax member)
3544
{
3645
var parentType = member.GetAncestorOrThis<VBSyntax.TypeBlockSyntax>();

CodeConverter/CSharp/VisualBasicEqualityComparison.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ public RequiredType GetObjectEqualityType(params TypeInfo[] typeInfos)
8484
if (typeInfos.Any(t => t.Type?.TypeKind == TypeKind.Error && t.ConvertedType?.SpecialType == SpecialType.None)) {
8585
return RequiredType.None;
8686
}
87-
}
88-
89-
if (requiresVbEqualityCheck) {
9087
if (typeInfos.Any(t => t.Type?.TypeKind == TypeKind.Error && t.Type.Name == "Nullable")) {
9188
// VB considers GetType(Nullable(Of)) as IErrorTypeSymbol and it falls back to object, avoid equality check
9289
return RequiredType.None;

0 commit comments

Comments
 (0)