forked from odriverobotics/ODrive
-
Notifications
You must be signed in to change notification settings - Fork 0
/
type_info.py
96 lines (77 loc) · 2.56 KB
/
type_info.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from abc import ABC, abstractmethod
from typing import List
class TypeInfo(ABC):
pass
class TypeRef(ABC):
@abstractmethod
def resolve(self) -> 'TypeInfo':
pass
class ResolvedTypeRef(TypeRef):
def __init__(self, type: 'TypeInfo'):
assert isinstance(type, TypeInfo)
self.type = type
def resolve(self):
return self.type
class ArgInfo():
def __init__(self, name: str, type: TypeRef, doc: str):
self.name = name
self.type = type
self.doc = doc
class FunctionInfo():
def __init__(self, name: str, input_args: List[ArgInfo], output_args: List[ArgInfo], brief: str, doc: str):
self.name = name
self.input_args = input_args
self.output_args = output_args
self.brief = brief
self.doc = doc
class AttributeInfo():
def __init__(self, name: str, type: TypeRef, readonly: bool, brief: str, doc: str):
self.name = name
self.type = type
self.readonly = readonly
self.brief = brief
self.doc = doc
class FlagInfo():
def __init__(self, name, bit, brief, doc):
self.name = name
self.brief = brief
self.doc = doc
self.bit = bit
class EnumeratorInfo():
def __init__(self, name, value, brief, doc):
self.name = name
self.brief = brief
self.doc = doc
self.value = value
class ClassInfo(TypeInfo):
label = 'class'
@staticmethod
def make_empty(name: str):
return ClassInfo(name, [], [])
def __init__(self, name: str, functions: List[FunctionInfo], attributes: List[AttributeInfo]):
self.name = name
self.functions = functions
self.attributes = attributes
self.py_ref_type = name # TODO
class BitfieldInfo(TypeInfo):
label = 'bitfield'
@staticmethod
def make_empty(name: str):
return BitfieldInfo(name, [])
def __init__(self, name: str, flags: List[FlagInfo]):
self.name = name
self.py_ref_type = 'Property[' + name + ']' # TODO
self.flags = flags
def get_next_bit(self):
return 0 if len(self.flags) == 0 else (self.flags[-1].bit + 1)
class EnumInfo(TypeInfo):
label = 'enum'
@staticmethod
def make_empty(name: str):
return EnumInfo(name, [])
def __init__(self, name: str, enumerators: List[EnumeratorInfo]):
self.name = name
self.py_ref_type = 'Property[' + name + ']' # TODO
self.enumerators = enumerators
def get_next_value(self):
return 0 if len(self.enumerators) == 0 else (self.enumerators[-1].value + 1)