// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Formatting of reflection types and values for debugging.
// Not defined as methods so they do not need to be linked into most binaries;
// the functions are not used by the library itself, only in tests.

package reflect_test

import (
	. "reflect";
	"strconv";
)

// valueToString returns a textual representation of the reflection value val.
// For debugging only.
func valueToString(val Value) string {
	var str string;
	if val == nil {
		return "<nil>";
	}
	typ := val.Type();
	switch val := val.(type) {
	case *IntValue:
		return strconv.Uitoa64(uint64(val.Get()));
	case *Int8Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Int16Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Int32Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Int64Value:
		return strconv.Itoa64(int64(val.Get()));
	case *UintValue:
		return strconv.Itoa64(int64(val.Get()));
	case *Uint8Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Uint16Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Uint32Value:
		return strconv.Itoa64(int64(val.Get()));
	case *Uint64Value:
		return strconv.Uitoa64(uint64(val.Get()));
	case *FloatValue:
		if strconv.FloatSize == 32 {
			return strconv.Ftoa32(float32(val.Get()), 'g', -1);
		} else {
			return strconv.Ftoa64(float64(val.Get()), 'g', -1);
		}
	case *Float32Value:
		return strconv.Ftoa32(val.Get(), 'g', -1);
	case *Float64Value:
		return strconv.Ftoa64(val.Get(), 'g', -1);
	case *StringValue:
		return val.Get();
	case *BoolValue:
		if val.Get() {
			return "true"
		} else {
			return "false"
		}
	case *PtrValue:
		v := val;
		str = typ.String() + "(";
		if v.IsNil() {
			str += "0";
		} else {
			str += "&" + valueToString(v.Elem());
		}
		str += ")";
		return str;
	case ArrayOrSliceValue:
		v := val;
		str += typ.String();
		str += "{";
		for i := 0; i < v.Len(); i++ {
			if i > 0 {
				str += ", "
			}
			str += valueToString(v.Elem(i));
		}
		str += "}";
		return str;
	case *MapValue:
		t := typ.(*MapType);
		str = t.String();
		str += "{";
		str += "<can't iterate on maps>";
		str += "}";
		return str;
	case *ChanValue:
		str = typ.String();
		return str;
	case *StructValue:
		t := typ.(*StructType);
		v := val;
		str += t.String();
		str += "{";
		for i, n := 0, v.NumField(); i < n; i++ {
			if i > 0 {
				str += ", "
			}
			str += valueToString(v.Field(i));
		}
		str += "}";
		return str;
	case *InterfaceValue:
		return typ.String() + "(" + valueToString(val.Elem()) + ")";
	case *FuncValue:
		v := val;
		return typ.String() + "(" + strconv.Itoa64(int64(v.Get())) + ")";
	default:
		panicln("valueToString: can't print type ", typ.String());
	}
	return "valueToString: can't happen";
}
