1+ using HydraScript . Domain . FrontEnd . Parser ;
2+ using HydraScript . Domain . FrontEnd . Parser . Impl . Ast . Nodes . Declarations . AfterTypesAreLoaded ;
3+ using HydraScript . Domain . FrontEnd . Parser . Impl . Ast . Nodes . Statements ;
4+
5+ namespace HydraScript . Application . StaticAnalysis . Visitors ;
6+
7+ internal class ReturnAnalyzer : VisitorBase < IAbstractSyntaxTreeNode , ReturnAnalyzerResult > ,
8+ IVisitor < FunctionDeclaration , ReturnAnalyzerResult > ,
9+ IVisitor < IfStatement , ReturnAnalyzerResult > ,
10+ IVisitor < ReturnStatement , ReturnAnalyzerResult >
11+ {
12+ public ReturnAnalyzerResult Visit ( FunctionDeclaration visitable )
13+ {
14+ IAbstractSyntaxTreeNode astNode = visitable ;
15+ return Visit ( astNode ) ;
16+ }
17+
18+ public override ReturnAnalyzerResult Visit ( IAbstractSyntaxTreeNode visitable )
19+ {
20+ var result = ReturnAnalyzerResult . AdditiveIdentity ;
21+ for ( var i = 0 ; i < visitable . Count ; i ++ )
22+ {
23+ var visitableResult = visitable [ i ] . Accept ( This ) ;
24+ if ( visitableResult . CodePathEndedWithReturn )
25+ return visitableResult * result ;
26+ result += visitableResult ;
27+ }
28+
29+ return result ;
30+ }
31+
32+ public ReturnAnalyzerResult Visit ( IfStatement visitable )
33+ {
34+ var thenReturns = visitable . Then . Accept ( This ) ;
35+
36+ if ( visitable . Else is null )
37+ return thenReturns + ReturnAnalyzerResult . AdditiveIdentity ;
38+ var elseReturns = visitable . Else . Accept ( This ) ;
39+
40+ return thenReturns + elseReturns ;
41+ }
42+
43+ public ReturnAnalyzerResult Visit ( ReturnStatement visitable ) =>
44+ new ( CodePathEndedWithReturn : true , ReturnStatements : [ visitable ] ) ;
45+ }
0 commit comments