A lot of isinstance checks no longer did anything, since the referred to variable was always a type. In some places, we used it to check if a type was internal, it's unclear if we will need to rebuild those checks in the future.
67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
"""
|
|
Contains the placeholder for types for use in Phasm.
|
|
|
|
These are temporary while the compiler is calculating all the types and validating them.
|
|
"""
|
|
from typing import Any, Iterable, List, Optional, Protocol, Union
|
|
|
|
from .types import Type3
|
|
|
|
|
|
class ExpressionProtocol(Protocol):
|
|
"""
|
|
A protocol for classes that should be updated on substitution
|
|
"""
|
|
|
|
type3: Type3 | None
|
|
"""
|
|
The type to update
|
|
"""
|
|
|
|
class PlaceholderForType:
|
|
"""
|
|
A placeholder type, for when we don't know the final type yet
|
|
"""
|
|
__slots__ = ('update_on_substitution', 'resolve_as', )
|
|
|
|
update_on_substitution: List[ExpressionProtocol]
|
|
resolve_as: Optional[Type3]
|
|
|
|
def __init__(self, update_on_substitution: Iterable[ExpressionProtocol]) -> None:
|
|
self.update_on_substitution = [*update_on_substitution]
|
|
self.resolve_as = None
|
|
|
|
def __repr__(self) -> str:
|
|
uos = ', '.join(repr(x) for x in self.update_on_substitution)
|
|
|
|
return f'PlaceholderForType({id(self)}, [{uos}])'
|
|
|
|
def __str__(self) -> str:
|
|
return f'PhFT_{id(self)}'
|
|
|
|
def __format__(self, format_spec: str) -> str:
|
|
if format_spec != 's':
|
|
raise TypeError('unsupported format string passed to Type3.__format__')
|
|
|
|
return str(self)
|
|
|
|
def __eq__(self, other: Any) -> bool:
|
|
if isinstance(other, Type3):
|
|
return False
|
|
|
|
if not isinstance(other, PlaceholderForType):
|
|
raise NotImplementedError
|
|
|
|
return self is other
|
|
|
|
def __ne__(self, other: Any) -> bool:
|
|
return not self.__eq__(other)
|
|
|
|
def __hash__(self) -> int:
|
|
return 0 # Valid but performs badly
|
|
|
|
def __bool__(self) -> bool:
|
|
raise NotImplementedError
|
|
|
|
Type3OrPlaceholder = Union[Type3, PlaceholderForType]
|