utils/checkpackagelib/lib_mk.py: handle 'else' and 'elif' statements

An 'else' or 'elif' clause inside a make conditional should not be indented
in the same way as the if/endif clause. check-package did not recognize the
else statement and expected an indentation.

For example:

ifdef FOOBAR
	interesting
else
	more interesting
endif

would, according to check-package, need to become:

ifdef FOOBAR
	interesting
	else
	more interesting
endif

Treat 'else' and 'elif' the same as if-like keywords in the Indent test, but
take into account that 'else' is also valid shell, so we need to correctly
handle line continuation to prevent complaining about the 'else' in:

ifdef FOOBAR
	if true; \
	    ... \
	else \
	    ... \
	fi
endif

We don't add the 'else' and 'elif' statements to start_conditional, because
it would cause incorrect nesting counting in class OverriddenVariable.

Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Thomas De Schampheleire 2020-12-09 16:32:18 +01:00 committed by Thomas Petazzoni
parent 239f440a17
commit a1bb132a81

View File

@ -16,12 +16,13 @@ from checkpackagelib.lib import Utf8Characters # noqa: F401
# used in more than one check # used in more than one check
start_conditional = ["ifdef", "ifeq", "ifndef", "ifneq"] start_conditional = ["ifdef", "ifeq", "ifndef", "ifneq"]
continue_conditional = ["elif", "else"]
end_conditional = ["endif"] end_conditional = ["endif"]
class Indent(_CheckFunction): class Indent(_CheckFunction):
COMMENT = re.compile(r"^\s*#") COMMENT = re.compile(r"^\s*#")
CONDITIONAL = re.compile(r"^\s*({})\s".format("|".join(start_conditional + end_conditional))) CONDITIONAL = re.compile(r"^\s*({})\s".format("|".join(start_conditional + end_conditional + continue_conditional)))
ENDS_WITH_BACKSLASH = re.compile(r"^[^#].*\\$") ENDS_WITH_BACKSLASH = re.compile(r"^[^#].*\\$")
END_DEFINE = re.compile(r"^\s*endef\s") END_DEFINE = re.compile(r"^\s*endef\s")
MAKEFILE_TARGET = re.compile(r"^[^# \t]+:\s") MAKEFILE_TARGET = re.compile(r"^[^# \t]+:\s")
@ -43,7 +44,7 @@ class Indent(_CheckFunction):
expect_tabs = False expect_tabs = False
if self.define or self.backslash or self.makefile_target: if self.define or self.backslash or self.makefile_target:
expect_tabs = True expect_tabs = True
if self.CONDITIONAL.search(text): if not self.backslash and self.CONDITIONAL.search(text):
expect_tabs = False expect_tabs = False
# calculate for next line # calculate for next line