- Make struct into a type constuctor - Rework placeholders - Got rid of 'PrimitiveType' as a concept - Moved out the prelude to its own folder Still in idea form [skip-ci]
100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
from typing import Any, Dict, Iterable, List, Mapping, Optional, Union
|
|
|
|
from .types import Type3, TypeConstructor, TypeConstructor_Struct
|
|
|
|
|
|
class TypeVariable:
|
|
__slots__ = ('letter', )
|
|
|
|
letter: str
|
|
|
|
def __init__(self, letter: str) -> None:
|
|
assert len(letter) == 1, f'{letter} is not a valid type variable'
|
|
self.letter = letter
|
|
|
|
def __hash__(self) -> int:
|
|
return hash(self.letter)
|
|
|
|
def __eq__(self, other: Any) -> bool:
|
|
if not isinstance(other, TypeVariable):
|
|
raise NotImplementedError
|
|
|
|
return self.letter == other.letter
|
|
|
|
def __repr__(self) -> str:
|
|
return f'TypeVariable({repr(self.letter)})'
|
|
|
|
class TypeReference:
|
|
__slots__ = ('name', )
|
|
|
|
name: str
|
|
|
|
def __init__(self, name: str) -> None:
|
|
assert len(name) > 1, f'{name} is not a valid type reference'
|
|
self.name = name
|
|
|
|
def __hash__(self) -> int:
|
|
return hash(self.name)
|
|
|
|
def __eq__(self, other: Any) -> bool:
|
|
if not isinstance(other, TypeReference):
|
|
raise NotImplementedError
|
|
|
|
return self.name == other.name
|
|
|
|
def __repr__(self) -> str:
|
|
return f'TypeReference({repr(self.name)})'
|
|
|
|
class Type3ClassMethod:
|
|
__slots__ = ('type3_class', 'name', 'signature', )
|
|
|
|
type3_class: 'Type3Class'
|
|
name: str
|
|
signature: List[Union[Type3, TypeVariable]]
|
|
|
|
def __init__(self, type3_class: 'Type3Class', name: str, signature: Iterable[Union[Type3, TypeVariable]]) -> None:
|
|
self.type3_class = type3_class
|
|
self.name = name
|
|
self.signature = list(signature)
|
|
|
|
def __repr__(self) -> str:
|
|
return f'Type3ClassMethod({repr(self.type3_class)}, {repr(self.name)}, {repr(self.signature)})'
|
|
|
|
class Type3Class:
|
|
__slots__ = ('name', 'args', 'methods', 'operators', 'inherited_classes', )
|
|
|
|
name: str
|
|
args: List[TypeVariable]
|
|
methods: Dict[str, Type3ClassMethod]
|
|
operators: Dict[str, Type3ClassMethod]
|
|
inherited_classes: List['Type3Class']
|
|
|
|
def __init__(
|
|
self,
|
|
name: str,
|
|
args: Iterable[TypeVariable],
|
|
methods: Mapping[str, Iterable[Union[Type3, TypeVariable]]],
|
|
operators: Mapping[str, Iterable[Union[Type3, TypeVariable]]],
|
|
inherited_classes: Optional[List['Type3Class']] = None,
|
|
) -> None:
|
|
self.name = name
|
|
self.args = list(args)
|
|
self.methods = {
|
|
k: Type3ClassMethod(self, k, v)
|
|
for k, v in methods.items()
|
|
}
|
|
self.operators = {
|
|
k: Type3ClassMethod(self, k, v)
|
|
for k, v in operators.items()
|
|
}
|
|
self.inherited_classes = inherited_classes or []
|
|
|
|
def __repr__(self) -> str:
|
|
return self.name
|
|
|
|
def instance_type_class(cls: Type3Class, typ: Type3 | TypeConstructor[Any] | TypeConstructor_Struct) -> None:
|
|
if isinstance(typ, Type3):
|
|
typ.classes.add(cls)
|
|
else:
|
|
typ.type_classes.add(cls)
|