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.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657package core
import ( "slices"
"git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/ssa")
// evaluateIdentifier converts an identifier to an SSA value.func (f *Function) evaluateIdentifier(expr *expression.Expression) (ssa.Value, error) { name := expr.Token.StringFrom(f.File.Bytes)
switch name { case "false": v := f.Append(&ssa.Bool{ Bool: false, Source: expr.Source(), })
return v, nil case "true": v := f.Append(&ssa.Bool{ Bool: true, Source: expr.Source(), })
return v, nil }
value, exists, partial := f.findIdentifier(name)
if exists { if partial { return nil, errors.New(&PartiallyUnknownIdentifier{Name: name}, f.File, expr.Source()) }
for _, p := range f.Block().Protected { if slices.Contains(p, value) { return nil, errors.New(&ErrorNotChecked{Identifier: name}, f.File, expr.Source()) } }
return value, nil }
if name != f.File.Package { _, exists := f.Env.Packages[name]
if exists { return &ssa.Package{Name: name}, nil } }
return f.evaluatePackageMember(f.Env.Packages[f.File.Package], name, expr)}