def handle_findid(send_data, fn, row, col): try: buf = mgr.buf_from_path(fn, lang=None, env=env) buf.scan() _pos = file_pos(fn, row, col) trg = buf.defn_trg_from_pos(_pos) if not trg: dataT = S_ERROR + 'Cannot parse position' send_data(dataT) return logger = logging.getLogger("CodeIntel") ctlr = LogEvalController(logger) defs = buf.defns_from_trg(trg, TIMEOUT, ctlr) if defs: d = defs[0] if d.path: dataT = S_RESULT + '%s\n%d\n%d\n' % (d.path, d.line, 0) else: dataT = S_ERROR + 'Cannot find filename for "%s"' % d.name else: dataT = S_ERROR + 'No results' send_data(dataT) except Exception, e: dataT = S_ERROR + 'Exception in CodeIntel: ' + str(e) send_data(dataT)
def do_play(self, subcmd, opts): """Run my current play/dev code. ${cmd_usage} ${cmd_option_list} """ import pprint import random import ciElementTree as ET from codeintel2.manager import Manager from codeintel2.tree import pretty_tree_from_tree from codeintel2.common import LogEvalController, Error from codeintel2.util import tree_from_cix, dedent, unmark_text, banner from ci2 import _escaped_text_from_text if False: lang = "CSS" markedup_content = dedent(""" /* http://www.w3.org/TR/REC-CSS2/fonts.html#propdef-font-weight */ h1 { border: 1px solid black; font-weight /* hi */: <|> !important } """) content, data = unmark_text(markedup_content) pos = data["pos"] mgr = Manager() # mgr.upgrade() # Don't need it for just CSS usage. mgr.initialize() try: buf = mgr.buf_from_content(content, lang=lang, path="play.css") trg = buf.trg_from_pos(pos) if trg is None: raise Error("unexpected trigger: %r" % trg) completions = buf.cplns_from_trg(trg) print("COMPLETIONS: %r" % completions) finally: mgr.finalize() elif False: lang = "Python" path = os.path.join("<Unsaved>", "rand%d.py" % random.randint(0, 100)) markedup_content = dedent(""" import sys, os class Foo: def bar(self): pass sys.<|>path # should have path in completion list f = Foo() """) content, data = unmark_text(markedup_content) print(banner(path)) print(_escaped_text_from_text(content, "whitespace")) pos = data["pos"] mgr = Manager() mgr.upgrade() mgr.initialize() try: buf = mgr.buf_from_content(content, lang=lang, path=path) print(banner("cix", '-')) print(buf.cix) trg = buf.trg_from_pos(pos) if trg is None: raise Error("unexpected trigger: %r" % trg) print(banner("completions", '-')) ctlr = LogEvalController(self.log) buf.async_eval_at_trg(trg, ctlr) ctlr.wait(2) # XXX if not ctlr.is_done(): ctlr.abort() raise Error("XXX async eval timed out") pprint.pprint(ctlr.cplns) print(banner(None)) finally: mgr.finalize() elif False: lang = "Ruby" path = os.path.join("<Unsaved>", "rand%d.py" % random.randint(0, 100)) markedup_content = dedent("""\ r<1>equire 'net/http' include Net req = HTTPRequest.new req.<2>get() """) content, data = unmark_text(markedup_content) print(banner(path)) print(_escaped_text_from_text(content, "whitespace")) pos = data[1] mgr = Manager() mgr.upgrade() mgr.initialize() try: buf = mgr.buf_from_content(content, lang=lang, path=path) print(banner("cix", '-')) cix = buf.cix print(ET.tostring(pretty_tree_from_tree(tree_from_cix(cix)))) trg = buf.trg_from_pos(pos, implicit=False) if trg is None: raise Error("unexpected trigger: %r" % trg) print(banner("completions", '-')) ctlr = LogEvalController(self.log) buf.async_eval_at_trg(trg, ctlr) ctlr.wait(30) # XXX if not ctlr.is_done(): ctlr.abort() raise Error("XXX async eval timed out") pprint.pprint(ctlr.cplns) print(banner(None)) finally: mgr.finalize()
def _codeintel(buf, msgs): cplns = None calltips = None defns = None if not buf: logger(view, 'warning', "`%s' (%s) is not a language that uses CIX" % (path, lang)) return [None] * len(forms) try: trg = getattr(buf, 'preceding_trg_from_pos', lambda p: None)(pos2bytes(content, pos), pos2bytes(content, pos)) defn_trg = getattr(buf, 'defn_trg_from_pos', lambda p: None)(pos2bytes(content, pos)) except (CodeIntelError): codeintel_log.exception("Exception! %s:%s (%s)" % (path or '<Unsaved>', pos, lang)) logger(view, 'info', "Error indexing! Please send the log file: '%s" % condeintel_log_filename) trg = None defn_trg = None except: codeintel_log.exception("Exception! %s:%s (%s)" % (path or '<Unsaved>', pos, lang)) logger(view, 'info', "Error indexing! Please send the log file: '%s" % condeintel_log_filename) raise else: eval_log_stream = StringIO() _hdlrs = codeintel_log.handlers hdlr = logging.StreamHandler(eval_log_stream) hdlr.setFormatter(logging.Formatter("%(name)s: %(levelname)s: %(message)s")) codeintel_log.handlers = list(_hdlrs) + [hdlr] ctlr = LogEvalController(codeintel_log) try: if 'cplns' in forms and trg and trg.form == TRG_FORM_CPLN: cplns = buf.cplns_from_trg(trg, ctlr=ctlr, timeout=20) if 'calltips' in forms and trg and trg.form == TRG_FORM_CALLTIP: calltips = buf.calltips_from_trg(trg, ctlr=ctlr, timeout=20) if 'defns' in forms and defn_trg and defn_trg.form == TRG_FORM_DEFN: defns = buf.defns_from_trg(defn_trg, ctlr=ctlr, timeout=20) except EvalTimeout: logger(view, 'info', "Timeout while resolving completions!") finally: codeintel_log.handlers = _hdlrs logger(view, 'warning', "") logger(view, 'event', "") result = False merge = '' for msg in reversed(eval_log_stream.getvalue().strip().split('\n')): msg = msg.strip() if msg: try: name, levelname, msg = msg.split(':', 2) name = name.strip() levelname = levelname.strip().lower() msg = msg.strip() except: merge = (msg + ' ' + merge) if merge else msg continue merge = '' if not result and msg.startswith('evaluating '): calltip(view, 'warning', msg) result = True ret = [] for f in forms: if f == 'cplns': ret.append(cplns) elif f == 'calltips': ret.append(calltips) elif f == 'defns': ret.append(defns) total = (time.time() - start) * 1000 if total > 1000: timestr = "~%ss" % int(round(total / 1000)) else: timestr = "%sms" % int(round(total)) if not despaired or total < timeout: msg = "Done '%s' CodeIntel! Full CodeIntel took %s" % (lang, timestr) print >>condeintel_log_file, msg def _callback(): view_sel = view.sel() if view_sel and view.line(view_sel[0]) == view.line(pos): callback(*ret) logger(view, 'info', "") sublime.set_timeout(_callback, 0) else: msg = "Just finished indexing '%s'! Please try again. Full CodeIntel took %s" % (lang, timestr) print >>condeintel_log_file, msg logger(view, 'info', msg, timeout=3000)