@@ -67,7 +67,7 @@ def visit_param_spec(self, t: ParamSpecType, /) -> None:
67
67
t .default .accept (self )
68
68
69
69
def visit_parameters (self , t : Parameters , / ) -> None :
70
- self .traverse_types (t .arg_types )
70
+ self .traverse_type_list (t .arg_types )
71
71
72
72
def visit_type_var_tuple (self , t : TypeVarTupleType , / ) -> None :
73
73
t .default .accept (self )
@@ -78,11 +78,11 @@ def visit_literal_type(self, t: LiteralType, /) -> None:
78
78
# Composite types
79
79
80
80
def visit_instance (self , t : Instance , / ) -> None :
81
- self .traverse_types (t .args )
81
+ self .traverse_type_tuple (t .args )
82
82
83
83
def visit_callable_type (self , t : CallableType , / ) -> None :
84
84
# FIX generics
85
- self .traverse_types (t .arg_types )
85
+ self .traverse_type_list (t .arg_types )
86
86
t .ret_type .accept (self )
87
87
t .fallback .accept (self )
88
88
@@ -93,15 +93,15 @@ def visit_callable_type(self, t: CallableType, /) -> None:
93
93
t .type_is .accept (self )
94
94
95
95
def visit_tuple_type (self , t : TupleType , / ) -> None :
96
- self .traverse_types (t .items )
96
+ self .traverse_type_list (t .items )
97
97
t .partial_fallback .accept (self )
98
98
99
99
def visit_typeddict_type (self , t : TypedDictType , / ) -> None :
100
100
self .traverse_types (t .items .values ())
101
101
t .fallback .accept (self )
102
102
103
103
def visit_union_type (self , t : UnionType , / ) -> None :
104
- self .traverse_types (t .items )
104
+ self .traverse_type_list (t .items )
105
105
106
106
def visit_overloaded (self , t : Overloaded , / ) -> None :
107
107
self .traverse_types (t .items )
@@ -115,16 +115,16 @@ def visit_callable_argument(self, t: CallableArgument, /) -> None:
115
115
t .typ .accept (self )
116
116
117
117
def visit_unbound_type (self , t : UnboundType , / ) -> None :
118
- self .traverse_types (t .args )
118
+ self .traverse_type_tuple (t .args )
119
119
120
120
def visit_type_list (self , t : TypeList , / ) -> None :
121
- self .traverse_types (t .items )
121
+ self .traverse_type_list (t .items )
122
122
123
123
def visit_ellipsis_type (self , t : EllipsisType , / ) -> None :
124
124
pass
125
125
126
126
def visit_placeholder_type (self , t : PlaceholderType , / ) -> None :
127
- self .traverse_types (t .args )
127
+ self .traverse_type_list (t .args )
128
128
129
129
def visit_partial_type (self , t : PartialType , / ) -> None :
130
130
pass
@@ -136,7 +136,7 @@ def visit_type_alias_type(self, t: TypeAliasType, /) -> None:
136
136
# TODO: sometimes we want to traverse target as well
137
137
# We need to find a way to indicate explicitly the intent,
138
138
# maybe make this method abstract (like for TypeTranslator)?
139
- self .traverse_types (t .args )
139
+ self .traverse_type_list (t .args )
140
140
141
141
def visit_unpack_type (self , t : UnpackType , / ) -> None :
142
142
t .type .accept (self )
@@ -146,3 +146,13 @@ def visit_unpack_type(self, t: UnpackType, /) -> None:
146
146
def traverse_types (self , types : Iterable [Type ], / ) -> None :
147
147
for typ in types :
148
148
typ .accept (self )
149
+
150
+ def traverse_type_list (self , types : list [Type ], / ) -> None :
151
+ # Micro-optimization: Specialized for lists
152
+ for typ in types :
153
+ typ .accept (self )
154
+
155
+ def traverse_type_tuple (self , types : tuple [Type , ...], / ) -> None :
156
+ # Micro-optimization: Specialized for tuples
157
+ for typ in types :
158
+ typ .accept (self )
0 commit comments