Add a TypeParams node to the AST (#6261)

## Summary

Similar to #6259, this PR adds a `TypeParams` node to the AST, to
capture the list of type parameters with their surrounding brackets.

If a statement lacks type parameters, the `type_params` field will be
`None`.
This commit is contained in:
Charlie Marsh 2023-08-02 10:12:45 -04:00 committed by GitHub
parent 981e64f82b
commit b095b7204b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 1104 additions and 866 deletions

View file

@ -1,6 +1,6 @@
//! Generate Python source code from an abstract syntax tree (AST).
use ruff_python_ast::ParameterWithDefault;
use ruff_python_ast::{ParameterWithDefault, TypeParams};
use std::ops::Deref;
use ruff_python_ast::{
@ -222,7 +222,9 @@ impl<'a> Generator<'a> {
statement!({
self.p("def ");
self.p_id(name);
self.unparse_type_params(type_params);
if let Some(type_params) = type_params {
self.unparse_type_params(type_params);
}
self.p("(");
self.unparse_parameters(parameters);
self.p(")");
@ -256,7 +258,9 @@ impl<'a> Generator<'a> {
statement!({
self.p("async def ");
self.p_id(name);
self.unparse_type_params(type_params);
if let Some(type_params) = type_params {
self.unparse_type_params(type_params);
}
self.p("(");
self.unparse_parameters(parameters);
self.p(")");
@ -289,7 +293,9 @@ impl<'a> Generator<'a> {
statement!({
self.p("class ");
self.p_id(name);
self.unparse_type_params(type_params);
if let Some(type_params) = type_params {
self.unparse_type_params(type_params);
}
if let Some(arguments) = arguments {
self.p("(");
let mut first = true;
@ -540,7 +546,9 @@ impl<'a> Generator<'a> {
}) => {
self.p("type ");
self.unparse_expr(name, precedence::MAX);
self.unparse_type_params(type_params);
if let Some(type_params) = type_params {
self.unparse_type_params(type_params);
}
self.p(" = ");
self.unparse_expr(value, precedence::ASSIGN);
}
@ -853,16 +861,14 @@ impl<'a> Generator<'a> {
self.body(&ast.body);
}
fn unparse_type_params(&mut self, type_params: &Vec<TypeParam>) {
if !type_params.is_empty() {
self.p("[");
let mut first = true;
for type_param in type_params {
self.p_delim(&mut first, ", ");
self.unparse_type_param(type_param);
}
self.p("]");
fn unparse_type_params(&mut self, type_params: &TypeParams) {
self.p("[");
let mut first = true;
for type_param in type_params.iter() {
self.p_delim(&mut first, ", ");
self.unparse_type_param(type_param);
}
self.p("]");
}
pub(crate) fn unparse_type_param(&mut self, ast: &TypeParam) {