Skip to content
Snippets Groups Projects
Commit 5c29754f authored by Frederik Hennig's avatar Frederik Hennig
Browse files

added custom definitions to classes

parent 463207f2
Branches
Tags
No related merge requests found
Pipeline #58234 passed
...@@ -50,6 +50,6 @@ with SourceFileGenerator(sfg_config) as ctx: ...@@ -50,6 +50,6 @@ with SourceFileGenerator(sfg_config) as ctx:
), ),
c.public( c.public(
"using xtype = uint8_t;"
) )
) )
...@@ -25,6 +25,7 @@ from .source_components import ( ...@@ -25,6 +25,7 @@ from .source_components import (
SfgKernelHandle, SfgKernelHandle,
SfgClass, SfgClass,
SfgClassMember, SfgClassMember,
SfgInClassDefinition,
SfgConstructor, SfgConstructor,
SfgMethod, SfgMethod,
SfgMemberVariable, SfgMemberVariable,
...@@ -359,21 +360,28 @@ class SfgClassComposer: ...@@ -359,21 +360,28 @@ class SfgClassComposer:
def members(self): def members(self):
yield from self._partial_members yield from self._partial_members
def __call__(self, *args: SfgClassComposer.PartialMember | SrcObject): def __call__(self, *args: SfgClassComposer.PartialMember | SrcObject | str):
for arg in args: for arg in args:
if isinstance(arg, SrcObject): if isinstance(arg, SrcObject):
self._partial_members.append(SfgClassComposer.PartialMember( self._partial_members.append(
SfgMemberVariable, SfgClassComposer.PartialMember(
name=arg.name, SfgMemberVariable, name=arg.name, dtype=arg.dtype
dtype=arg.dtype )
)) )
elif isinstance(arg, str):
self._partial_members.append(
SfgClassComposer.PartialMember(SfgInClassDefinition, text=arg)
)
else: else:
self._partial_members.append(arg) self._partial_members.append(arg)
return self return self
def resolve(self, cls: SfgClass) -> list[SfgClassMember]: def resolve(self, cls: SfgClass) -> list[SfgClassMember]:
return [part.resolve(cls=cls, visibility=self._vis) for part in self._partial_members] return [
part.resolve(cls=cls, visibility=self._vis)
for part in self._partial_members
]
class ConstructorBuilder: class ConstructorBuilder:
def __init__(self, *params: SrcObject): def __init__(self, *params: SrcObject):
...@@ -389,7 +397,7 @@ class SfgClassComposer: ...@@ -389,7 +397,7 @@ class SfgClassComposer:
SfgConstructor, SfgConstructor,
parameters=self._params, parameters=self._params,
initializers=self._initializers, initializers=self._initializers,
body=body body=body,
) )
def klass(self, class_name: str, bases: Sequence[str] = ()): def klass(self, class_name: str, bases: Sequence[str] = ()):
...@@ -413,12 +421,12 @@ class SfgClassComposer: ...@@ -413,12 +421,12 @@ class SfgClassComposer:
return SfgClassComposer.ConstructorBuilder(*params) return SfgClassComposer.ConstructorBuilder(*params)
def method( def method(
self, self,
name: str, name: str,
returns: SrcType = SrcType("void"), returns: SrcType = SrcType("void"),
inline: bool = False, inline: bool = False,
const: bool = False): const: bool = False,
):
def sequencer(*args: str | tuple | SfgCallTreeNode | SfgNodeBuilder): def sequencer(*args: str | tuple | SfgCallTreeNode | SfgNodeBuilder):
tree = make_sequence(*args) tree = make_sequence(*args)
return SfgClassComposer.PartialMember( return SfgClassComposer.PartialMember(
...@@ -427,7 +435,7 @@ class SfgClassComposer: ...@@ -427,7 +435,7 @@ class SfgClassComposer:
tree=tree, tree=tree,
return_type=returns, return_type=returns,
inline=inline, inline=inline,
const=const const=const,
) )
return sequencer return sequencer
...@@ -447,7 +455,7 @@ class SfgClassComposer: ...@@ -447,7 +455,7 @@ class SfgClassComposer:
if isinstance(arg, SfgClassComposer.VisibilityContext): if isinstance(arg, SfgClassComposer.VisibilityContext):
for member in arg.resolve(cls): for member in arg.resolve(cls):
cls.add_member(member) cls.add_member(member)
elif isinstance(arg, (SfgClassComposer.PartialMember, SrcObject)): elif isinstance(arg, (SfgClassComposer.PartialMember, SrcObject, str)):
default_context(arg) default_context(arg)
else: else:
raise SfgException(f"{arg} is not a valid class member.") raise SfgException(f"{arg} is not a valid class member.")
......
...@@ -18,6 +18,7 @@ from ..source_components import ( ...@@ -18,6 +18,7 @@ from ..source_components import (
SfgKernelNamespace, SfgKernelNamespace,
SfgFunction, SfgFunction,
SfgClass, SfgClass,
SfgInClassDefinition,
SfgConstructor, SfgConstructor,
SfgMemberVariable, SfgMemberVariable,
SfgMethod, SfgMethod,
...@@ -34,7 +35,6 @@ def interleave(*iters): ...@@ -34,7 +35,6 @@ def interleave(*iters):
class SfgGeneralPrinter: class SfgGeneralPrinter:
@visitor @visitor
def visit(self, obj: object) -> str: def visit(self, obj: object) -> str:
raise SfgException(f"Can't print object of type {type(obj)}") raise SfgException(f"Can't print object of type {type(obj)}")
...@@ -56,7 +56,11 @@ class SfgGeneralPrinter: ...@@ -56,7 +56,11 @@ class SfgGeneralPrinter:
def prelude(self, ctx: SfgContext) -> str: def prelude(self, ctx: SfgContext) -> str:
if ctx.prelude_comment: if ctx.prelude_comment:
return "/*\n" + indent(ctx.prelude_comment, "* ", predicate=lambda _: True) + "*/\n" return (
"/*\n"
+ indent(ctx.prelude_comment, "* ", predicate=lambda _: True)
+ "*/\n"
)
else: else:
return "" return ""
...@@ -66,7 +70,6 @@ class SfgGeneralPrinter: ...@@ -66,7 +70,6 @@ class SfgGeneralPrinter:
class SfgHeaderPrinter(SfgGeneralPrinter): class SfgHeaderPrinter(SfgGeneralPrinter):
def __init__(self, ctx: SfgContext, output_spec: SfgOutputSpec): def __init__(self, ctx: SfgContext, output_spec: SfgOutputSpec):
self._output_spec = output_spec self._output_spec = output_spec
self._ctx = ctx self._ctx = ctx
...@@ -92,10 +95,7 @@ class SfgHeaderPrinter(SfgGeneralPrinter): ...@@ -92,10 +95,7 @@ class SfgHeaderPrinter(SfgGeneralPrinter):
if fq_namespace is not None: if fq_namespace is not None:
code += f"namespace {fq_namespace} {{\n\n" code += f"namespace {fq_namespace} {{\n\n"
parts = interleave( parts = interleave(ctx.declarations_ordered(), repeat(SfgEmptyLines(1)))
ctx.declarations_ordered(),
repeat(SfgEmptyLines(1))
)
code += "\n".join(self.visit(p) for p in parts) code += "\n".join(self.visit(p) for p in parts)
...@@ -131,6 +131,10 @@ class SfgHeaderPrinter(SfgGeneralPrinter): ...@@ -131,6 +131,10 @@ class SfgHeaderPrinter(SfgGeneralPrinter):
return code return code
@visit.case(SfgInClassDefinition)
def sfg_inclassdef(self, definition: SfgInClassDefinition):
return definition.text
@visit.case(SfgConstructor) @visit.case(SfgConstructor)
def sfg_constructor(self, constr: SfgConstructor): def sfg_constructor(self, constr: SfgConstructor):
code = f"{constr.owning_class.class_name} (" code = f"{constr.owning_class.class_name} ("
...@@ -153,7 +157,11 @@ class SfgHeaderPrinter(SfgGeneralPrinter): ...@@ -153,7 +157,11 @@ class SfgHeaderPrinter(SfgGeneralPrinter):
code = f"{method.return_type} {method.name} ({self.param_list(method)})" code = f"{method.return_type} {method.name} ({self.param_list(method)})"
code += "const" if method.const else "" code += "const" if method.const else ""
if method.inline: if method.inline:
code += " {\n" + self._ctx.codestyle.indent(method.tree.get_code(self._ctx)) + "}\n" code += (
" {\n"
+ self._ctx.codestyle.indent(method.tree.get_code(self._ctx))
+ "}\n"
)
else: else:
code += ";" code += ";"
return code return code
...@@ -201,9 +209,9 @@ class SfgImplPrinter(SfgGeneralPrinter): ...@@ -201,9 +209,9 @@ class SfgImplPrinter(SfgGeneralPrinter):
[delimiter("Functions")], [delimiter("Functions")],
ctx.functions(), ctx.functions(),
[delimiter("Class Methods")], [delimiter("Class Methods")],
ctx.classes() ctx.classes(),
), ),
repeat(SfgEmptyLines(1)) repeat(SfgEmptyLines(1)),
) )
code += "\n".join(self.visit(p) for p in parts) code += "\n".join(self.visit(p) for p in parts)
...@@ -227,7 +235,9 @@ class SfgImplPrinter(SfgGeneralPrinter): ...@@ -227,7 +235,9 @@ class SfgImplPrinter(SfgGeneralPrinter):
@visit.case(SfgFunction) @visit.case(SfgFunction)
def function(self, func: SfgFunction) -> str: def function(self, func: SfgFunction) -> str:
code = f"{func.return_type} {func.name} ({self.param_list(func)})" code = f"{func.return_type} {func.name} ({self.param_list(func)})"
code += "{\n" + self._ctx.codestyle.indent(func.tree.get_code(self._ctx)) + "}\n" code += (
"{\n" + self._ctx.codestyle.indent(func.tree.get_code(self._ctx)) + "}\n"
)
return code return code
@visit.case(SfgClass) @visit.case(SfgClass)
...@@ -240,5 +250,7 @@ class SfgImplPrinter(SfgGeneralPrinter): ...@@ -240,5 +250,7 @@ class SfgImplPrinter(SfgGeneralPrinter):
const_qual = "const" if method.const else "" const_qual = "const" if method.const else ""
code = f"{method.return_type} {method.owning_class.class_name}::{method.name}" code = f"{method.return_type} {method.owning_class.class_name}::{method.name}"
code += f"({self.param_list(method)}) {const_qual}" code += f"({self.param_list(method)}) {const_qual}"
code += " {\n" + self._ctx.codestyle.indent(method.tree.get_code(self._ctx)) + "}\n" code += (
" {\n" + self._ctx.codestyle.indent(method.tree.get_code(self._ctx)) + "}\n"
)
return code return code
...@@ -242,6 +242,19 @@ class SfgClassMember(ABC): ...@@ -242,6 +242,19 @@ class SfgClassMember(ABC):
return self._visibility return self._visibility
class SfgInClassDefinition(SfgClassMember):
def __init__(self, text: str, cls: SfgClass, visibility: SfgVisibility):
SfgClassMember.__init__(self, cls, visibility)
self._text = text
@property
def text(self) -> str:
return self._text
def __str__(self) -> str:
return self._text
class SfgMemberVariable(SrcObject, SfgClassMember): class SfgMemberVariable(SrcObject, SfgClassMember):
def __init__( def __init__(
self, self,
...@@ -321,6 +334,7 @@ class SfgClass: ...@@ -321,6 +334,7 @@ class SfgClass:
self._class_keyword = class_keyword self._class_keyword = class_keyword
self._bases_classes = tuple(bases) self._bases_classes = tuple(bases)
self._definitions: list[SfgInClassDefinition] = []
self._constructors: list[SfgConstructor] = [] self._constructors: list[SfgConstructor] = []
self._methods: dict[str, SfgMethod] = dict() self._methods: dict[str, SfgMethod] = dict()
self._member_vars: dict[str, SfgMemberVariable] = dict() self._member_vars: dict[str, SfgMemberVariable] = dict()
...@@ -344,6 +358,7 @@ class SfgClass: ...@@ -344,6 +358,7 @@ class SfgClass:
def members( def members(
self, visibility: SfgVisibility | None = None self, visibility: SfgVisibility | None = None
) -> Generator[SfgClassMember, None, None]: ) -> Generator[SfgClassMember, None, None]:
yield from self.definitions(visibility)
yield from self.member_variables(visibility) yield from self.member_variables(visibility)
yield from self.constructors(visibility) yield from self.constructors(visibility)
yield from self.methods(visibility) yield from self.methods(visibility)
...@@ -355,9 +370,22 @@ class SfgClass: ...@@ -355,9 +370,22 @@ class SfgClass:
self.add_member_variable(member) self.add_member_variable(member)
elif isinstance(member, SfgMethod): elif isinstance(member, SfgMethod):
self.add_method(member) self.add_method(member)
elif isinstance(member, SfgInClassDefinition):
self.add_definition(member)
else: else:
raise SfgException(f"{member} is not a valid class member.") raise SfgException(f"{member} is not a valid class member.")
def definitions(
self, visibility: SfgVisibility | None = None
) -> Generator[SfgInClassDefinition, None, None]:
if visibility is not None:
yield from filter(lambda m: m.visibility == visibility, self._definitions)
else:
yield from self._definitions
def add_definition(self, definition: SfgInClassDefinition):
self._definitions.append(definition)
def constructors( def constructors(
self, visibility: SfgVisibility | None = None self, visibility: SfgVisibility | None = None
) -> Generator[SfgConstructor, None, None]: ) -> Generator[SfgConstructor, None, None]:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment