From 0e6c0e18e37b0fa8d543b39a97e676896c7799ba Mon Sep 17 00:00:00 2001 From: Martin Roth Date: Wed, 2 Mar 2016 12:16:13 -0700 Subject: kconfig_lint: make sure if and endif statements are balanced In Kconfig files, the 'if' and 'endif' statements need to match up. A file can't start an if statement that's completed in the next file. Add a check as the files are being parsed to make sure that they match up correctly. Change-Id: If51207ea037089ab84c768e5a868270468cf4c4f Signed-off-by: Martin Roth Reviewed-on: https://review.coreboot.org/13876 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer --- util/lint/kconfig_lint | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/util/lint/kconfig_lint b/util/lint/kconfig_lint index 38fa96867c..c9553431f6 100755 --- a/util/lint/kconfig_lint +++ b/util/lint/kconfig_lint @@ -447,6 +447,7 @@ sub build_and_parse_kconfig_tree { my @inside_menu = (); # stack of menu names my $inside_choice = ""; my $configs_inside_choice; + my %fileinfo; #start the tree off by loading the top level kconfig @config_to_parse = load_kconfig_file( $top_level_kconfig, "", 0, 0, "", 0 ); @@ -601,12 +602,14 @@ sub build_and_parse_kconfig_tree { my $expr = $1; push( @inside_if, $expr ); handle_expressions( $expr, $inside_config, $filename, $line_no ); + $fileinfo{$filename}{iflevel}++; } # endif elsif ( $line =~ /^\s*endif/ ) { $inside_config = ""; pop(@inside_if); + $fileinfo{$filename}{iflevel}--; } #range [if ] @@ -665,6 +668,16 @@ sub build_and_parse_kconfig_tree { } push @wholeconfig, @parseline; } + + foreach my $file ( keys %fileinfo ) { + if ( $fileinfo{$file}{iflevel} > 0 ) { + show_error("$file has $fileinfo{$file}{iflevel} more 'if' statement(s) than 'endif' statements."); + } + elsif ( $fileinfo{$file}{iflevel} < 0 ) { + show_error( + "$file has " . ( $fileinfo{$file}{iflevel} * -1 ) . " more 'endif' statement(s) than 'if' statements." ); + } + } } #------------------------------------------------------------------------------- -- cgit v1.2.3