github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/internal/jsre/completion.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2016 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package jsre
    26  
    27  import (
    28  	"sort"
    29  	"strings"
    30  
    31  	"github.com/robertkrimen/otto"
    32  )
    33  
    34  //completekeywords返回给定行的潜在连续性。既然是
    35  //经过评估,调用方需要确保评估行没有副作用。
    36  func (jsre *JSRE) CompleteKeywords(line string) []string {
    37  	var results []string
    38  	jsre.Do(func(vm *otto.Otto) {
    39  		results = getCompletions(vm, line)
    40  	})
    41  	return results
    42  }
    43  
    44  func getCompletions(vm *otto.Otto, line string) (results []string) {
    45  	parts := strings.Split(line, ".")
    46  	objRef := "this"
    47  	prefix := line
    48  	if len(parts) > 1 {
    49  		objRef = strings.Join(parts[0:len(parts)-1], ".")
    50  		prefix = parts[len(parts)-1]
    51  	}
    52  
    53  	obj, _ := vm.Object(objRef)
    54  	if obj == nil {
    55  		return nil
    56  	}
    57  	iterOwnAndConstructorKeys(vm, obj, func(k string) {
    58  		if strings.HasPrefix(k, prefix) {
    59  			if objRef == "this" {
    60  				results = append(results, k)
    61  			} else {
    62  				results = append(results, strings.Join(parts[:len(parts)-1], ".")+"."+k)
    63  			}
    64  		}
    65  	})
    66  
    67  //附加左括号(用于函数)或点(用于对象)
    68  //如果行本身是唯一完成的。
    69  	if len(results) == 1 && results[0] == line {
    70  		obj, _ := vm.Object(line)
    71  		if obj != nil {
    72  			if obj.Class() == "Function" {
    73  				results[0] += "("
    74  			} else {
    75  				results[0] += "."
    76  			}
    77  		}
    78  	}
    79  
    80  	sort.Strings(results)
    81  	return results
    82  }