Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556package resolver
import ( "git.urbach.dev/cli/q/src/core" "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/fs" "git.urbach.dev/cli/q/src/types")
// parseStruct parses the field tokens of a single struct.func parseStruct(env *core.Environment, structure *types.Struct, processed map[*types.Struct]recursionState) error { if processed[structure] == finished { return nil }
processed[structure] = started offset := 0 file, isFile := structure.File.(*fs.File)
if !isFile { processed[structure] = finished return nil }
for i, field := range structure.Fields { typ, err := env.TypeFromTokens(field.Tokens[1:], file)
if err != nil { return err }
dependency, isStruct := typ.(*types.Struct)
if isStruct { switch processed[dependency] { case notStarted: err := parseStruct(env, dependency, processed)
if err != nil { return err } case started: return errors.New(&core.CycleDetected{A: structure.Name(), B: dependency.Name()}, file, field.Tokens[1:]) case finished: } }
field.Type = typ field.Index = uint64(i) field.Offset = uint64(offset) offset += field.Type.Size() }
processed[structure] = finished return nil}