Improved parameter handling
All checks were successful
/ test (push) Successful in 14s

This commit is contained in:
Eduard Urbach 2025-06-21 21:28:21 +02:00
parent 3717a61414
commit 320e023d74
Signed by: akyoto
GPG key ID: 49226B848C78F6C8
9 changed files with 45 additions and 21 deletions

View file

@ -1,5 +1,5 @@
import os import os
write(buffer []byte) -> int { write(buffer []byte) -> (written int) {
return os.write(0, buffer, len(buffer)) return os.write(0, buffer, len(buffer))
} }

View file

@ -1,3 +0,0 @@
write(fd int, buffer *byte, length int) -> int {
return syscall(1, fd, buffer, length)
}

3
lib/os/os_linux_x86.q Normal file
View file

@ -0,0 +1,3 @@
write(fd int, buffer *byte, length int) -> (written int) {
return syscall(1, fd, buffer, length)
}

View file

@ -12,9 +12,14 @@ func TestFunction(t *testing.T) {
b := build.New("../../examples/hello") b := build.New("../../examples/hello")
env, err := compiler.Compile(b) env, err := compiler.Compile(b)
assert.Nil(t, err) assert.Nil(t, err)
main, exists := env.Functions["main.main"] main, exists := env.Functions["main.main"]
assert.True(t, exists) assert.True(t, exists)
assert.False(t, main.IsExtern()) assert.False(t, main.IsExtern())
assert.Equal(t, main.UniqueName, "main.main") assert.Equal(t, main.UniqueName, "main.main")
assert.Equal(t, main.String(), main.UniqueName) assert.Equal(t, main.String(), main.UniqueName)
write, exists := env.Functions["io.write"]
assert.True(t, exists)
write.Output[0].Type()
} }

View file

@ -7,22 +7,12 @@ import (
// Parameter is an input or output parameter in a function. // Parameter is an input or output parameter in a function.
type Parameter struct { type Parameter struct {
name string Name string
typ types.Type TypeTokens token.List
tokens token.List typ types.Type
} }
// NewParameter creates a new parameter with the given list of tokens. // Type returns the data type of the parameter.
func NewParameter(tokens token.List) *Parameter {
return &Parameter{tokens: tokens}
}
// Name returns the name of the parameter.
func (p *Parameter) Name() string {
return p.name
}
// Type returns the type of the parameter.
func (p *Parameter) Type() types.Type { func (p *Parameter) Type() types.Type {
return p.typ return p.typ
} }

View file

@ -32,6 +32,8 @@ var errs = []struct {
{"MissingParameter.q", scanner.MissingParameter}, {"MissingParameter.q", scanner.MissingParameter},
{"MissingParameter2.q", scanner.MissingParameter}, {"MissingParameter2.q", scanner.MissingParameter},
{"MissingParameter3.q", scanner.MissingParameter}, {"MissingParameter3.q", scanner.MissingParameter},
{"MissingParameter4.q", scanner.MissingParameter},
{"MissingParameter5.q", scanner.MissingParameter},
{"MissingType.q", scanner.MissingType}, {"MissingType.q", scanner.MissingType},
} }

View file

@ -63,7 +63,7 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind
return nil, i, errors.New(InvalidFunctionDefinition, file, tokens[i].Position) return nil, i, errors.New(InvalidFunctionDefinition, file, tokens[i].Position)
} }
return nil, i, nil return nil, i, errors.New(InvalidFunctionDefinition, file, tokens[i].Position)
} }
if groupLevel > 0 { if groupLevel > 0 {
@ -98,7 +98,10 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind
return nil, i, errors.New(MissingType, file, param[0].End()) return nil, i, errors.New(MissingType, file, param[0].End())
} }
function.Input = append(function.Input, core.NewParameter(param)) function.Input = append(function.Input, &core.Parameter{
Name: param[0].String(file.Bytes),
TypeTokens: param[1:],
})
} }
if typeStart != -1 { if typeStart != -1 {
@ -109,8 +112,30 @@ func scanSignature(file *fs.File, tokens token.List, i int, delimiter token.Kind
outputTokens := tokens[typeStart:typeEnd] 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 { for param := range outputTokens.Split {
function.Output = append(function.Output, core.NewParameter(param)) 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
} }
} }

View file

@ -0,0 +1 @@
f() -> {}

View file

@ -0,0 +1 @@
f() -> (int,) {}