Commit 12805c73 authored by Jeffrey Wilcke's avatar Jeffrey Wilcke

Merge pull request #1667 from fjl/pretty-printer-improvements

jsre: pretty printer improvements
parents f6367548 1086e2f2
...@@ -66,6 +66,7 @@ func New(assetPath string) *JSRE { ...@@ -66,6 +66,7 @@ func New(assetPath string) *JSRE {
re.loopWg.Add(1) re.loopWg.Add(1)
go re.runEventLoop() go re.runEventLoop()
re.Set("loadScript", re.loadScript) re.Set("loadScript", re.loadScript)
re.Set("inspect", prettyPrintJS)
return re return re
} }
......
...@@ -51,7 +51,15 @@ var boringKeys = map[string]bool{ ...@@ -51,7 +51,15 @@ var boringKeys = map[string]bool{
// prettyPrint writes value to standard output. // prettyPrint writes value to standard output.
func prettyPrint(vm *otto.Otto, value otto.Value) { func prettyPrint(vm *otto.Otto, value otto.Value) {
ppctx{vm}.printValue(value, 0) ppctx{vm}.printValue(value, 0, false)
}
func prettyPrintJS(call otto.FunctionCall) otto.Value {
for _, v := range call.ArgumentList {
prettyPrint(call.Otto, v)
fmt.Println()
}
return otto.UndefinedValue()
} }
type ppctx struct{ vm *otto.Otto } type ppctx struct{ vm *otto.Otto }
...@@ -60,10 +68,10 @@ func (ctx ppctx) indent(level int) string { ...@@ -60,10 +68,10 @@ func (ctx ppctx) indent(level int) string {
return strings.Repeat(indentString, level) return strings.Repeat(indentString, level)
} }
func (ctx ppctx) printValue(v otto.Value, level int) { func (ctx ppctx) printValue(v otto.Value, level int, inArray bool) {
switch { switch {
case v.IsObject(): case v.IsObject():
ctx.printObject(v.Object(), level) ctx.printObject(v.Object(), level, inArray)
case v.IsNull(): case v.IsNull():
specialColor.Print("null") specialColor.Print("null")
case v.IsUndefined(): case v.IsUndefined():
...@@ -84,7 +92,7 @@ func (ctx ppctx) printValue(v otto.Value, level int) { ...@@ -84,7 +92,7 @@ func (ctx ppctx) printValue(v otto.Value, level int) {
} }
} }
func (ctx ppctx) printObject(obj *otto.Object, level int) { func (ctx ppctx) printObject(obj *otto.Object, level int, inArray bool) {
switch obj.Class() { switch obj.Class() {
case "Array": case "Array":
lv, _ := obj.Get("length") lv, _ := obj.Get("length")
...@@ -101,7 +109,7 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) { ...@@ -101,7 +109,7 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) {
for i := int64(0); i < len; i++ { for i := int64(0); i < len; i++ {
el, err := obj.Get(strconv.FormatInt(i, 10)) el, err := obj.Get(strconv.FormatInt(i, 10))
if err == nil { if err == nil {
ctx.printValue(el, level+1) ctx.printValue(el, level+1, true)
} }
if i < len-1 { if i < len-1 {
fmt.Printf(", ") fmt.Printf(", ")
...@@ -129,12 +137,15 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) { ...@@ -129,12 +137,15 @@ func (ctx ppctx) printObject(obj *otto.Object, level int) {
for i, k := range keys { for i, k := range keys {
v, _ := obj.Get(k) v, _ := obj.Get(k)
fmt.Printf("%s%s: ", ctx.indent(level+1), k) fmt.Printf("%s%s: ", ctx.indent(level+1), k)
ctx.printValue(v, level+1) ctx.printValue(v, level+1, false)
if i < len(keys)-1 { if i < len(keys)-1 {
fmt.Printf(",") fmt.Printf(",")
} }
fmt.Println() fmt.Println()
} }
if inArray {
level--
}
fmt.Printf("%s}", ctx.indent(level)) fmt.Printf("%s}", ctx.indent(level))
case "Function": case "Function":
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment