# Report functions which have a depth greater than X. use base ("Understand::Codecheck"); use strict; use constant ERR1 => 'Nesting depth(%1) greater than allowed(%2)'; use constant OPT1 => 'Maximum Depth of Function'; sub register_tr_text { my $check = shift; $check->add_tr_text(ERR1); } sub name { return "Program Unit Max Nesting Depth"; } sub description { return "Program Units which have a nesting depth greater than X"; } sub detailed_description { return "Program Units which have a nesting depth greater than X. Depth is defined as number of nested control structures."; } sub test_language { my $language = shift; return 0 if $language =~ /vhdl/i; return 1; } sub test_entity { return 1; } sub test_global { return 0; } sub define_options{ my $check = shift; $check->option->integer("xnest",OPT1,5); } sub check { my $check = shift; my $file = shift; return unless $file->kind->check("file"); my $xnest = $check->option->lookup("xnest"); #Get all the function references my @entrefs = $file->filerefs("definein, declarein body","ada entry, ada function, ada package, ada procedure, ada protected, ada task," ."c function," ."csharp method," ."fortran block data, fortran function, fortran interface, fortran program, fortran subroutine," ."java method," ."jovial subroutine," ."pascal compunit, pascal function, pascal procedure," ."vhdl procedure, vhdl function, vhdl process, vhdl architecture",1); my @ents = map{$_->ent;}@entrefs; #Get all the function entities foreach my $function (@ents){ my $nest = $function->metric("MaxNesting"); if ($nest > $xnest) { $check->violation($function,$function->ref->file,$function->ref->line,$function->ref->column,ERR1,$nest,$xnest); } } }