@@ -59,23 +59,31 @@ public override void Fix(IInspectionResult result, IRewriteSession rewriteSessio
5959 var arg = parameterizedDeclaration . Parameters . First ( p => p . IsByRef || p . IsImplicitByRef ) ;
6060 var argIndex = parameterizedDeclaration . Parameters . IndexOf ( arg ) ;
6161
62- UpdateSignature ( result . Target , arg , rewriteSession ) ;
62+ UpdateProcedure ( result . Target , arg , rewriteSession ) ;
6363 foreach ( var reference in result . Target . References . Where ( reference => ! reference . IsDefaultMemberAccess ) )
6464 {
6565 UpdateCall ( reference , argIndex , rewriteSession ) ;
6666 }
6767 }
6868
69- private void UpdateSignature ( Declaration target , ParameterDeclaration arg , IRewriteSession rewriteSession )
69+ private void UpdateProcedure ( Declaration target , ParameterDeclaration arg , IRewriteSession rewriteSession )
7070 {
7171 var subStmt = ( VBAParser . SubStmtContext ) target . Context ;
7272 var argContext = ( VBAParser . ArgContext ) arg . Context ;
73-
73+ var argName = argContext . unrestrictedIdentifier ( ) . GetText ( ) ;
7474 var rewriter = rewriteSession . CheckOutModuleRewriter ( target . QualifiedModuleName ) ;
7575
76+ UpdateSignature ( subStmt , arg , rewriter ) ;
77+ AddReturnStatement ( subStmt , argName , rewriter ) ;
78+ ReplaceExitSubs ( subStmt , argName , rewriter ) ;
79+ }
80+
81+ private void UpdateSignature ( VBAParser . SubStmtContext subStmt , ParameterDeclaration arg , IModuleRewriter rewriter )
82+ {
7683 rewriter . Replace ( subStmt . SUB ( ) , Tokens . Function ) ;
7784 rewriter . Replace ( subStmt . END_SUB ( ) , "End Function" ) ;
7885
86+ var argContext = ( VBAParser . ArgContext ) arg . Context ;
7987 rewriter . InsertAfter ( subStmt . argList ( ) . Stop . TokenIndex , $ " As { arg . AsTypeName } ") ;
8088
8189 if ( arg . IsByRef )
@@ -86,11 +94,26 @@ private void UpdateSignature(Declaration target, ParameterDeclaration arg, IRewr
8694 {
8795 rewriter . InsertBefore ( argContext . unrestrictedIdentifier ( ) . Start . TokenIndex , Tokens . ByVal ) ;
8896 }
97+ }
8998
90- var returnStmt = $ " { subStmt . subroutineName ( ) . GetText ( ) } = { argContext . unrestrictedIdentifier ( ) . GetText ( ) } { Environment . NewLine } ";
99+ private void AddReturnStatement ( VBAParser . SubStmtContext subStmt , string argName , IModuleRewriter rewriter )
100+ {
101+ var returnStmt = $ " { subStmt . subroutineName ( ) . GetText ( ) } = { argName } { Environment . NewLine } ";
102+ // This exploits that the VBE will realign the End Function statement automatically.
91103 rewriter . InsertBefore ( subStmt . END_SUB ( ) . Symbol . TokenIndex , returnStmt ) ;
92104 }
93105
106+ private void ReplaceExitSubs ( VBAParser . SubStmtContext subStmt , string argName , IModuleRewriter rewriter )
107+ {
108+ // We use a statement separator here to be able to deal with single line if statments without too much issues.
109+ var exitFunctionCode = $ "{ subStmt . subroutineName ( ) . GetText ( ) } = { argName } : Exit Function";
110+ foreach ( var exitSub in subStmt . GetDescendents < VBAParser . ExitStmtContext > ( ) )
111+ {
112+ rewriter . Replace ( exitSub , exitFunctionCode ) ;
113+ }
114+ }
115+
116+
94117 private void UpdateCall ( IdentifierReference reference , int argIndex , IRewriteSession rewriteSession )
95118 {
96119 var rewriter = rewriteSession . CheckOutModuleRewriter ( reference . QualifiedModuleName ) ;
0 commit comments