Skip to content

Commit 165666b

Browse files
Most of the way to splitting out NameExpressionNodeVisitor
1 parent 1731f01 commit 165666b

4 files changed

Lines changed: 889 additions & 841 deletions

File tree

CodeConverter/CSharp/CommonConversions.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.CodeAnalysis.Editing;
77
using Microsoft.CodeAnalysis.FindSymbols;
88
using Microsoft.CodeAnalysis.Operations;
9+
using Microsoft.CodeAnalysis.Simplification;
910
using ArgumentListSyntax = Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax;
1011
using ArrayRankSpecifierSyntax = Microsoft.CodeAnalysis.CSharp.Syntax.ArrayRankSpecifierSyntax;
1112
using ArrayTypeSyntax = Microsoft.CodeAnalysis.CSharp.Syntax.ArrayTypeSyntax;
@@ -760,4 +761,39 @@ public bool IsLinqDelegateExpression(VisualBasicSyntaxNode node)
760761
}
761762

762763
private bool IsLinqDelegateExpression(ITypeSymbol convertedType) =>KnownTypes.System_Linq_Expressions_Expression_T?.Equals(convertedType?.OriginalDefinition, SymbolEqualityComparer.Default) == true;
764+
765+
public static SyntaxToken GetRefToken(RefKind refKind)
766+
{
767+
SyntaxToken token;
768+
switch (refKind) {
769+
case RefKind.None:
770+
token = default(SyntaxToken);
771+
break;
772+
case RefKind.Ref:
773+
token = SyntaxFactory.Token(CSSyntaxKind.RefKeyword);
774+
break;
775+
case RefKind.Out:
776+
token = SyntaxFactory.Token(CSSyntaxKind.OutKeyword);
777+
break;
778+
default:
779+
throw new ArgumentOutOfRangeException(nameof(refKind), refKind, null);
780+
}
781+
782+
return token;
783+
}
784+
785+
public async Task<CSharpSyntaxNode> WithRemovedRedundantConversionOrNullAsync(VBSyntax.ExpressionSyntax conversionNode, VBSyntax.ExpressionSyntax conversionArg)
786+
{
787+
var csharpArg = await conversionArg.AcceptAsync<ExpressionSyntax>(TriviaConvertingExpressionVisitor);
788+
var typeInfo = SemanticModel.GetTypeInfo(conversionNode);
789+
790+
// If written by the user (i.e. not generated during expand phase), maintain intended semantics which could throw sometimes e.g. object o = (int) (object) long.MaxValue;
791+
var writtenByUser = !conversionNode.HasAnnotation(Simplifier.Annotation);
792+
var forceTargetType = typeInfo.ConvertedType;
793+
// TypeConversionAnalyzer can't figure out which type is required for operator/method overloads, inferred func returns or inferred variable declarations
794+
// (currently overapproximates for numeric and gets it wrong in non-numeric cases).
795+
// Future: Avoid more redundant conversions by still calling AddExplicitConversion when writtenByUser avoiding the above and forcing typeInfo.Type
796+
return writtenByUser ? null : this.TypeConversionAnalyzer.AddExplicitConversion(conversionArg, csharpArg,
797+
forceTargetType: forceTargetType, defaultToCast: true);
798+
}
763799
}

0 commit comments

Comments
 (0)