This commit is contained in:
parent
3717a61414
commit
320e023d74
9 changed files with 45 additions and 21 deletions
|
@ -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))
|
||||||
}
|
}
|
|
@ -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
3
lib/os/os_linux_x86.q
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
write(fd int, buffer *byte, length int) -> (written int) {
|
||||||
|
return syscall(1, fd, buffer, length)
|
||||||
|
}
|
|
@ -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()
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
src/scanner/testdata/errors/MissingParameter4.q
vendored
Normal file
1
src/scanner/testdata/errors/MissingParameter4.q
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
f() -> {}
|
1
src/scanner/testdata/errors/MissingParameter5.q
vendored
Normal file
1
src/scanner/testdata/errors/MissingParameter5.q
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
f() -> (int,) {}
|
Loading…
Add table
Add a link
Reference in a new issue