Expand Gotlin language and tooling

This commit is contained in:
pavel 2026-08-27 01:46:57 +02:00
commit de1262b4cf
41 changed files with 6059 additions and 379 deletions

View file

@ -42,13 +42,13 @@ func runBuild(args []string) {
if err := fs.Parse(normalizedArgs); err != nil {
fail(err)
}
if fs.NArg() != 1 {
if fs.NArg() < 1 {
fs.Usage()
os.Exit(2)
}
inputPath := fs.Arg(0)
goSrc := compileFile(inputPath, !*srcOnly)
goSrc := compileFiles(fs.Args(), !*srcOnly)
if *srcOnly {
if *outPath == "" {
@ -113,17 +113,42 @@ func runRun(args []string) {
}
func compileFile(inputPath string, forceMain bool) string {
src, err := os.ReadFile(inputPath)
if err != nil {
fail(err)
}
return compileFiles([]string{inputPath}, forceMain)
}
program, err := lang.Parse(string(src))
if err != nil {
fail(err)
}
func compileFiles(inputPaths []string, forceMain bool) string {
program := &lang.Program{}
var firstSource string
for _, inputPath := range inputPaths {
src, err := os.ReadFile(inputPath)
if err != nil {
fail(err)
}
parsed, err := lang.Parse(string(src))
if err != nil {
fail(err)
}
if program.PackagePath == "" {
program.PackagePath = parsed.PackagePath
}
if parsed.PackagePath != program.PackagePath {
fail(fmt.Errorf("Gotlin files must use the same package"))
}
program.Imports = append(program.Imports, parsed.Imports...)
program.Interfaces = append(program.Interfaces, parsed.Interfaces...)
program.Enums = append(program.Enums, parsed.Enums...)
program.Classes = append(program.Classes, parsed.Classes...)
program.Workers = append(program.Workers, parsed.Workers...)
program.Functions = append(program.Functions, parsed.Functions...)
program.Embeds = append(program.Embeds, parsed.Embeds...)
if firstSource == "" {
firstSource = string(src)
}
}
var goSrc []byte
var err error
if forceMain {
goSrc, err = lang.GenerateGoMain(program)
} else {
@ -133,7 +158,7 @@ func compileFile(inputPath string, forceMain bool) string {
fail(err)
}
if forceMain {
return addBestEffortLineDirectives(string(goSrc), inputPath, string(src))
return addBestEffortLineDirectives(string(goSrc), inputPaths[0], firstSource)
}
return string(goSrc)
}