| 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
 |