diff options
Diffstat (limited to 'qface/idl/domain.py')
-rw-r--r-- | qface/idl/domain.py | 113 |
1 files changed, 110 insertions, 3 deletions
diff --git a/qface/idl/domain.py b/qface/idl/domain.py index c774c16..3be53ff 100644 --- a/qface/idl/domain.py +++ b/qface/idl/domain.py @@ -78,6 +78,11 @@ class System(object): type_name = parts[1] return (module_name, type_name, fragment_name) + def toJson(self): + o = {} + o['modules'] = [o.toJson() for o in self.modules] + return o + class NamedElement(object): def __init__(self, name, module: 'Module'): @@ -103,6 +108,12 @@ class NamedElement(object): else: return '{0}.{1}'.format(self.module.name, self.name) + def toJson(self): + o = {} + if self.name: + o['name'] = self.name + return o + class Symbol(NamedElement): """A symbol represents a base class for names elements""" @@ -144,6 +155,11 @@ class Symbol(NamedElement): def contents(self): return self._contentMap.values() + def toJson(self): + o = super().toJson() + if self.type.is_valid: + o['type'] = self.type.toJson() + return o class TypeSymbol(NamedElement): @@ -165,7 +181,10 @@ class TypeSymbol(NamedElement): @property def is_valid(self): '''checks if type is a valid type''' - return self.is_primitive or self.is_complex + return (self.is_primitive and self.name) \ + or (self.is_complex and self.name) \ + or (self.is_list and self.nested) \ + or (self.is_model and self.nested) \ @property def is_bool(self): @@ -198,6 +217,11 @@ class TypeSymbol(NamedElement): return self.is_complex and isinstance(self.reference, Struct) @property + def is_interface(self): + '''checks if type is interface''' + return self.is_complex and isinstance(self.reference, Interface) + + @property def is_variant(self): '''checks if type is primitive and string''' return self.is_primitive and self.name == 'var' @@ -220,6 +244,22 @@ class TypeSymbol(NamedElement): def type(self): return self + def toJson(self): + o = super().toJson() + if self.is_void: + o['void'] = self.is_void + if self.is_primitive: + o['primitive'] = self.is_primitive + if self.is_complex: + o['complex'] = self.is_complex + if self.is_list: + o['list'] = self.is_list + if self.is_model: + o['model'] = self.is_model + if self.nested: + o['nested'] = self.nested.toJson() + return o + class Module(Symbol): """Module is a namespace for types, e.g. interfaces, enums, structs""" @@ -270,6 +310,14 @@ class Module(Symbol): return self.name.split('.') @property + def majorVersion(self): + return self.version.split('.')[0] + + @property + def minorVersion(self): + return self.version.split('.')[1] + + @property def module_name(self): return self.name.split('.')[-1].capitalize() @@ -283,6 +331,14 @@ class Module(Symbol): return symbol return self.system.lookup(name) + def toJson(self): + o = super().toJson() + o['version'] = self.version + o['interfaces'] = [s.toJson() for s in self.interfaces] + o['structs'] = [s.toJson() for s in self.structs] + o['enums'] = [s.toJson() for s in self.enums] + return o + class Interface(Symbol): """A interface is an object with operations, properties and signals""" @@ -294,6 +350,7 @@ class Interface(Symbol): self._operationMap = OrderedDict() # type: dict[str, Operation] self._signalMap = OrderedDict() # type: dict[str, Signal] self._contentMap = ChainMap(self._propertyMap, self._operationMap, self._signalMap) + self._extends = None @property def properties(self): @@ -310,6 +367,17 @@ class Interface(Symbol): '''returns ordered list of signals''' return self._signalMap.values() + @property + def extends(self): + return self.module.lookup(self._extends) + + def toJson(self): + o = super().toJson() + o['properties'] = [s.toJson() for s in self.properties] + o['operations'] = [s.toJson() for s in self.operations] + o['signals'] = [s.toJson() for s in self.signals] + return o + class Operation(Symbol): """An operation inside a interface""" @@ -325,6 +393,11 @@ class Operation(Symbol): '''returns ordered list of parameters''' return self._parameterMap.values() + def toJson(self): + o = super().toJson() + o['parameters'] = [s.toJson() for s in self.parameters] + return o + class Signal(Symbol): """A signal inside an interface""" @@ -340,6 +413,11 @@ class Signal(Symbol): '''returns ordered list of parameters''' return self._parameterMap.values() + def toJson(self): + o = super().toJson() + o['parameters'] = [s.toJson() for s in self.parameters] + return o + class Parameter(Symbol): """An operation parameter""" @@ -357,7 +435,16 @@ class Property(Symbol): log.debug('Property()') self.interface = interface self.interface._propertyMap[name] = self - self.is_readonly = False + self.readonly = False + self.const = False + + def toJson(self): + o = super().toJson() + if self.readonly: + o['readonly'] = True + if self.const: + o['const'] = True + return o class Struct(Symbol): @@ -366,13 +453,18 @@ class Struct(Symbol): super().__init__(name, module) log.debug('Struct()') self.module._structMap[name] = self - self._fieldMap = self._contentMap = OrderedDict() # type: dict[str, Field] + self._fieldMap = self._contentMap = OrderedDict() @property def fields(self): '''returns ordered list of members''' return self._fieldMap.values() + def toJson(self): + o = super().toJson() + o['fields'] = [s.toJson() for s in self.fields] + return o + class Field(Symbol): """A member in a struct""" @@ -398,6 +490,15 @@ class Enum(Symbol): '''returns ordered list of members''' return self._memberMap.values() + def toJson(self): + o = super().toJson() + if self.is_enum: + o['enum'] = self.is_enum + if self.is_flag: + o['flag'] = self.is_flag + o['members'] = [s.toJson() for s in self.members] + return o + class EnumMember(Symbol): """A enum value""" @@ -407,3 +508,9 @@ class EnumMember(Symbol): self.enum = enum self.enum._memberMap[name] = self self.value = 0 + + def toJson(self): + o = super().toJson() + o['value'] = self.value + return o + |