@@ -407,33 +407,40 @@ public override async Task<CSharpSyntaxNode> VisitSimpleArgument(VBasic.Syntax.S
407407 return await node . Expression . AcceptAsync ( TriviaConvertingExpressionVisitor ) ;
408408 var symbol = GetInvocationSymbol ( invocation ) ;
409409 SyntaxToken token = default ( SyntaxToken ) ;
410- var convertedExpression = ( ExpressionSyntax ) await node . Expression . AcceptAsync ( TriviaConvertingExpressionVisitor ) ;
410+ var convertedArgExpression = ( ExpressionSyntax ) await node . Expression . AcceptAsync ( TriviaConvertingExpressionVisitor ) ;
411411 if ( symbol is IMethodSymbol methodSymbol ) {
412412 var parameters = ( CommonConversions . GetCsOriginalSymbolOrNull ( methodSymbol . OriginalDefinition ) ?? methodSymbol ) . GetParameters ( ) ;
413413 var refType = GetRefConversionType ( node , argList , parameters , out var argName , out var refKind ) ;
414- var convertedExpressionWithoutCast = convertedExpression ;
415- convertedExpression = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( node . Expression , convertedExpression , defaultToCast : refKind != RefKind . None ) ;
414+ var convertedExpressionWithoutCast = convertedArgExpression ;
415+ convertedArgExpression = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( node . Expression , convertedArgExpression , defaultToCast : refKind != RefKind . None ) ;
416416
417417 if ( refType != RefConversion . Inline ) {
418418 string prefix = $ "arg{ argName } ";
419419 var expressionTypeInfo = _semanticModel . GetTypeInfo ( node . Expression ) ;
420420 bool useVar = expressionTypeInfo . Type ? . Equals ( expressionTypeInfo . ConvertedType ) == true && ! CommonConversions . ShouldPreferExplicitType ( node . Expression , expressionTypeInfo . ConvertedType , out var _ ) ;
421421 var typeSyntax = CommonConversions . GetTypeSyntax ( expressionTypeInfo . ConvertedType , useVar ) ;
422- var local = _additionalLocals . Hoist ( new AdditionalDeclaration ( prefix , convertedExpression , typeSyntax ) ) ;
422+
423+ if ( convertedExpressionWithoutCast . SkipParens ( ) is ElementAccessExpressionSyntax eae ) {
424+ //Hoist out the container so we can assign back to the same one after (like VB does)
425+ var tmpContainer = _additionalLocals . Hoist ( new AdditionalDeclaration ( "tmp" , eae . Expression , ValidSyntaxFactory . VarType ) ) ;
426+ convertedExpressionWithoutCast = eae . WithExpression ( tmpContainer . IdentifierName ) ;
427+ convertedArgExpression = convertedArgExpression . ReplaceNode ( eae , convertedExpressionWithoutCast ) ;
428+ }
429+ var local = _additionalLocals . Hoist ( new AdditionalDeclaration ( prefix , convertedArgExpression , typeSyntax ) ) ;
423430
424431 if ( refType == RefConversion . PreAndPostAssignment ) {
425432 var convertedLocalIdentifier = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( node . Expression , local . IdentifierName , forceSourceType : expressionTypeInfo . ConvertedType , forceTargetType : expressionTypeInfo . Type ) ;
426433 _additionalLocals . Hoist ( new AdditionalAssignment ( convertedExpressionWithoutCast , convertedLocalIdentifier ) ) ;
427434 }
428- convertedExpression = local . IdentifierName ;
435+ convertedArgExpression = local . IdentifierName ;
429436 }
430437 token = GetRefToken ( refKind ) ;
431438 } else {
432- convertedExpression = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( node . Expression , convertedExpression ) ;
439+ convertedArgExpression = CommonConversions . TypeConversionAnalyzer . AddExplicitConversion ( node . Expression , convertedArgExpression ) ;
433440 }
434441
435442 var nameColon = node . IsNamed ? SyntaxFactory . NameColon ( ( IdentifierNameSyntax ) await node . NameColonEquals . Name . AcceptAsync ( TriviaConvertingExpressionVisitor ) ) : null ;
436- return SyntaxFactory . Argument ( nameColon , token , convertedExpression ) ;
443+ return SyntaxFactory . Argument ( nameColon , token , convertedArgExpression ) ;
437444 }
438445
439446 private static SyntaxToken GetRefToken ( RefKind refKind )
0 commit comments