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