func prep(expr *ast.Expr, expType types.Type) (uniq string, err error) { if expr.Function != nil { fnc := expr.GetFunction() uniq, err = WhichFunc(fnc) if err != nil { return "", err } typ, err := funcs.Out(uniq) if err != nil { return "", err } if typ != expType { return "", &errExpected{expType.String(), expr.String()} } return uniq, err } if expr.List != nil { if !types.IsList(expType) { return "", &errExpected{expType.String(), expr.String()} } } typ, err := Which(expr) if err != nil { return "", err } if typ != expType { return "", &errExpected{expType.String(), expr.String()} } return "", nil }
//Which returns the type that the expression will return. func Which(expr *ast.Expr) (types.Type, error) { if expr.Terminal != nil { term := expr.GetTerminal() if term.DoubleValue != nil { return types.SINGLE_DOUBLE, nil } if term.IntValue != nil { return types.SINGLE_INT, nil } if term.UintValue != nil { return types.SINGLE_UINT, nil } if term.BoolValue != nil { return types.SINGLE_BOOL, nil } if term.StringValue != nil { return types.SINGLE_STRING, nil } if term.BytesValue != nil { return types.SINGLE_BYTES, nil } if term.Variable != nil { return term.Variable.Type, nil } } if expr.List != nil { return expr.GetList().GetType(), nil } if expr.Function != nil { fnc := expr.GetFunction() uniq, err := WhichFunc(fnc) if err != nil { return 0, err } return funcs.Out(uniq) } return 0, &errUnknownType{expr} }