github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/internal/jsre/completion.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450092388061184> 11 12 13 package jsre 14 15 import ( 16 "sort" 17 "strings" 18 19 "github.com/robertkrimen/otto" 20 ) 21 22 //completekeywords返回给定行的潜在连续性。既然是 23 //经过评估,调用方需要确保评估行没有副作用。 24 func (jsre *JSRE) CompleteKeywords(line string) []string { 25 var results []string 26 jsre.Do(func(vm *otto.Otto) { 27 results = getCompletions(vm, line) 28 }) 29 return results 30 } 31 32 func getCompletions(vm *otto.Otto, line string) (results []string) { 33 parts := strings.Split(line, ".") 34 objRef := "this" 35 prefix := line 36 if len(parts) > 1 { 37 objRef = strings.Join(parts[0:len(parts)-1], ".") 38 prefix = parts[len(parts)-1] 39 } 40 41 obj, _ := vm.Object(objRef) 42 if obj == nil { 43 return nil 44 } 45 iterOwnAndConstructorKeys(vm, obj, func(k string) { 46 if strings.HasPrefix(k, prefix) { 47 if objRef == "this" { 48 results = append(results, k) 49 } else { 50 results = append(results, strings.Join(parts[:len(parts)-1], ".")+"."+k) 51 } 52 } 53 }) 54 55 //附加左括号(用于函数)或点(用于对象) 56 //如果行本身是唯一完成的。 57 if len(results) == 1 && results[0] == line { 58 obj, _ := vm.Object(line) 59 if obj != nil { 60 if obj.Class() == "Function" { 61 results[0] += "(" 62 } else { 63 results[0] += "." 64 } 65 } 66 } 67 68 sort.Strings(results) 69 return results 70 } 71