diff options
Diffstat (limited to 'qface/idl/listener.py')
-rw-r--r-- | qface/idl/listener.py | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/qface/idl/listener.py b/qface/idl/listener.py index 5fafa4f..2d8bfb6 100644 --- a/qface/idl/listener.py +++ b/qface/idl/listener.py @@ -8,6 +8,8 @@ from antlr4 import ParserRuleContext import yaml import click from .profile import get_features, EProfile, EFeature +import codecs +import json try: from yaml import CSafeLoader as Loader, CDumper as Dumper @@ -21,6 +23,10 @@ log = logging.getLogger(__name__) contextMap = {} +def escape_decode(s): + """removes \-escapes from str""" + return codecs.decode(bytes(s, 'utf-8'), 'unicode_escape') + class QFaceListener(TListener): def __init__(self, system, profile=EProfile.FULL): super().__init__() @@ -108,6 +114,11 @@ class DomainListener(QFaceListener): except yaml.YAMLError as exc: click.secho(str(exc), fg='red') + def parse_value(self, ctx, symbol): + self.check_support(EFeature.DEFAULT_VALUES) + if ctx.value: + symbol.value = escape_decode(ctx.value.text[1:-1]) + def enterEveryRule(self, ctx): log.debug('enter ' + ctx.__class__.__name__) @@ -213,15 +224,9 @@ class DomainListener(QFaceListener): self.property.readonly = bool(modifier.is_readonly) self.property.const = bool(modifier.is_const) - # if ctx.value: - # try: - # value = yaml.load(ctx.value.text, Loader=Loader) - # self.property._value = value - # except yaml.YAMLError as exc: - # click.secho(exc, fg='red') - self.parse_annotations(ctx, self.property) self.parse_type(ctx, self.property.type) + self.parse_value(ctx, self.property) contextMap[ctx] = self.property def exitPropertySymbol(self, ctx: TParser.PropertySymbolContext): @@ -232,6 +237,7 @@ class DomainListener(QFaceListener): name = ctx.name.text self.field = Field(name, self.struct) self.parse_annotations(ctx, self.field) + self.parse_value(ctx, self.field) contextMap[ctx] = self.field def exitStructFieldSymbol(self, ctx: TParser.StructFieldSymbolContext): |