Source code for remcall.generate

from . import schema
from . import RemcallError
from .naming import CSharpNameConverter

[docs]class CSharphCodeGenerator: indent_chars = '\t' type_names = { schema.void: 'void', schema.boolean: 'bool', schema.int8: 'SByte', schema.uint8: 'byte', schema.int16: 'Int16', schema.uint16: 'UInt16', schema.int32: 'Int32', schema.uint32: 'UInt32', schema.int64: 'Int64', schema.uint64: 'UInt64', schema.float32: 'float', schema.float64: 'double', schema.string: 'string', schema.date: 'DateTime', schema.time: 'Time', schema.datetime: 'DateTime' } def __init__(self, schema, namespace='Remcall.Generated', name_converter = CSharpNameConverter()): self.schema = schema self.namespace = namespace self.name_converter = name_converter self._indent = 0 self.outfile = None
[docs] def writeline(self, s): print(self.indent_chars * self._indent + s, file=self.outfile)
[docs] def linebreak(self): print(file=self.outfile)
[docs] def indent(self): self._indent += 1
[docs] def dedent(self): self._indent -= 1 if self._indent < 0: raise RemcallError('Trying to create negative indent')
[docs] def scalartypename(self, typ): assert not isinstance(typ, schema.Array) if isinstance(typ, schema.Primitive): return self.type_names[typ] else: return self.name_converter.type_name(typ)
[docs] def typename(self, typ): return '{}[]'.format(self.scalartypename(typ.typ)) if isinstance(typ, schema.Array) else self.scalartypename(typ)
[docs] def write_schema(self, fp): self.outfile = fp self.writeline('// Code generated by remcall, do not edit!') self.writeline('using System;') self.linebreak() self.writeline('namespace {} {{'.format(self.namespace)) self.linebreak() self.indent() for enum in self.schema.enums_sorted: self.write_enum(enum) self.linebreak() for record in self.schema.records_sorted: self.write_record(record) self.linebreak() for interface in self.schema.interfaces_sorted: self.write_interface(interface) self.linebreak() self.dedent() self.writeline('}')
[docs] def write_enum(self, enum): enum_name = self.scalartypename(enum) enum_values = [self.name_converter.enum_field_name(v) for v in enum.values] self.writeline('enum {} {{ {} }}'.format(enum_name, ', '.join(enum_values)))
[docs] def write_record(self, record): record_name = self.scalartypename(record) fields = ['{} {};'.format(self.typename(typ), self.name_converter.record_field_name(name)) for typ, name in record.fields] self.writeline('struct {} {{'.format(record_name)) self.indent() for field in fields: self.writeline(field) self.dedent() self.writeline('}')
[docs] def write_interface(self, interface): interface_name = self.scalartypename(interface) self.writeline('interface {} {{'.format(interface_name)) self.indent() for method in interface.methods_sorted: self.write_method(method) self.dedent() self.writeline('}')
[docs] def write_method(self, method): method_name = self.name_converter.method_name(method.name) args = ['{!s} {}'.format(self.typename(typ), self.name_converter.parameter_name(name)) for typ, name in method.arguments] ret = self.typename(method.return_type) self.writeline('{} {}({});'.format(ret, method.name, ', '.join(args)))