Skip to content

Commit 302a391

Browse files
committed
Fix structs get assigned by reference (#54)
1 parent a8f5027 commit 302a391

2 files changed

Lines changed: 54 additions & 49 deletions

File tree

converters/batch/converter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,11 @@ func (c *converter) ProgramEnd() error {
221221
}
222222

223223
if c.structAssignmentHelperRequired {
224-
// %1: Slice name
224+
// %1: Struct name
225225
// %2: Assigned field
226226
// arg0: Assigned value
227227
c.addHelper("struct assignment", structAssignmentHelper,
228-
c.sliceAssignmentString("!%1!", "%2", fmt.Sprintf("!%s!", funcArgVar(0)), false),
228+
c.structAssignmentString("%1", "%2", fmt.Sprintf("!%s!", funcArgVar(0)), false),
229229
)
230230
}
231231

@@ -286,7 +286,7 @@ func (c *converter) SliceAssignment(name string, index string, value string, def
286286

287287
func (c *converter) StructAssignment(name string, field string, value string, global bool) error {
288288
c.structAssignmentHelperRequired = true
289-
c.callFunc(structAssignmentHelper, []string{value}, c.varName(name, global), field)
289+
c.callFunc(structAssignmentHelper, []string{value}, c.varEvaluationString(name, global), field)
290290
return nil
291291
}
292292

transpiler/transpiler.go

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
399439
func (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

420460
func (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

436476
func (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

461501
func (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

477517
func (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

523563
func (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-
704710
func (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

Comments
 (0)