2727 from ._enum import Enum
2828
2929_Types = DescMessage | DescEnum | DescExtension | DescService
30+ _MessageTypeInfo = DescMessage | str | Message
3031_T = TypeVar ("_T" , bound = _Types )
3132
3233
@@ -176,8 +177,21 @@ def extension(self, type_name: str) -> DescExtension | None:
176177 msg = self ._types .get (type_name )
177178 return msg if isinstance (msg , DescExtension ) else None
178179
180+ def extensions_for (self , type_info : _MessageTypeInfo ) -> list [DescExtension ]:
181+ """Look up all extensions for a given message type.
182+
183+ Args:
184+ type_info: The extended message, either as a
185+ DescMessage, its fully qualified name, or a Message instance.
186+
187+ Returns:
188+ A list of extension descriptors for the given message type.
189+ """
190+ msg_type_name = _resolve_type_name (type_info )
191+ return list (self ._extendees .get (msg_type_name , {}).values ())
192+
179193 def extension_for (
180- self , type_info : DescMessage | str | Message , number : int
194+ self , type_info : _MessageTypeInfo , number : int
181195 ) -> DescExtension | None :
182196 """Look up an extension by the message it extends and field number.
183197
@@ -189,14 +203,7 @@ def extension_for(
189203 Returns:
190204 The descriptor for the extension, or `None` if not found.
191205 """
192- match type_info :
193- case DescMessage ():
194- msg_type_name = type_info .type_name
195- case Message ():
196- msg_type_name = type_info .desc ().type_name
197- case str ():
198- msg_type_name = type_info
199-
206+ msg_type_name = _resolve_type_name (type_info )
200207 return self ._extendees [msg_type_name ].get (number )
201208
202209 def _get_type (self , type_name : str , typ : type [_T ]) -> None | _T :
@@ -220,3 +227,13 @@ def __iter__(
220227 yield from self ._types .values ()
221228
222229 __slots__ = "_extendees" , "_files" , "_types"
230+
231+
232+ def _resolve_type_name (type_info : _MessageTypeInfo ) -> str :
233+ match type_info :
234+ case DescMessage ():
235+ return type_info .type_name
236+ case Message ():
237+ return type_info .desc ().type_name
238+ case str ():
239+ return type_info
0 commit comments