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.
1234567891011121314151617181920212223242526272829303132333435363738394041package core
import ( "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/expression" "git.urbach.dev/cli/q/src/ssa" "git.urbach.dev/cli/q/src/token" "git.urbach.dev/cli/q/src/types")
// evaluateUnary converts a unary expression to an SSA value.func (f *Function) evaluateUnary(expr *expression.Expression) (ssa.Value, error) { if !expr.Token.Kind.IsUnaryOperator() { return nil, errors.NewAt(MissingOperand, f.File, expr.Token.End()) }
left := expr.Children[0] leftValue, err := f.evaluateRight(left)
if err != nil { return nil, err }
if expr.Token.Kind == token.Not && !types.Is(leftValue.Type(), types.Bool) { return nil, errors.New(&TypeMismatch{Encountered: leftValue.Type().Name(), Expected: types.Bool.Name()}, f.File, left.Source()) }
_, isStruct := leftValue.Type().(*types.Struct)
if isStruct { return nil, errors.New(InvalidStructOperation, f.File, expr.Token) }
v := f.Append(&ssa.UnaryOp{ Operand: leftValue, Op: expr.Token.Kind, Source: expr.Source(), })
return v, nil}