27 this->visitProgramElement(funcDef);
30 bool visitExpression(
const Expression& expr)
override {
35 bool visitStatement(
const Statement& stmt)
override {
36 switch (stmt.
kind()) {
37 case Statement::Kind::kBlock: {
39 const auto& block = stmt.
as<
Block>();
41 this->visitStatement(*block.children().back());
43 case Statement::Kind::kSwitch:
44 case Statement::Kind::kDo:
45 case Statement::Kind::kFor:
49 case Statement::Kind::kReturn:
54 return INHERITED::visitStatement(stmt);
62 return CountReturnsAtEndOfControlFlow{funcDef}.fNumReturns;
119 if (counter.fNumReturns > returnsAtEndOfControlFlow) {
120 return ReturnComplexity::kEarlyReturns;
122 if (counter.fNumReturns > 1) {
123 return ReturnComplexity::kScopedReturns;
125 if (counter.fVariablesInBlocks && counter.fDeepestReturn > 1) {
126 return ReturnComplexity::kScopedReturns;
128 return ReturnComplexity::kSingleSafeReturn;