summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2020-12-31 18:26:00 -0500
committerNed Batchelder <ned@nedbatchelder.com>2021-01-10 09:46:18 -0500
commitbd90b202587dd9f1e2e1319c1c542545c7263dd3 (patch)
tree0ea3dff2903cb5be1869dde55434e93e2677ccff
parent13f15b0e4316865287d4b5ae1d4f856dac9f9ecb (diff)
downloadpython-coveragepy-git-bd90b202587dd9f1e2e1319c1c542545c7263dd3.tar.gz
In 3.10, modules always have firstlineno==1
-rw-r--r--coverage/env.py4
-rw-r--r--coverage/parser.py10
-rw-r--r--tests/coveragetest.py5
-rw-r--r--tests/test_arcs.py4
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("""\