@@ -1527,6 +1527,82 @@ def _create_literal_var(
15271527 def __post_init__ (self ):
15281528 """Post-initialize the var."""
15291529
1530+ @classmethod
1531+ def _get_all_var_data_without_creating_var (
1532+ cls ,
1533+ value : Any ,
1534+ ) -> VarData | None :
1535+ return cls .create (value )._get_all_var_data ()
1536+
1537+ @classmethod
1538+ def _get_all_var_data_without_creating_var_dispatch (
1539+ cls ,
1540+ value : Any ,
1541+ ) -> VarData | None :
1542+ """Get all the var data without creating a var.
1543+
1544+ Args:
1545+ value: The value to get the var data from.
1546+
1547+ Returns:
1548+ The var data or None.
1549+
1550+ Raises:
1551+ TypeError: If the value is not a supported type for LiteralVar.
1552+ """
1553+ from .object import LiteralObjectVar
1554+ from .sequence import LiteralStringVar
1555+
1556+ if isinstance (value , Var ):
1557+ return value ._get_all_var_data ()
1558+
1559+ for literal_subclass , var_subclass in _var_literal_subclasses [::- 1 ]:
1560+ if isinstance (value , var_subclass .python_types ):
1561+ return literal_subclass ._get_all_var_data_without_creating_var (value )
1562+
1563+ if (
1564+ (as_var_method := getattr (value , "_as_var" , None )) is not None
1565+ and callable (as_var_method )
1566+ and isinstance ((resulting_var := as_var_method ()), Var )
1567+ ):
1568+ return resulting_var ._get_all_var_data ()
1569+
1570+ from reflex .event import EventHandler
1571+ from reflex .utils .format import get_event_handler_parts
1572+
1573+ if isinstance (value , EventHandler ):
1574+ return Var (
1575+ _js_expr = "." .join (filter (None , get_event_handler_parts (value )))
1576+ )._get_all_var_data ()
1577+
1578+ serialized_value = serializers .serialize (value )
1579+ if serialized_value is not None :
1580+ if isinstance (serialized_value , Mapping ):
1581+ return LiteralObjectVar ._get_all_var_data_without_creating_var (
1582+ serialized_value
1583+ )
1584+ if isinstance (serialized_value , str ):
1585+ return LiteralStringVar ._get_all_var_data_without_creating_var (
1586+ serialized_value
1587+ )
1588+ return LiteralVar ._get_all_var_data_without_creating_var_dispatch (
1589+ serialized_value
1590+ )
1591+
1592+ if dataclasses .is_dataclass (value ) and not isinstance (value , type ):
1593+ return LiteralObjectVar ._get_all_var_data_without_creating_var (
1594+ {
1595+ k : (None if callable (v ) else v )
1596+ for k , v in dataclasses .asdict (value ).items ()
1597+ }
1598+ )
1599+
1600+ if isinstance (value , range ):
1601+ return None
1602+
1603+ msg = f"Unsupported type { type (value )} for LiteralVar. Tried to create a LiteralVar from { value } ."
1604+ raise TypeError (msg )
1605+
15301606 @property
15311607 def _var_value (self ) -> Any :
15321608 msg = "LiteralVar subclasses must implement the _var_value property."
@@ -1688,30 +1764,30 @@ def figure_out_type(value: Any) -> types.GenericType:
16881764 Returns:
16891765 The type of the value.
16901766 """
1691- if isinstance (value , Var ):
1692- return value . _var_type
1693- type_ = type ( value )
1694- if has_args (type_ ):
1695- return type_
1696- if isinstance (value , list ):
1697- if not value :
1698- return Sequence [NoReturn ]
1699- return Sequence [unionize (* ( figure_out_type (v ) for v in value ) )]
1700- if isinstance (value , set ):
1701- return set [unionize (* ( figure_out_type (v ) for v in value ) )]
1702- if isinstance (value , tuple ):
1703- if not value :
1704- return tuple [NoReturn , ...]
1705- if len (value ) <= 5 :
1706- return tuple [tuple (figure_out_type (v ) for v in value )]
1707- return tuple [unionize (* ( figure_out_type (v ) for v in value ) ), ...]
1708- if isinstance (value , Mapping ):
1709- if not value :
1710- return Mapping [NoReturn , NoReturn ]
1711- return Mapping [
1712- unionize (* ( figure_out_type (k ) for k in value ) ),
1713- unionize (* ( figure_out_type (v ) for v in value .values ()) ),
1714- ]
1767+ if isinstance (value , ( list , set , tuple , Mapping , Var ) ):
1768+ if isinstance ( value , Var ):
1769+ return value . _var_type
1770+ if has_args (value_type := type ( value ) ):
1771+ return value_type
1772+ if isinstance (value , list ):
1773+ if not value :
1774+ return Sequence [NoReturn ]
1775+ return Sequence [unionize (* { figure_out_type (v ) for v in value } )]
1776+ if isinstance (value , set ):
1777+ return set [unionize (* { figure_out_type (v ) for v in value } )]
1778+ if isinstance (value , tuple ):
1779+ if not value :
1780+ return tuple [NoReturn , ...]
1781+ if len (value ) <= 5 :
1782+ return tuple [tuple (figure_out_type (v ) for v in value )]
1783+ return tuple [unionize (* { figure_out_type (v ) for v in value } ), ...]
1784+ if isinstance (value , Mapping ):
1785+ if not value :
1786+ return Mapping [NoReturn , NoReturn ]
1787+ return Mapping [
1788+ unionize (* { figure_out_type (k ) for k in value } ),
1789+ unionize (* { figure_out_type (v ) for v in value .values ()} ),
1790+ ]
17151791 return type (value )
17161792
17171793
@@ -2883,6 +2959,10 @@ def json(self) -> str:
28832959 """
28842960 return "null"
28852961
2962+ @classmethod
2963+ def _get_all_var_data_without_creating_var (cls , value : None ) -> VarData | None :
2964+ return None
2965+
28862966 @classmethod
28872967 def create (
28882968 cls ,
0 commit comments