58 lines
993 B
Go
58 lines
993 B
Go
|
package repl
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/robertkrimen/otto"
|
||
|
)
|
||
|
|
||
|
type autoCompleter struct {
|
||
|
vm *otto.Otto
|
||
|
}
|
||
|
|
||
|
var lastExpressionRegex = regexp.MustCompile(`[a-zA-Z0-9]([a-zA-Z0-9\.]*[a-zA-Z0-9])?\.?$`)
|
||
|
|
||
|
func (a *autoCompleter) Do(line []rune, pos int) ([][]rune, int) {
|
||
|
lastExpression := lastExpressionRegex.FindString(string(line))
|
||
|
|
||
|
bits := strings.Split(lastExpression, ".")
|
||
|
|
||
|
first := bits[:len(bits)-1]
|
||
|
last := bits[len(bits)-1]
|
||
|
|
||
|
var l []string
|
||
|
|
||
|
if len(first) == 0 {
|
||
|
c := a.vm.Context()
|
||
|
|
||
|
l = make([]string, len(c.Symbols))
|
||
|
|
||
|
i := 0
|
||
|
for k := range c.Symbols {
|
||
|
l[i] = k
|
||
|
i++
|
||
|
}
|
||
|
} else {
|
||
|
r, err := a.vm.Eval(strings.Join(bits[:len(bits)-1], "."))
|
||
|
if err != nil {
|
||
|
return nil, 0
|
||
|
}
|
||
|
|
||
|
if o := r.Object(); o != nil {
|
||
|
for _, v := range o.KeysByParent() {
|
||
|
l = append(l, v...)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var r [][]rune
|
||
|
for _, s := range l {
|
||
|
if strings.HasPrefix(s, last) {
|
||
|
r = append(r, []rune(strings.TrimPrefix(s, last)))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return r, len(last)
|
||
|
}
|