gh-106145: Make `end_{lineno,col_offset}` required on `type_param` nodes (#106224)

This commit is contained in:
Nikita Sobolev 2023-07-01 02:45:08 +03:00 committed by GitHub
parent 904aef9942
commit 46c1097868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 14 deletions

View File

@ -705,7 +705,7 @@ class DirectoryTestCase(ASTTestCase):
test_directories = (lib_dir, lib_dir / "test") test_directories = (lib_dir, lib_dir / "test")
run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py", run_always_files = {"test_grammar.py", "test_syntax.py", "test_compile.py",
"test_ast.py", "test_asdl_parser.py", "test_fstring.py", "test_ast.py", "test_asdl_parser.py", "test_fstring.py",
"test_patma.py"} "test_patma.py", "test_type_alias.py", "test_type_params.py"}
_files_to_test = None _files_to_test = None

View File

@ -0,0 +1,2 @@
Make ``end_lineno`` and ``end_col_offset`` required on ``type_param`` ast
nodes.

View File

@ -148,5 +148,5 @@ module Python
type_param = TypeVar(identifier name, expr? bound) type_param = TypeVar(identifier name, expr? bound)
| ParamSpec(identifier name) | ParamSpec(identifier name)
| TypeVarTuple(identifier name) | TypeVarTuple(identifier name)
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
} }

18
Python/Python-ast.c generated
View File

@ -1902,12 +1902,6 @@ init_types(struct ast_state *state)
if (!state->type_param_type) return 0; if (!state->type_param_type) return 0;
if (!add_attributes(state, state->type_param_type, type_param_attributes, if (!add_attributes(state, state->type_param_type, type_param_attributes,
4)) return 0; 4)) return 0;
if (PyObject_SetAttr(state->type_param_type, state->end_lineno, Py_None) ==
-1)
return 0;
if (PyObject_SetAttr(state->type_param_type, state->end_col_offset,
Py_None) == -1)
return 0;
state->TypeVar_type = make_type(state, "TypeVar", state->type_param_type, state->TypeVar_type = make_type(state, "TypeVar", state->type_param_type,
TypeVar_fields, 2, TypeVar_fields, 2,
"TypeVar(identifier name, expr? bound)"); "TypeVar(identifier name, expr? bound)");
@ -12500,9 +12494,9 @@ obj2ast_type_param(struct ast_state *state, PyObject* obj, type_param_ty* out,
if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) { if (_PyObject_LookupAttr(obj, state->end_lineno, &tmp) < 0) {
return 1; return 1;
} }
if (tmp == NULL || tmp == Py_None) { if (tmp == NULL) {
Py_CLEAR(tmp); PyErr_SetString(PyExc_TypeError, "required field \"end_lineno\" missing from type_param");
end_lineno = lineno; return 1;
} }
else { else {
int res; int res;
@ -12517,9 +12511,9 @@ obj2ast_type_param(struct ast_state *state, PyObject* obj, type_param_ty* out,
if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) { if (_PyObject_LookupAttr(obj, state->end_col_offset, &tmp) < 0) {
return 1; return 1;
} }
if (tmp == NULL || tmp == Py_None) { if (tmp == NULL) {
Py_CLEAR(tmp); PyErr_SetString(PyExc_TypeError, "required field \"end_col_offset\" missing from type_param");
end_col_offset = col_offset; return 1;
} }
else { else {
int res; int res;