package complete
import (
)
type item = mode.CompletionItem
var errNoPureEvaler = errors.New("no PureEvaler supplied")
var errNoCompletion = errors.New("no completion")
type Config struct {
PureEvaler PureEvaler
Filterer Filterer
ArgGenerator ArgGenerator
}
type Filterer func(ctxName, seed string, rawItems []RawItem) []RawItem
type ArgGenerator func(args []string) ([]RawItem, error)
type Result struct {
Name string
Replace diag.Ranging
Items []mode.CompletionItem
}
type RawItem interface {
String() string
Cook(parse.PrimaryType) mode.CompletionItem
}
type PureEvaler interface {
EachExternal(func(cmd string))
EachSpecial(func(special string))
EachNs(func(string))
EachVariableInNs(string, func(string))
PurelyEvalPrimary(pn *parse.Primary) interface{}
PurelyEvalCompound(*parse.Compound) (string, bool)
PurelyEvalPartialCompound(*parse.Compound, int) (string, bool)
}
type CodeBuffer struct {
Content string
Dot int
}
func ( CodeBuffer, Config) (*Result, error) {
if .PureEvaler == nil {
return nil, errNoPureEvaler
}
if .Filterer == nil {
.Filterer = FilterPrefix
}
if .ArgGenerator == nil {
.ArgGenerator = GenerateFileNames
}
, := parse.Parse(parse.Source{Name: "[interactive]", Code: .Content}, parse.Config{})
:= parseutil.FindLeafNode(.Root, .Dot)
for , := range completers {
, , := (, )
if == errNoCompletion {
continue
}
= .Filterer(.name, .seed, )
:= make([]mode.CompletionItem, len())
for , := range {
[] = .Cook(.quote)
}
sort.Slice(, func(, int) bool {
return [].ToShow < [].ToShow
})
= dedup()
return &Result{Name: .name, Items: , Replace: .interval}, nil
}
return nil, errNoCompletion
}
func ( []mode.CompletionItem) []mode.CompletionItem {
var []mode.CompletionItem
for , := range {
if == 0 || .ToInsert != [-1].ToInsert {
= append(, )
}
}
return
}