Coverage for src/castep_linter/tests/allocate_stat_checked.py: 90%
36 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
1"""Test that allocate stat is used and checked"""
2from castep_linter.error_logging import ErrorLogger
3from castep_linter.fortran import CallExpression
4from castep_linter.fortran.fortran_node import Fortran, FortranNode, WrongNodeError
5from castep_linter.fortran.identifier import Identifier
6from castep_linter.tests import castep_identifiers
9def check_allocate_has_stat(node: FortranNode, error_log: ErrorLogger) -> None:
10 """Test that allocate stat is used and checked"""
12 if not node.is_type(Fortran.CALL_EXPRESSION):
13 err = "Expected variable declaration node"
14 raise WrongNodeError(err)
16 routine = CallExpression(node)
18 if routine.name is None: 18 ↛ 19line 18 didn't jump to line 19, because the condition on line 18 was never true
19 return
21 # Check this is actually an allocate statement
22 if routine.name != castep_identifiers.ALLOCATE:
23 return
25 # First get the stat variable for this allocate statement
26 try:
27 _, stat_variable_node = routine.get_arg(keyword=castep_identifiers.STAT)
28 except KeyError:
29 err = "No stat on allocate statement"
30 error_log.add_msg("Warning", node, err)
31 return
33 stat_variable = Identifier.from_node(stat_variable_node)
35 # Find the next non-comment line
36 next_node = node.next_named_sibling()
37 while next_node and next_node.is_type(Fortran.COMMENT):
38 next_node = next_node.next_named_sibling()
40 # Check if that uses the stat variable
41 if next_node and next_node.is_type(Fortran.IF_STMT):
42 try:
43 relational_expr = next_node.get(Fortran.PAREN_EXPRESSION).get(Fortran.RELATIONAL_EXPR)
44 except KeyError:
45 error_log.add_msg("Error", stat_variable_node, "Allocate status not checked")
46 return
48 lhs, rhs = relational_expr.split()
50 if lhs.is_type(Fortran.IDENTIFIER) and Identifier.from_node(lhs) == stat_variable:
51 return
53 if rhs.is_type(Fortran.IDENTIFIER) and Identifier.from_node(rhs) == stat_variable:
54 return
56 error_log.add_msg("Error", stat_variable_node, "Allocate status not checked")