Skip to content

Commit 8ffe7c5

Browse files
Handle other arg types
1 parent a1df4b7 commit 8ffe7c5

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

CodeConverter/CSharp/ExpressionNodeVisitor.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -455,9 +455,11 @@ private async Task<ExpressionSyntax> ConvertArgExpression(VBSyntax.SimpleArgumen
455455
return CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Expression, (ExpressionSyntax)await node.Expression.AcceptAsync(TriviaConvertingExpressionVisitor), defaultToCast: refKind != RefKind.None);
456456
}
457457

458-
private RefConversion GetRefType(VBSyntax.SimpleArgumentSyntax node, VBSyntax.ArgumentListSyntax argList, System.Collections.Immutable.ImmutableArray<IParameterSymbol> parameters, out string argName, out RefKind refKind)
458+
private RefConversion GetRefType(VBSyntax.ArgumentSyntax node, VBSyntax.ArgumentListSyntax argList, System.Collections.Immutable.ImmutableArray<IParameterSymbol> parameters, out string argName, out RefKind refKind)
459459
{
460-
var parameter = !node.IsNamed ? parameters.ElementAtOrDefault(argList.Arguments.IndexOf(node)) : parameters.FirstOrDefault(p => p.Name.Equals(node.NameColonEquals.Name.Identifier.Text, StringComparison.OrdinalIgnoreCase));
460+
var parameter = node.IsNamed && node is VBSyntax.SimpleArgumentSyntax sas
461+
? parameters.FirstOrDefault(p => p.Name.Equals(sas.NameColonEquals.Name.Identifier.Text, StringComparison.OrdinalIgnoreCase))
462+
: parameters.ElementAtOrDefault(argList.Arguments.IndexOf(node));
461463
if (parameter != null) {
462464
refKind = parameter.RefKind;
463465
argName = parameter.Name;
@@ -942,10 +944,9 @@ private async Task<InvocationExpressionSyntax> HoistAndCallLocalFunction(VBSynta
942944

943945
private bool RequiresLocalFunction(VBSyntax.InvocationExpressionSyntax invocation, IMethodSymbol invocationSymbol)
944946
{
945-
var originalArgsWithRefTypes = invocation.ArgumentList.Arguments
946-
.Select(a => (Arg: (VBSyntax.SimpleArgumentSyntax)a, RefType: GetRefType((VBSyntax.SimpleArgumentSyntax)a, invocation.ArgumentList, invocationSymbol.Parameters, out var argName, out var refKind), Name: argName, RefKind: refKind));
947-
948-
return originalArgsWithRefTypes.Any(x => x.RefType != RefConversion.Inline) && !IsDefinitelyExecutedInStatement(invocation);
947+
if (invocation.ArgumentList == null || IsDefinitelyExecutedInStatement(invocation)) return false;
948+
return invocation.ArgumentList.Arguments
949+
.Any(a => RefConversion.Inline != GetRefType(a, invocation.ArgumentList, invocationSymbol.Parameters, out var argName, out var refKind));
949950
}
950951

951952
private static bool IsDefinitelyExecutedInStatement(VBSyntax.InvocationExpressionSyntax invocation)
@@ -1399,17 +1400,18 @@ private ArgumentSyntax CreateOptionalRefArg(IParameterSymbol p)
13991400
return (ArgumentSyntax)CommonConversions.CsSyntaxGenerator.Argument(p.Name, p.RefKind, local.IdentifierName);
14001401
}
14011402

1402-
private RefConversion NeedsVariableForArgument(VBasic.Syntax.SimpleArgumentSyntax node, RefKind refKind)
1403+
private RefConversion NeedsVariableForArgument(VBasic.Syntax.ArgumentSyntax node, RefKind refKind)
14031404
{
14041405
if (refKind == RefKind.None) return RefConversion.Inline;
1405-
bool isIdentifier = node.Expression is VBasic.Syntax.IdentifierNameSyntax;
1406-
bool isMemberAccess = node.Expression is VBasic.Syntax.MemberAccessExpressionSyntax;
1406+
if (!(node is VBSyntax.SimpleArgumentSyntax sas)) return RefConversion.PreAssigment;
1407+
bool isIdentifier = sas.Expression is VBasic.Syntax.IdentifierNameSyntax;
1408+
bool isMemberAccess = sas.Expression is VBasic.Syntax.MemberAccessExpressionSyntax;
14071409

1408-
var symbolInfo = GetSymbolInfoInDocument<ISymbol>(node.Expression);
1410+
var symbolInfo = GetSymbolInfoInDocument<ISymbol>(sas.Expression);
14091411
bool isProperty = symbolInfo != null && symbolInfo.IsKind(SymbolKind.Property);
14101412
bool isUsing = symbolInfo?.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax()?.Parent?.Parent?.IsKind(VBasic.SyntaxKind.UsingStatement) == true;
14111413

1412-
var typeInfo = _semanticModel.GetTypeInfo(node.Expression);
1414+
var typeInfo = _semanticModel.GetTypeInfo(sas.Expression);
14131415
bool isTypeMismatch = typeInfo.Type == null || !typeInfo.Type.Equals(typeInfo.ConvertedType);
14141416

14151417
if (isProperty) return RefConversion.PreAndPostAssignment;

0 commit comments

Comments
 (0)