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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package core
import ( "slices"
"git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/ssa")
// evaluatePackageMember converts a pkg.something expression to an SSA value.func (f *Function) evaluatePackageMember(pkg *Package, rightText string, expr *expression.Expression) (ssa.Value, error) { variants, exists := pkg.Functions[rightText]
if exists { v := &ssa.Function{ FunctionRef: variants, Typ: variants.Type, Source: expr.Source(), }
return v, nil }
constant, exists := pkg.Constants[rightText]
if exists { if slices.Contains(f.constantStack, constant) { return nil, errors.New(&CycleDetected{A: f.constantStack[len(f.constantStack)-1].Name, B: constant.Name}, f.File, expr.Source()) }
f.constantStack = append(f.constantStack, constant) tmp := f.File f.File = constant.File v, err := f.evaluateRight(constant.Value) f.File = tmp f.constantStack = f.constantStack[:len(f.constantStack)-1] return v, err }
enum, exists := pkg.Enums[rightText]
if exists { value := &ssa.Enum{ Typ: enum, Source: expr.Source(), }
return value, nil }
global, exists := pkg.Globals[rightText]
if exists { f.Globals.Add(global)
v := f.Append(&ssa.Global{ Label: pkg.Name + "." + global.Name, Typ: f.Env.Pointer(global.Typ), ThreadLocal: global.ThreadLocal, Source: expr.Source(), })
return v, nil }
if pkg.Name != f.File.Package { rightText = pkg.Name + "." + rightText }
return nil, errors.New(&UnknownIdentifier{Name: rightText}, f.File, expr.Source())}