summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-11 22:27:01 +0100
committerJuergen Bocklage-Ryannel <juergen.bocklage-ryannel@pelagicore.com>2017-02-11 22:27:01 +0100
commitb47657af5ef6fa87f850fcd48b106be4ecffaced (patch)
treebdbf3af4d17874731ae209ee1cdd31462e066fed
parent7941521f9d079e50af1c00e44f4a36212ff0dab5 (diff)
downloadqtivi-qface-b47657af5ef6fa87f850fcd48b106be4ecffaced.tar.gz
Introduced the NamedElement base class for the domain and removed the TypedSymbol. This makes the architecture simpler and less confusing when the Type was a Symbol.
Additonally introduced the contents property which shall generalize the “children” of a symbol, e.g. parameters of an operation. This shall help to write more reusable template helper functions.
-rw-r--r--qface/idl/domain.py84
-rw-r--r--qface/idl/listener.py1
-rw-r--r--tests/test_parser.py2
3 files changed, 48 insertions, 39 deletions
diff --git a/qface/idl/domain.py b/qface/idl/domain.py
index 1a8ca98..9fc553b 100644
--- a/qface/idl/domain.py
+++ b/qface/idl/domain.py
@@ -79,23 +79,21 @@ class System(object):
return (module_name, type_name, fragment_name)
-class Symbol(object):
- """A symbol represents a base class for names elements"""
- def __init__(self, name: str, module: 'Module'):
+class NamedElement(object):
+ def __init__(self, name, module: 'Module'):
self.name = name
"""symbol name"""
self.module = module
"""module the symbol belongs to"""
- self.comment = ''
- """comment which appeared in QFace right before symbol"""
- self._tags = OrderedDict()
- self._definitionMap = ChainMap()
+ def __unicode__(self):
+ return self.name
- @property
- def system(self):
- '''returns reference to system'''
- return self.module._system
+ def __str__(self):
+ return self.name
+
+ def __repr__(self):
+ return '<{0} name={1}>'.format(type(self), self.name)
@property
def qualified_name(self):
@@ -105,14 +103,22 @@ class Symbol(object):
else:
return '{0}.{1}'.format(self.module.name, self.name)
- def __unicode__(self):
- return self.name
- def __str__(self):
- return self.name
+class Symbol(NamedElement):
+ """A symbol represents a base class for names elements"""
+ def __init__(self, name: str, module: 'Module'):
+ super().__init__(name, module)
+ self.comment = ''
+ """comment which appeared in QFace right before symbol"""
+ self._tags = OrderedDict()
- def __repr__(self):
- return '<{0} name={1}>'.format(type(self), self.name)
+ self._contentMap = ChainMap()
+ self.type = TypeSymbol('', self)
+
+ @property
+ def system(self):
+ '''returns reference to system'''
+ return self.module._system
@property
def tags(self):
@@ -134,18 +140,15 @@ class Symbol(object):
if tag in self._tags:
return self._tags[tag][name]
+ @property
+ def contents(self):
+ return self._contentMap.values()
-class TypedSymbol(Symbol):
- """A symbol which has a type, like an operation or property."""
- def __init__(self, name: str, module: 'Module'):
- super().__init__(name, module)
- self.type = TypeSymbol("", self)
- """type object of the symbol"""
-class TypeSymbol(Symbol):
+class TypeSymbol(NamedElement):
"""Defines a type in the system"""
- def __init__(self, name: str, parent: Symbol):
+ def __init__(self, name: str, parent: NamedElement):
super().__init__(name, parent.module)
log.debug('TypeSymbol()')
self.parent = parent
@@ -160,6 +163,11 @@ class TypeSymbol(Symbol):
self.__is_resolved = False
@property
+ def is_valid(self):
+ '''checks if type is a valid type'''
+ return self.is_primitive or self.is_complex
+
+ @property
def is_bool(self):
'''checks if type is primitive and bool'''
return self.is_primitive and self.name == 'bool'
@@ -225,7 +233,7 @@ class Module(Symbol):
self._interfaceMap = OrderedDict() # type: dict[str, Interface]
self._structMap = OrderedDict() # type: dict[str, Struct]
self._enumMap = OrderedDict() # type: dict[str, Enum]
- self._definitionMap = ChainMap(self._interfaceMap, self._structMap, self._enumMap)
+ self._contentMap = ChainMap(self._interfaceMap, self._structMap, self._enumMap)
self._importMap = OrderedDict() # type: dict[str, Module]
@property
@@ -268,10 +276,10 @@ class Module(Symbol):
def lookup(self, name: str, fragment: str = None):
'''lookup a symbol by name. If symbol is not local
it will be looked up system wide'''
- if name in self._definitionMap:
- symbol = self._definitionMap[name]
+ if name in self._contentMap:
+ symbol = self._contentMap[name]
if fragment:
- return symbol._definitionMap[fragment]
+ return symbol._contentMap[fragment]
return symbol
return self.system.lookup(name)
@@ -285,7 +293,7 @@ class Interface(Symbol):
self._propertyMap = OrderedDict() # type: dict[str, Property]
self._operationMap = OrderedDict() # type: dict[str, Operation]
self._signalMap = OrderedDict() # type: dict[str, Signal]
- self._definitionMap = ChainMap(self._propertyMap, self._operationMap, self._signalMap)
+ self._contentMap = ChainMap(self._propertyMap, self._operationMap, self._signalMap)
@property
def properties(self):
@@ -303,14 +311,14 @@ class Interface(Symbol):
return self._signalMap.values()
-class Operation(TypedSymbol):
+class Operation(Symbol):
"""An operation inside a interface"""
def __init__(self, name: str, interface: Interface):
super().__init__(name, interface.module)
log.debug('Operation()')
self.interface = interface
self.interface._operationMap[name] = self
- self._parameterMap = OrderedDict() # type: dict[Parameter]
+ self._parameterMap = self._contentMap = OrderedDict() # type: dict[Parameter]
@property
def parameters(self):
@@ -325,7 +333,7 @@ class Signal(Symbol):
log.debug('Signal()')
self.interface = interface
self.interface._signalMap[name] = self
- self._parameterMap = OrderedDict() # type: dict[Parameter]
+ self._parameterMap = self._contentMap = OrderedDict() # type: dict[Parameter]
@property
def parameters(self):
@@ -333,7 +341,7 @@ class Signal(Symbol):
return self._parameterMap.values()
-class Parameter(TypedSymbol):
+class Parameter(Symbol):
"""An operation parameter"""
def __init__(self, name: str, operation: Operation):
super().__init__(name, operation.module)
@@ -342,7 +350,7 @@ class Parameter(TypedSymbol):
self.operation._parameterMap[name] = self
-class Property(TypedSymbol):
+class Property(Symbol):
"""A typed property inside a interface"""
def __init__(self, name: str, interface: Interface):
super().__init__(name, interface.module)
@@ -358,7 +366,7 @@ class Struct(Symbol):
super().__init__(name, module)
log.debug('Struct()')
self.module._structMap[name] = self
- self._fieldMap = OrderedDict() # type: dict[str, Field]
+ self._fieldMap = self._contentMap = OrderedDict() # type: dict[str, Field]
@property
def fields(self):
@@ -366,7 +374,7 @@ class Struct(Symbol):
return self._fieldMap.values()
-class Field(TypedSymbol):
+class Field(Symbol):
"""A member in a struct"""
def __init__(self, name: str, struct: Struct):
super().__init__(name, struct.module)
@@ -383,7 +391,7 @@ class Enum(Symbol):
self.is_enum = True
self.is_flag = False
self.module._enumMap[name] = self
- self._memberMap = OrderedDict() # type: dict[EnumMember]
+ self._memberMap = self._contentMap = OrderedDict() # type: dict[EnumMember]
@property
def members(self):
diff --git a/qface/idl/listener.py b/qface/idl/listener.py
index 925e908..826f44f 100644
--- a/qface/idl/listener.py
+++ b/qface/idl/listener.py
@@ -34,6 +34,7 @@ class DomainListener(TListener):
self.field = None # type:Field
def parse_type(self, ctx: ParserRuleContext, type: TypeSymbol):
+ assert type
if not ctx.typeSymbol():
type.is_void = True
type.name = 'void'
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 8357632..2da5e44 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -61,7 +61,7 @@ def test_operation():
interface = system.lookup('com.pelagicore.ivi.tuner.Tuner')
operation = interface._operationMap['nextStation']
assert operation
- operation = interface._definitionMap['previousStation']
+ operation = interface._contentMap['previousStation']
assert operation