Added more tests

This commit is contained in:
Eduard Urbach 2024-06-21 10:17:26 +02:00
parent ff2a43e593
commit 2c6999040d
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
4 changed files with 29 additions and 3 deletions

View File

@ -25,6 +25,7 @@ func TestErrors(t *testing.T) {
{"MissingBlockStart.q", errors.MissingBlockStart},
{"MissingGroupEnd.q", errors.MissingGroupEnd},
{"MissingGroupStart.q", errors.MissingGroupStart},
{"VariableAlreadyExists.q", &errors.VariableAlreadyExists{Name: "a"}},
}
for _, test := range tests {

View File

@ -131,13 +131,21 @@ func (f *Function) CompileInstruction(line token.List) error {
return errors.New(errors.MissingAssignValue, f.File, expr.LastChild().Token.After())
}
name := expr.Children[0]
name := expr.Children[0].Token.Text()
_, exists := f.Variables[name]
if exists {
return errors.New(&errors.VariableAlreadyExists{Name: name}, f.File, expr.Children[0].Token.Position)
}
value := expr.Children[1]
// All expressions are returned to the memory pool.
// To avoid losing variable values, we will remove it from the expression.
expr.RemoveChild(value)
f.Variables[name.Token.Text()] = &Variable{
Name: name.Token.Text(),
f.Variables[name] = &Variable{
Name: name,
Value: value,
IsConst: true,
}

View File

@ -0,0 +1,13 @@
package errors
import "fmt"
// VariableAlreadyExists is used when existing variables are used for new variable declarations.
type VariableAlreadyExists struct {
Name string
}
// Error generates the string representation.
func (err *VariableAlreadyExists) Error() string {
return fmt.Sprintf("Variable '%s' already exists", err.Name)
}

View File

@ -0,0 +1,4 @@
main() {
a := 1
a := 2
}