@@ -396,6 +396,46 @@ func (t *transpiler) evaluateFor(forStatement parser.For) error {
396396 return conv .ForEnd ()
397397}
398398
399+ func (t * transpiler ) evaluateExpressionAssignment (assignedExpression parser.Expression ) (expressionResult , error ) {
400+ result , err := t .evaluateExpression (assignedExpression , true )
401+ value := result .firstValue ()
402+
403+ if err != nil {
404+ return expressionResult {}, err
405+ }
406+
407+ switch evaluationType := assignedExpression .ValueType ().Type ().(type ) {
408+ case parser.StructDefinition :
409+ newStruct , err := t .converter .StructInitialization ([]StructValue {}, true )
410+
411+ if err != nil {
412+ return expressionResult {}, err
413+ }
414+
415+ // If expression is a struct, the values need to be copied to avoid manipulation of the original.
416+ for _ , field := range evaluationType .Fields () {
417+ fieldName := field .Name ()
418+ fieldValue , err := t .converter .StructEvaluation (value , fieldName , true )
419+
420+ if err != nil {
421+ return expressionResult {}, nil
422+ }
423+ err = t .converter .StructAssignment (newStruct , fieldName , fieldValue , false )
424+
425+ if err != nil {
426+ return expressionResult {}, err
427+ }
428+ }
429+ evaluatedValue , err := t .converter .VarEvaluation (newStruct , true , false )
430+
431+ if err != nil {
432+ return expressionResult {}, err
433+ }
434+ value = evaluatedValue
435+ }
436+ return newExpressionResult (value ), nil
437+ }
438+
399439func (t * transpiler ) evaluateNamedValuesDefinition (definition parser.NamedValuesDefinition ) error {
400440 for _ , assignment := range definition .Assignments () {
401441 err := t .evaluate (assignment )
@@ -419,7 +459,7 @@ func (t *transpiler) evaluateConstDefinition(definition parser.ConstDefinition)
419459
420460func (t * transpiler ) evaluateVarDefinition (definition parser.VariableDefinitionValueAssignment ) error {
421461 for i , variable := range definition .Variables () {
422- result , err := t .evaluateExpression (definition .Values ()[i ], true )
462+ result , err := t .evaluateExpressionAssignment (definition .Values ()[i ])
423463
424464 if err != nil {
425465 return err
@@ -434,7 +474,7 @@ func (t *transpiler) evaluateVarDefinition(definition parser.VariableDefinitionV
434474}
435475
436476func (t * transpiler ) evaluateVarDefinitionCallAssignment (definition parser.VariableDefinitionCallAssignment ) error {
437- result , err := t .evaluateExpression (definition .Call (), true )
477+ result , err := t .evaluateExpression (definition .Call (), true ) // TODO: Handle issue https://github.com/monstermichl/TypeShell/issues/54 here as well?
438478
439479 if err != nil {
440480 return err
@@ -460,7 +500,7 @@ func (t *transpiler) evaluateVarDefinitionCallAssignment(definition parser.Varia
460500
461501func (t * transpiler ) evaluateVarAssignment (assignment parser.VariableAssignmentValueAssignment ) error {
462502 for i , variable := range assignment .Variables () {
463- result , err := t .evaluateExpression (assignment .Values ()[i ], true )
503+ result , err := t .evaluateExpressionAssignment (assignment .Values ()[i ])
464504
465505 if err != nil {
466506 return err
@@ -475,7 +515,7 @@ func (t *transpiler) evaluateVarAssignment(assignment parser.VariableAssignmentV
475515}
476516
477517func (t * transpiler ) evaluateVarAssignmentCallAssignment (assignment parser.VariableAssignmentCallAssignment ) error {
478- result , err := t .evaluateExpression (assignment .Call (), true )
518+ result , err := t .evaluateExpression (assignment .Call (), true ) // TODO: Handle issue https://github.com/monstermichl/TypeShell/issues/54 here as well?
479519
480520 if err != nil {
481521 return err
@@ -506,7 +546,7 @@ func (t *transpiler) evaluateSliceAssignment(assignment parser.SliceAssignment)
506546 return err
507547 }
508548 value := assignment .Value ()
509- valueResult , err := t .evaluateExpression (value , true )
549+ result , err := t .evaluateExpressionAssignment (value )
510550
511551 if err != nil {
512552 return err
@@ -517,12 +557,12 @@ func (t *transpiler) evaluateSliceAssignment(assignment parser.SliceAssignment)
517557 if err != nil {
518558 return err
519559 }
520- return t .converter .SliceAssignment (assignment .LayerName (), indexResult .firstValue (), valueResult .firstValue (), defaultValue , assignment .Global ())
560+ return t .converter .SliceAssignment (assignment .LayerName (), indexResult .firstValue (), result .firstValue (), defaultValue , assignment .Global ())
521561}
522562
523563func (t * transpiler ) evaluateStructAssignment (assignment parser.StructAssignment ) error {
524564 value := assignment .Value ()
525- valueResult , err := t .evaluateExpression (value .Value (), true )
565+ valueResult , err := t .evaluateExpressionAssignment (value .Value ())
526566
527567 if err != nil {
528568 return err
@@ -667,47 +707,12 @@ func (t *transpiler) evaluateFunctionDefinition(functionDefinition parser.Functi
667707 return conv .FuncEnd ()
668708}
669709
670- func (t * transpiler ) evaluateExpressionAssignment (assigneeName string , assignedExpression parser.Expression ) (expressionResult , error ) {
671- result , err := t .evaluateExpression (assignedExpression , true )
672- value := result .firstValue ()
673-
674- if err != nil {
675- return expressionResult {}, err
676- }
677-
678- switch evaluationType := assignedExpression .ValueType ().Type ().(type ) {
679- case parser.StructDefinition :
680- // If expression is a struct, the values need to be copied to avoid manipulation of the original.
681- for _ , field := range evaluationType .Fields () {
682- fieldName := field .Name ()
683- fieldValue , err := t .converter .StructEvaluation (value , fieldName , true )
684-
685- if err != nil {
686- return expressionResult {}, nil
687- }
688- err = t .converter .StructAssignment (assigneeName , fieldName , fieldValue , false )
689-
690- if err != nil {
691- return expressionResult {}, err
692- }
693- }
694- evaluatedValue , err := t .converter .VarEvaluation (assigneeName , true , false )
695-
696- if err != nil {
697- return expressionResult {}, err
698- }
699- value = evaluatedValue
700- }
701- return newExpressionResult (value ), nil
702- }
703-
704710func (t * transpiler ) evaluateFunctionCall (functionCall parser.FunctionCall , valueUsed bool ) (expressionResult , error ) {
705711 name := functionCall .Name ()
706- params := functionCall .Params ()
707712 args := []string {}
708713
709- for i , arg := range functionCall .Args () {
710- result , err := t .evaluateExpressionAssignment (params [ i ]. LayerName (), arg )
714+ for _ , arg := range functionCall .Args () {
715+ result , err := t .evaluateExpressionAssignment (arg )
711716
712717 if err != nil {
713718 return expressionResult {}, err
@@ -763,7 +768,7 @@ func (t *transpiler) evaluateSliceInstantiation(instantiation parser.SliceInstan
763768 values := []string {}
764769
765770 for _ , expr := range instantiation .Values () {
766- result , err := t .evaluateExpression (expr , true )
771+ result , err := t .evaluateExpressionAssignment (expr )
767772
768773 if err != nil {
769774 return expressionResult {}, err
@@ -782,7 +787,7 @@ func (t *transpiler) evaluateStructInitialization(definition parser.StructInitia
782787 values := []StructValue {}
783788
784789 for _ , value := range definition .Values () {
785- result , err := t .evaluateExpression (value .Value (), true )
790+ result , err := t .evaluateExpressionAssignment (value .Value ())
786791
787792 if err != nil {
788793 return expressionResult {}, err
0 commit comments