diff options
-rw-r--r-- | coverage/env.py | 4 | ||||
-rw-r--r-- | coverage/parser.py | 10 | ||||
-rw-r--r-- | tests/coveragetest.py | 5 | ||||
-rw-r--r-- | tests/test_arcs.py | 4 |
4 files changed, 21 insertions, 2 deletions
diff --git a/coverage/env.py b/coverage/env.py index 7b845f66..f2881e32 100644 --- a/coverage/env.py +++ b/coverage/env.py @@ -92,6 +92,10 @@ class PYBEHAVIOR(object): # PyPy has always omitted statements after return. omit_after_return = omit_after_jump or PYPY + # Modules used to have firstlineno equal to the line number of the first + # real line of code. Now they always start at 1. + module_firstline_1 = pep626 + # Coverage.py specifics. # Are we using the C-implemented trace function? diff --git a/coverage/parser.py b/coverage/parser.py index 007f7599..6a3ca2fc 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -205,6 +205,12 @@ class PythonParser(object): if not empty: self.raw_statements.update(self.byte_parser._find_statements()) + # The first line of modules can lie and say 1 always, even if the first + # line of code is later. If so, map 1 to the actual first line of the + # module. + if env.PYBEHAVIOR.module_firstline_1 and self._multiline: + self._multiline[1] = min(self.raw_statements) + def first_line(self, line): """Return the first line number of the statement including `line`.""" if line < 0: @@ -620,7 +626,9 @@ class AstArcAnalyzer(object): return node.lineno def _line__Module(self, node): - if node.body: + if env.PYBEHAVIOR.module_firstline_1: + return 1 + elif node.body: return self.line_for_node(node.body[0]) else: # Empty modules have no line number, they always start at 1. diff --git a/tests/coveragetest.py b/tests/coveragetest.py index f4961ed9..b2763b04 100644 --- a/tests/coveragetest.py +++ b/tests/coveragetest.py @@ -219,6 +219,11 @@ class CoverageTest( self.fail("None of the missing choices matched %r" % missing_formatted) if arcs is not None: + # print("Possible arcs:") + # print(" expected:", arcs) + # print(" actual:", analysis.arc_possibilities()) + # print("Executed:") + # print(" actual:", sorted(set(analysis.arcs_executed()))) with self.delayed_assertions(): self.assert_equal_arcs( arcs, analysis.arc_possibilities(), diff --git a/tests/test_arcs.py b/tests/test_arcs.py index 849dbc4a..b927526b 100644 --- a/tests/test_arcs.py +++ b/tests/test_arcs.py @@ -25,6 +25,7 @@ class SimpleArcTest(CoverageTest): b = 3 """, arcz=".1 13 3.") + line1 = 1 if env.PYBEHAVIOR.module_firstline_1 else 2 self.check_coverage("""\ a = 2 @@ -32,7 +33,8 @@ class SimpleArcTest(CoverageTest): c = 5 """, - arcz="-22 23 35 5-2") + arcz="-{0}2 23 35 5-{0}".format(line1) + ) def test_function_def(self): self.check_coverage("""\ |