This commit is contained in:
parent
fe3212506d
commit
ed6ae1d306
4 changed files with 37 additions and 32 deletions
|
@ -4,30 +4,22 @@ import (
|
||||||
"maps"
|
"maps"
|
||||||
|
|
||||||
"git.urbach.dev/cli/q/src/build"
|
"git.urbach.dev/cli/q/src/build"
|
||||||
|
"git.urbach.dev/cli/q/src/core"
|
||||||
"git.urbach.dev/cli/q/src/scanner"
|
"git.urbach.dev/cli/q/src/scanner"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Compile waits for the scan to finish and compiles all functions.
|
// Compile waits for the scan to finish and compiles all functions.
|
||||||
func Compile(b *build.Build) (Result, error) {
|
func Compile(b *build.Build) (*core.Environment, error) {
|
||||||
result := Result{}
|
|
||||||
all, err := scanner.Scan(b)
|
all, err := scanner.Scan(b)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(all.Files) == 0 {
|
if len(all.Files) == 0 {
|
||||||
return result, NoInputFiles
|
return nil, NoInputFiles
|
||||||
}
|
|
||||||
|
|
||||||
for _, function := range all.Functions {
|
|
||||||
err := function.ResolveTypes()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
compileFunctions(maps.Values(all.Functions))
|
compileFunctions(maps.Values(all.Functions))
|
||||||
return result, nil
|
return all, nil
|
||||||
}
|
}
|
|
@ -9,18 +9,20 @@ import (
|
||||||
|
|
||||||
// Function is the smallest unit of code.
|
// Function is the smallest unit of code.
|
||||||
type Function struct {
|
type Function struct {
|
||||||
name string
|
Name string
|
||||||
file *fs.File
|
UniqueName string
|
||||||
Input []*Parameter
|
File *fs.File
|
||||||
Output []*Parameter
|
Input []*Parameter
|
||||||
Body token.List
|
Output []*Parameter
|
||||||
|
Body token.List
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFunction creates a new function.
|
// NewFunction creates a new function.
|
||||||
func NewFunction(name string, file *fs.File) *Function {
|
func NewFunction(name string, file *fs.File) *Function {
|
||||||
return &Function{
|
return &Function{
|
||||||
name: name,
|
Name: name,
|
||||||
file: file,
|
File: file,
|
||||||
|
UniqueName: fmt.Sprintf("%s.%s", file.Package, name),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,16 +31,7 @@ func (f *Function) IsExtern() bool {
|
||||||
return f.Body == nil
|
return f.Body == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResolveTypes parses the input and output types.
|
// String returns the unique name.
|
||||||
func (f *Function) ResolveTypes() error {
|
|
||||||
for _, param := range f.Input {
|
|
||||||
param.name = param.tokens[0].String(f.file.Bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the package and function name.
|
|
||||||
func (f *Function) String() string {
|
func (f *Function) String() string {
|
||||||
return fmt.Sprintf("%s.%s", f.file.Package, f.name)
|
return f.UniqueName
|
||||||
}
|
}
|
20
src/core/Function_test.go
Normal file
20
src/core/Function_test.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package core_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.urbach.dev/cli/q/src/build"
|
||||||
|
"git.urbach.dev/cli/q/src/compiler"
|
||||||
|
"git.urbach.dev/go/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFunction(t *testing.T) {
|
||||||
|
b := build.New("../../examples/hello")
|
||||||
|
env, err := compiler.Compile(b)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
main, exists := env.Functions["main.main"]
|
||||||
|
assert.True(t, exists)
|
||||||
|
assert.False(t, main.IsExtern())
|
||||||
|
assert.Equal(t, main.UniqueName, "main.main")
|
||||||
|
assert.Equal(t, main.String(), main.UniqueName)
|
||||||
|
}
|
|
@ -36,7 +36,7 @@ func Scan(b *build.Build) (*core.Environment, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
all.Functions[f.String()] = f
|
all.Functions[f.UniqueName] = f
|
||||||
|
|
||||||
case file, ok := <-s.files:
|
case file, ok := <-s.files:
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue