From ca91cd693c5527cba63f739bb9db69cf1a4807e8 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sun, 22 Jun 2025 14:35:49 +0200 Subject: [PATCH] Improved scanner test coverage --- src/scanner/errors_test.go | 3 + src/scanner/scanFunction.go | 6 +- src/scanner/scanSignature.go | 89 ++++++++++--------- .../errors/ExpectedFunctionDefinition.q | 2 +- .../errors/ExpectedFunctionDefinition2.q | 1 + .../testdata/errors/InvalidCharacter2.q | 2 +- .../testdata/errors/InvalidCharacter4.q | 2 +- .../testdata/errors/InvalidCondition.q | 2 +- .../testdata/errors/InvalidExpression.q | 2 +- .../errors/InvalidFunctionDefinition.q | 2 +- .../errors/InvalidFunctionDefinition2.q | 1 + src/scanner/testdata/errors/MissingBlockEnd.q | 2 +- .../testdata/errors/MissingBlockEnd2.q | 2 +- .../testdata/errors/MissingBlockStart.q | 2 +- src/scanner/testdata/errors/MissingGroupEnd.q | 2 +- .../testdata/errors/MissingGroupEnd2.q | 1 + .../testdata/errors/MissingGroupStart.q | 2 +- .../testdata/errors/MissingParameter.q | 2 +- 18 files changed, 64 insertions(+), 61 deletions(-) create mode 100644 src/scanner/testdata/errors/ExpectedFunctionDefinition2.q create mode 100644 src/scanner/testdata/errors/InvalidFunctionDefinition2.q create mode 100644 src/scanner/testdata/errors/MissingGroupEnd2.q diff --git a/src/scanner/errors_test.go b/src/scanner/errors_test.go index 464fd3c..cafe23d 100644 --- a/src/scanner/errors_test.go +++ b/src/scanner/errors_test.go @@ -15,12 +15,14 @@ var errs = []struct { ExpectedError error }{ {"ExpectedFunctionDefinition.q", scanner.ExpectedFunctionDefinition}, + {"ExpectedFunctionDefinition2.q", scanner.ExpectedFunctionDefinition}, {"ExpectedPackageName.q", scanner.ExpectedPackageName}, {"InvalidCharacter.q", &scanner.InvalidCharacter{Character: "@"}}, {"InvalidCharacter2.q", &scanner.InvalidCharacter{Character: "@"}}, {"InvalidCharacter3.q", &scanner.InvalidCharacter{Character: "@"}}, {"InvalidCharacter4.q", &scanner.InvalidCharacter{Character: "+++"}}, {"InvalidFunctionDefinition.q", scanner.InvalidFunctionDefinition}, + {"InvalidFunctionDefinition2.q", scanner.InvalidFunctionDefinition}, {"InvalidTopLevel.q", &scanner.InvalidTopLevel{Instruction: "123"}}, {"InvalidTopLevel2.q", &scanner.InvalidTopLevel{Instruction: "\"Hello\""}}, {"InvalidTopLevel3.q", &scanner.InvalidTopLevel{Instruction: "+"}}, @@ -28,6 +30,7 @@ var errs = []struct { {"MissingBlockEnd2.q", scanner.MissingBlockEnd}, {"MissingBlockStart.q", scanner.MissingBlockStart}, {"MissingGroupEnd.q", scanner.MissingGroupEnd}, + {"MissingGroupEnd2.q", scanner.MissingGroupEnd}, {"MissingGroupStart.q", scanner.MissingGroupStart}, {"MissingParameter.q", scanner.MissingParameter}, {"MissingParameter2.q", scanner.MissingParameter}, diff --git a/src/scanner/scanFunction.go b/src/scanner/scanFunction.go index 6f3c822..0b58898 100644 --- a/src/scanner/scanFunction.go +++ b/src/scanner/scanFunction.go @@ -56,11 +56,7 @@ func (s *scanner) scanFunction(file *fs.File, tokens token.List, i int) (int, er return i, errors.New(MissingBlockEnd, file, tokens[i].Position) } - if bodyStart == -1 { - return i, errors.New(ExpectedFunctionDefinition, file, tokens[i].Position) - } - - return i, nil + return i, errors.New(ExpectedFunctionDefinition, file, tokens[i].Position) } if blockLevel > 0 { diff --git a/src/scanner/scanSignature.go b/src/scanner/scanSignature.go index 497e820..0719641 100644 --- a/src/scanner/scanSignature.go +++ b/src/scanner/scanSignature.go @@ -12,10 +12,10 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind var ( groupLevel = 0 nameStart = i - paramsStart = -1 - paramsEnd = -1 - typeStart = -1 - typeEnd = -1 + inputStart = -1 + inputEnd = -1 + outputStart = -1 + outputEnd = -1 ) i++ @@ -27,7 +27,7 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind i++ if groupLevel == 1 { - paramsStart = i + inputStart = i } continue @@ -41,7 +41,7 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind } if groupLevel == 0 { - paramsEnd = i + inputEnd = i i++ break } @@ -59,10 +59,6 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind return nil, i, errors.New(MissingGroupEnd, file, tokens[i].Position) } - if paramsStart == -1 { - return nil, i, errors.New(InvalidFunctionDefinition, file, tokens[i].Position) - } - return nil, i, errors.New(InvalidFunctionDefinition, file, tokens[i].Position) } @@ -76,18 +72,18 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind // Return type if i < len(tokens) && tokens[i].Kind == token.ReturnType { - typeStart = i + 1 + outputStart = i + 1 for i < len(tokens) && tokens[i].Kind != delimiter { i++ } - typeEnd = i + outputEnd = i } name := tokens[nameStart].String(file.Bytes) function := core.NewFunction(name, file) - parameters := tokens[paramsStart:paramsEnd] + parameters := tokens[inputStart:inputEnd] for param := range parameters.Split { if len(param) == 0 { @@ -104,40 +100,45 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind }) } - if typeStart != -1 { - if tokens[typeStart].Kind == token.GroupStart && tokens[typeEnd-1].Kind == token.GroupEnd { - typeStart++ - typeEnd-- - } + if outputStart == -1 { + return function, i, nil + } - outputTokens := tokens[typeStart:typeEnd] - - if len(outputTokens) == 0 { - return nil, i, errors.New(MissingParameter, file, tokens[typeStart].Position) - } - - errorPos := token.Position(typeStart) - - for param := range outputTokens.Split { - if len(param) == 0 { - return nil, i, errors.New(MissingParameter, file, errorPos) - } - - if len(param) == 1 { - function.Output = append(function.Output, &core.Parameter{ - Name: "", - TypeTokens: param, - }) - } else { - function.Output = append(function.Output, &core.Parameter{ - Name: param[0].String(file.Bytes), - TypeTokens: param[1:], - }) - } - - errorPos = param[len(param)-1].End() + 1 + if tokens[outputStart].Kind == token.GroupStart { + if tokens[outputEnd-1].Kind == token.GroupEnd { + outputStart++ + outputEnd-- + } else { + return nil, i, errors.New(MissingGroupEnd, file, tokens[outputEnd-1].Position) } } + outputTokens := tokens[outputStart:outputEnd] + + if len(outputTokens) == 0 { + return nil, i, errors.New(MissingParameter, file, tokens[outputStart].Position) + } + + errorPos := token.Position(outputStart) + + for param := range outputTokens.Split { + if len(param) == 0 { + return nil, i, errors.New(MissingParameter, file, errorPos) + } + + if len(param) == 1 { + function.Output = append(function.Output, &core.Parameter{ + Name: "", + TypeTokens: param, + }) + } else { + function.Output = append(function.Output, &core.Parameter{ + Name: param[0].String(file.Bytes), + TypeTokens: param[1:], + }) + } + + errorPos = param[len(param)-1].End() + 1 + } return function, i, nil } \ No newline at end of file diff --git a/src/scanner/testdata/errors/ExpectedFunctionDefinition.q b/src/scanner/testdata/errors/ExpectedFunctionDefinition.q index ac72fa7..300ddfa 100644 --- a/src/scanner/testdata/errors/ExpectedFunctionDefinition.q +++ b/src/scanner/testdata/errors/ExpectedFunctionDefinition.q @@ -1 +1 @@ -main() \ No newline at end of file +f() \ No newline at end of file diff --git a/src/scanner/testdata/errors/ExpectedFunctionDefinition2.q b/src/scanner/testdata/errors/ExpectedFunctionDefinition2.q new file mode 100644 index 0000000..2786be1 --- /dev/null +++ b/src/scanner/testdata/errors/ExpectedFunctionDefinition2.q @@ -0,0 +1 @@ +f() 123 \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidCharacter2.q b/src/scanner/testdata/errors/InvalidCharacter2.q index f870343..b37c5ae 100644 --- a/src/scanner/testdata/errors/InvalidCharacter2.q +++ b/src/scanner/testdata/errors/InvalidCharacter2.q @@ -1 +1 @@ -main@ \ No newline at end of file +f@ \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidCharacter4.q b/src/scanner/testdata/errors/InvalidCharacter4.q index a97c489..2e99905 100644 --- a/src/scanner/testdata/errors/InvalidCharacter4.q +++ b/src/scanner/testdata/errors/InvalidCharacter4.q @@ -1,4 +1,4 @@ -main() { +f() { x := 123 +++ 456 syscall(60, x) } \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidCondition.q b/src/scanner/testdata/errors/InvalidCondition.q index 8d76be8..02269cf 100644 --- a/src/scanner/testdata/errors/InvalidCondition.q +++ b/src/scanner/testdata/errors/InvalidCondition.q @@ -1,3 +1,3 @@ -main() { +f() { if 42 {} } \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidExpression.q b/src/scanner/testdata/errors/InvalidExpression.q index 77e99f8..02bde05 100644 --- a/src/scanner/testdata/errors/InvalidExpression.q +++ b/src/scanner/testdata/errors/InvalidExpression.q @@ -1,3 +1,3 @@ -main() { +f() { syscall(+, -, *, /) } \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidFunctionDefinition.q b/src/scanner/testdata/errors/InvalidFunctionDefinition.q index 88d050b..4d1ae35 100644 --- a/src/scanner/testdata/errors/InvalidFunctionDefinition.q +++ b/src/scanner/testdata/errors/InvalidFunctionDefinition.q @@ -1 +1 @@ -main \ No newline at end of file +f \ No newline at end of file diff --git a/src/scanner/testdata/errors/InvalidFunctionDefinition2.q b/src/scanner/testdata/errors/InvalidFunctionDefinition2.q new file mode 100644 index 0000000..7195118 --- /dev/null +++ b/src/scanner/testdata/errors/InvalidFunctionDefinition2.q @@ -0,0 +1 @@ +f 123 \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingBlockEnd.q b/src/scanner/testdata/errors/MissingBlockEnd.q index 48a9f79..1718945 100644 --- a/src/scanner/testdata/errors/MissingBlockEnd.q +++ b/src/scanner/testdata/errors/MissingBlockEnd.q @@ -1 +1 @@ -main(){ \ No newline at end of file +f(){ \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingBlockEnd2.q b/src/scanner/testdata/errors/MissingBlockEnd2.q index 5562918..d32f54a 100644 --- a/src/scanner/testdata/errors/MissingBlockEnd2.q +++ b/src/scanner/testdata/errors/MissingBlockEnd2.q @@ -1,3 +1,3 @@ -main() { +f() { loop { } \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingBlockStart.q b/src/scanner/testdata/errors/MissingBlockStart.q index 006988a..7c0aeb4 100644 --- a/src/scanner/testdata/errors/MissingBlockStart.q +++ b/src/scanner/testdata/errors/MissingBlockStart.q @@ -1 +1 @@ -main()} \ No newline at end of file +f()} \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingGroupEnd.q b/src/scanner/testdata/errors/MissingGroupEnd.q index 189300d..edcd5fa 100644 --- a/src/scanner/testdata/errors/MissingGroupEnd.q +++ b/src/scanner/testdata/errors/MissingGroupEnd.q @@ -1 +1 @@ -main( \ No newline at end of file +f( \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingGroupEnd2.q b/src/scanner/testdata/errors/MissingGroupEnd2.q new file mode 100644 index 0000000..326f5d8 --- /dev/null +++ b/src/scanner/testdata/errors/MissingGroupEnd2.q @@ -0,0 +1 @@ +f() -> ( \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingGroupStart.q b/src/scanner/testdata/errors/MissingGroupStart.q index 83e9712..a812d5d 100644 --- a/src/scanner/testdata/errors/MissingGroupStart.q +++ b/src/scanner/testdata/errors/MissingGroupStart.q @@ -1 +1 @@ -main) \ No newline at end of file +f) \ No newline at end of file diff --git a/src/scanner/testdata/errors/MissingParameter.q b/src/scanner/testdata/errors/MissingParameter.q index a3247e3..9ac195d 100644 --- a/src/scanner/testdata/errors/MissingParameter.q +++ b/src/scanner/testdata/errors/MissingParameter.q @@ -1 +1 @@ -f(,) {} \ No newline at end of file +f(a (int)->(int),) {} \ No newline at end of file