From 918896467dc09beebfb64dbcb5e569146391efd5 Mon Sep 17 00:00:00 2001
From: Frederik Hennig <frederik.hennig@fau.de>
Date: Wed, 16 Oct 2024 22:44:22 +0200
Subject: [PATCH] bugfixes + more AugExpr in interfaces

---
 src/pystencilssfg/composer/basic_composer.py |  5 ++++-
 src/pystencilssfg/ir/source_components.py    |  2 +-
 src/pystencilssfg/lang/expressions.py        | 22 +++++++++++++++++++-
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/pystencilssfg/composer/basic_composer.py b/src/pystencilssfg/composer/basic_composer.py
index 5993802..9796624 100644
--- a/src/pystencilssfg/composer/basic_composer.py
+++ b/src/pystencilssfg/composer/basic_composer.py
@@ -407,7 +407,10 @@ def make_sequence(*args: SequencerArg) -> SfgSequence:
 
 
 class SfgInplaceInitBuilder(SfgNodeBuilder):
-    def __init__(self, lhs: SfgVar) -> None:
+    def __init__(self, lhs: SfgVar | AugExpr) -> None:
+        if isinstance(lhs, AugExpr):
+            lhs = lhs.as_variable()
+
         self._lhs: SfgVar = lhs
         self._depends: set[SfgVar] = set()
         self._rhs: str | None = None
diff --git a/src/pystencilssfg/ir/source_components.py b/src/pystencilssfg/ir/source_components.py
index 06788cf..351c989 100644
--- a/src/pystencilssfg/ir/source_components.py
+++ b/src/pystencilssfg/ir/source_components.py
@@ -197,7 +197,7 @@ class SfgKernelHandle:
 
     @property
     def fields(self):
-        return self.fields
+        return self._fields
 
     def get_kernel_function(self) -> KernelFunction:
         return self._namespace.get_kernel_function(self)
diff --git a/src/pystencilssfg/lang/expressions.py b/src/pystencilssfg/lang/expressions.py
index c456194..579646f 100644
--- a/src/pystencilssfg/lang/expressions.py
+++ b/src/pystencilssfg/lang/expressions.py
@@ -48,16 +48,27 @@ class DependentExpression:
 
     def __add__(self, other: DependentExpression):
         return DependentExpression(self.expr + other.expr, self.depends | other.depends)
+    
+
+class VarExpr(DependentExpression):
+    def __init__(self, var: SfgVar):
+        self._var = var
+        super().__init__(var.name, (var,))
+
+    @property
+    def variable(self) -> SfgVar:
+        return self._var
 
 
 class AugExpr:
     def __init__(self, dtype: PsType | None = None):
         self._dtype = dtype
         self._bound: DependentExpression | None = None
+        self._is_variable = False
 
     def var(self, name: str):
         v = SfgVar(name, self.get_dtype(), self.required_includes)
-        expr = DependentExpression(name, (v,))
+        expr = VarExpr(v)
         return self._bind(expr)
 
     @staticmethod
@@ -98,6 +109,15 @@ class AugExpr:
             raise SfgException("This AugExpr has no known data type.")
 
         return self._dtype
+    
+    @property
+    def is_variable(self) -> bool:
+        return isinstance(self._bound, VarExpr)
+    
+    def as_variable(self) -> SfgVar:
+        if not isinstance(self._bound, VarExpr):
+            raise SfgException("This expression is not a variable")
+        return self._bound.variable
 
     @property
     def required_includes(self) -> set[SfgHeaderInclude]:
-- 
GitLab