@@ -192,7 +192,7 @@ def may_be_immortal(self) -> bool:
192192def serialize (self )-> str :
193193return "void"
194194
195- def __eq__ (self ,other :object )-> bool :
195+ def __eq__ (self ,other :object )-> TypeGuard [ RVoid ] :
196196return isinstance (other ,RVoid )
197197
198198def __hash__ (self )-> int :
@@ -279,7 +279,7 @@ def serialize(self) -> str:
279279def __repr__ (self )-> str :
280280return "<RPrimitive %s>" % self .name
281281
282- def __eq__ (self ,other :object )-> bool :
282+ def __eq__ (self ,other :object )-> TypeGuard [ RPrimitive ] :
283283return isinstance (other ,RPrimitive )and other .name == self .name
284284
285285def __hash__ (self )-> int :
@@ -513,15 +513,15 @@ def __hash__(self) -> int:
513513range_rprimitive :Final = RPrimitive ("builtins.range" ,is_unboxed = False ,is_refcounted = True )
514514
515515
516- def is_tagged (rtype :RType )-> bool :
516+ def is_tagged (rtype :RType )-> TypeGuard [ RPrimitive ] :
517517return rtype is int_rprimitive or rtype is short_int_rprimitive
518518
519519
520- def is_int_rprimitive (rtype :RType )-> bool :
520+ def is_int_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
521521return rtype is int_rprimitive
522522
523523
524- def is_short_int_rprimitive (rtype :RType )-> bool :
524+ def is_short_int_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
525525return rtype is short_int_rprimitive
526526
527527
@@ -535,7 +535,7 @@ def is_int32_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]:
535535 )
536536
537537
538- def is_int64_rprimitive (rtype :RType )-> bool :
538+ def is_int64_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
539539return rtype is int64_rprimitive or (
540540rtype is c_pyssize_t_rprimitive and rtype ._ctype == "int64_t"
541541 )
@@ -554,81 +554,93 @@ def is_uint8_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]:
554554return rtype is uint8_rprimitive
555555
556556
557- def is_uint32_rprimitive (rtype :RType )-> bool :
557+ def is_uint32_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
558558return rtype is uint32_rprimitive
559559
560560
561- def is_uint64_rprimitive (rtype :RType )-> bool :
561+ def is_uint64_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
562562return rtype is uint64_rprimitive
563563
564564
565- def is_c_py_ssize_t_rprimitive (rtype :RType )-> bool :
565+ def is_c_py_ssize_t_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
566566return rtype is c_pyssize_t_rprimitive
567567
568568
569- def is_pointer_rprimitive (rtype :RType )-> bool :
569+ def is_pointer_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
570570return rtype is pointer_rprimitive
571571
572572
573- def is_float_rprimitive (rtype :RType )-> bool :
573+ def is_float_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
574574return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.float"
575575
576576
577- def is_bool_rprimitive (rtype :RType )-> bool :
577+ def is_bool_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
578578return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.bool"
579579
580580
581- def is_bit_rprimitive (rtype :RType )-> bool :
581+ def is_bit_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
582582return isinstance (rtype ,RPrimitive )and rtype .name == "bit"
583583
584584
585- def is_bool_or_bit_rprimitive (rtype :RType )-> bool :
585+ def is_bool_or_bit_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
586586return is_bool_rprimitive (rtype )or is_bit_rprimitive (rtype )
587587
588588
589- def is_object_rprimitive (rtype :RType )-> bool :
589+ def is_object_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
590590return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.object"
591591
592592
593- def is_none_rprimitive (rtype :RType )-> bool :
593+ def is_none_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
594594return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.None"
595595
596596
597- def is_list_rprimitive (rtype :RType )-> bool :
597+ def is_list_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
598598return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.list"
599599
600600
601- def is_dict_rprimitive (rtype :RType )-> bool :
601+ def is_dict_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
602602return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.dict"
603603
604604
605- def is_set_rprimitive (rtype :RType )-> bool :
605+ def is_set_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
606606return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.set"
607607
608608
609- def is_frozenset_rprimitive (rtype :RType )-> bool :
609+ def is_frozenset_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
610610return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.frozenset"
611611
612612
613- def is_str_rprimitive (rtype :RType )-> bool :
613+ def is_str_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
614614return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.str"
615615
616616
617- def is_bytes_rprimitive (rtype :RType )-> bool :
617+ def is_bytes_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
618618return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.bytes"
619619
620620
621- def is_tuple_rprimitive (rtype :RType )-> bool :
621+ def is_tuple_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
622622return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.tuple"
623623
624624
625- def is_range_rprimitive (rtype :RType )-> bool :
625+ def is_range_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
626626return isinstance (rtype ,RPrimitive )and rtype .name == "builtins.range"
627627
628628
629- def is_sequence_rprimitive (rtype :RType )-> bool :
629+ def is_sequence_rprimitive (rtype :RType )-> TypeGuard [ RPrimitive ] :
630630return isinstance (rtype ,RPrimitive )and (
631- is_list_rprimitive (rtype )or is_tuple_rprimitive (rtype )or is_str_rprimitive (rtype )
631+ is_list_rprimitive (rtype )
632+ or is_tuple_rprimitive (rtype )
633+ or is_str_rprimitive (rtype )
634+ or is_bytes_rprimitive (rtype )
635+ )
636+
637+
638+ def is_immutable_rprimitive (rtype :RType )-> TypeGuard [RPrimitive ]:
639+ return (
640+ is_str_rprimitive (rtype )
641+ or is_bytes_rprimitive (rtype )
642+ or is_tuple_rprimitive (rtype )
643+ or is_frozenset_rprimitive (rtype )
632644 )
633645
634646
@@ -717,7 +729,7 @@ def __str__(self) -> str:
717729def __repr__ (self )-> str :
718730return "<RTuple %s>" % ", " .join (repr (typ )for typ in self .types )
719731
720- def __eq__ (self ,other :object )-> bool :
732+ def __eq__ (self ,other :object )-> TypeGuard [ RTuple ] :
721733return isinstance (other ,RTuple )and self .types == other .types
722734
723735def __hash__ (self )-> int :
@@ -850,7 +862,7 @@ def __repr__(self) -> str:
850862", " .join (name + ":" + repr (typ )for name ,typ in zip (self .names ,self .types )),
851863 )
852864
853- def __eq__ (self ,other :object )-> bool :
865+ def __eq__ (self ,other :object )-> TypeGuard [ RStruct ] :
854866return (
855867isinstance (other ,RStruct )
856868and self .name == other .name
@@ -920,7 +932,7 @@ def attr_type(self, name: str) -> RType:
920932def __repr__ (self )-> str :
921933return "<RInstance %s>" % self .name
922934
923- def __eq__ (self ,other :object )-> bool :
935+ def __eq__ (self ,other :object )-> TypeGuard [ RInstance ] :
924936return isinstance (other ,RInstance )and other .name == self .name
925937
926938def __hash__ (self )-> int :
@@ -974,7 +986,7 @@ def __str__(self) -> str:
974986return "union[%s]" % ", " .join (str (item )for item in self .items )
975987
976988# We compare based on the set because order in a union doesn't matter
977- def __eq__ (self ,other :object )-> bool :
989+ def __eq__ (self ,other :object )-> TypeGuard [ RUnion ] :
978990return isinstance (other ,RUnion )and self .items_set == other .items_set
979991
980992def __hash__ (self )-> int :
@@ -1016,7 +1028,7 @@ def optional_value_type(rtype: RType) -> RType | None:
10161028return None
10171029
10181030
1019- def is_optional_type (rtype :RType )-> bool :
1031+ def is_optional_type (rtype :RType )-> TypeGuard [ RUnion ] :
10201032"""Is rtype an optional type with exactly two union items?"""
10211033return optional_value_type (rtype )is not None
10221034
@@ -1048,7 +1060,7 @@ def __str__(self) -> str:
10481060def __repr__ (self )-> str :
10491061return f"<RArray{ self .item_type !r} [{ self .length } ]>"
10501062
1051- def __eq__ (self ,other :object )-> bool :
1063+ def __eq__ (self ,other :object )-> TypeGuard [ RArray ] :
10521064return (
10531065isinstance (other ,RArray )
10541066and self .item_type == other .item_type