@@ -59,23 +59,31 @@ public override void Fix(IInspectionResult result, IRewriteSession rewriteSessio
59
59
var arg = parameterizedDeclaration . Parameters . First ( p => p . IsByRef || p . IsImplicitByRef ) ;
60
60
var argIndex = parameterizedDeclaration . Parameters . IndexOf ( arg ) ;
61
61
62
- UpdateSignature ( result . Target , arg , rewriteSession ) ;
62
+ UpdateProcedure ( result . Target , arg , rewriteSession ) ;
63
63
foreach ( var reference in result . Target . References . Where ( reference => ! reference . IsDefaultMemberAccess ) )
64
64
{
65
65
UpdateCall ( reference , argIndex , rewriteSession ) ;
66
66
}
67
67
}
68
68
69
- private void UpdateSignature ( Declaration target , ParameterDeclaration arg , IRewriteSession rewriteSession )
69
+ private void UpdateProcedure ( Declaration target , ParameterDeclaration arg , IRewriteSession rewriteSession )
70
70
{
71
71
var subStmt = ( VBAParser . SubStmtContext ) target . Context ;
72
72
var argContext = ( VBAParser . ArgContext ) arg . Context ;
73
-
73
+ var argName = argContext . unrestrictedIdentifier ( ) . GetText ( ) ;
74
74
var rewriter = rewriteSession . CheckOutModuleRewriter ( target . QualifiedModuleName ) ;
75
75
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
+ {
76
83
rewriter . Replace ( subStmt . SUB ( ) , Tokens . Function ) ;
77
84
rewriter . Replace ( subStmt . END_SUB ( ) , "End Function" ) ;
78
85
86
+ var argContext = ( VBAParser . ArgContext ) arg . Context ;
79
87
rewriter . InsertAfter ( subStmt . argList ( ) . Stop . TokenIndex , $ " As { arg . AsTypeName } ") ;
80
88
81
89
if ( arg . IsByRef )
@@ -86,11 +94,26 @@ private void UpdateSignature(Declaration target, ParameterDeclaration arg, IRewr
86
94
{
87
95
rewriter . InsertBefore ( argContext . unrestrictedIdentifier ( ) . Start . TokenIndex , Tokens . ByVal ) ;
88
96
}
97
+ }
89
98
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.
91
103
rewriter . InsertBefore ( subStmt . END_SUB ( ) . Symbol . TokenIndex , returnStmt ) ;
92
104
}
93
105
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
+
94
117
private void UpdateCall ( IdentifierReference reference , int argIndex , IRewriteSession rewriteSession )
95
118
{
96
119
var rewriter = rewriteSession . CheckOutModuleRewriter ( reference . QualifiedModuleName ) ;
0 commit comments