@@ -1174,9 +1174,41 @@ private async Task<InvocationExpressionSyntax> HoistAndCallLocalFunctionAsync(VB
11741174 statements . Concat ( SyntaxFactory . ReturnStatement ( ValidSyntaxFactory . IdentifierName ( retVariableName ) ) . Yield ( ) )
11751175 ) ;
11761176 var returnType = CommonConversions . GetTypeSyntax ( invocationSymbol . ReturnType ) ;
1177-
1178- var localFunc = _typeContext . PerScopeState . Hoist ( new HoistedParameterlessFunction ( localFuncName , returnType , block ) ) ;
1179- return SyntaxFactory . InvocationExpression ( localFunc . TempIdentifier , SyntaxFactory . ArgumentList ( ) ) ;
1177+
1178+ //any argument that's a ByRef parameter of the parent method needs to be passed as a ref parameter to the local function (to avoid error CS1628)
1179+ var refParametersOfParent = GetRefParameters ( invocation . ArgumentList ) ;
1180+ var ( args , @params ) = CreateArgumentsAndParametersLists ( refParametersOfParent ) ;
1181+
1182+ var localFunc = _typeContext . PerScopeState . Hoist ( new HoistedFunction ( localFuncName , returnType , block , SyntaxFactory . ParameterList ( @params ) ) ) ;
1183+ return SyntaxFactory . InvocationExpression ( localFunc . TempIdentifier , SyntaxFactory . ArgumentList ( args ) ) ;
1184+
1185+ List < IParameterSymbol > GetRefParameters ( VBSyntax . ArgumentListSyntax argumentList )
1186+ {
1187+ var result = new List < IParameterSymbol > ( ) ;
1188+ if ( argumentList is null ) return result ;
1189+
1190+ foreach ( var arg in argumentList . Arguments ) {
1191+ if ( _semanticModel . GetSymbolInfo ( arg . GetExpression ( ) ) . Symbol is not IParameterSymbol p ) continue ;
1192+ if ( p . RefKind != RefKind . None ) {
1193+ result . Add ( p ) ;
1194+ }
1195+ }
1196+
1197+ return result ;
1198+ }
1199+
1200+ ( SeparatedSyntaxList < ArgumentSyntax > , SeparatedSyntaxList < ParameterSyntax > ) CreateArgumentsAndParametersLists ( List < IParameterSymbol > parameterSymbols )
1201+ {
1202+ var arguments = new List < ArgumentSyntax > ( ) ;
1203+ var parameters = new List < ParameterSyntax > ( ) ;
1204+ foreach ( var p in parameterSymbols ) {
1205+ var arg = ( ArgumentSyntax ) CommonConversions . CsSyntaxGenerator . Argument ( p . RefKind , SyntaxFactory . IdentifierName ( p . Name ) ) ;
1206+ arguments . Add ( arg ) ;
1207+ var par = ( ParameterSyntax ) CommonConversions . CsSyntaxGenerator . ParameterDeclaration ( p ) ;
1208+ parameters . Add ( par ) ;
1209+ }
1210+ return ( SyntaxFactory . SeparatedList ( arguments ) , SyntaxFactory . SeparatedList ( parameters ) ) ;
1211+ }
11801212 }
11811213
11821214 private bool RequiresLocalFunction ( VBSyntax . InvocationExpressionSyntax invocation , IMethodSymbol invocationSymbol )
0 commit comments