| 1 | #!/usr/bin/env python2 | 
| 2 | from __future__ import print_function | 
| 3 |  | 
| 4 | from _devbuild.gen import arg_types | 
| 5 | from _devbuild.gen.syntax_asdl import loc | 
| 6 | from core import completion | 
| 7 | from core.error import e_usage | 
| 8 | from core import vm | 
| 9 | from data_lang import j8 | 
| 10 | from mycpp import mops | 
| 11 | from mycpp import mylib | 
| 12 | from mycpp.mylib import log | 
| 13 | from frontend import flag_util | 
| 14 | from frontend import args | 
| 15 |  | 
| 16 | from typing import TYPE_CHECKING | 
| 17 | if TYPE_CHECKING: | 
| 18 | from _devbuild.gen.runtime_asdl import cmd_value | 
| 19 |  | 
| 20 |  | 
| 21 | class CompExport(vm._Builtin): | 
| 22 |  | 
| 23 | def __init__(self, root_comp): | 
| 24 | # type: (completion.RootCompleter) -> None | 
| 25 | self.root_comp = root_comp | 
| 26 |  | 
| 27 | def Run(self, cmd_val): | 
| 28 | # type: (cmd_value.Argv) -> int | 
| 29 | arg_r = args.Reader(cmd_val.argv, cmd_val.arg_locs) | 
| 30 | arg_r.Next() | 
| 31 |  | 
| 32 | attrs = flag_util.ParseMore('compexport', arg_r) | 
| 33 | arg = arg_types.compexport(attrs.attrs) | 
| 34 |  | 
| 35 | if arg.c is None: | 
| 36 | e_usage('expected a -c string, like sh -c', loc.Missing) | 
| 37 |  | 
| 38 | arg_begin = mops.BigTruncate(arg.begin) | 
| 39 | arg_end = mops.BigTruncate(arg.end) | 
| 40 |  | 
| 41 | begin = 0 if arg_begin == -1 else arg_begin | 
| 42 | end = len(arg.c) if arg_end == -1 else arg_end | 
| 43 |  | 
| 44 | #log('%r begin %d end %d', arg.c, begin, end) | 
| 45 |  | 
| 46 | # Copied from completion.ReadlineCallback | 
| 47 | comp = completion.Api(line=arg.c, begin=begin, end=end) | 
| 48 | it = self.root_comp.Matches(comp) | 
| 49 |  | 
| 50 | #print(comp) | 
| 51 | #print(self.root_comp) | 
| 52 |  | 
| 53 | comp_matches = list(it) | 
| 54 | comp_matches.reverse() | 
| 55 |  | 
| 56 | if arg.format == 'jlines': | 
| 57 | buf = mylib.BufWriter() | 
| 58 | for m in comp_matches: | 
| 59 | # Note: everything is quoted, that seems simpler. | 
| 60 | j8.EncodeString(m, buf) | 
| 61 | print(buf.getvalue()) | 
| 62 | buf.clear() | 
| 63 |  | 
| 64 | elif arg.format == 'tsv8': | 
| 65 | log('TSV8 format not implemented') | 
| 66 | else: | 
| 67 | raise AssertionError() | 
| 68 |  | 
| 69 | return 0 |