'Asynchronously determine completion/calltip info for the given
trigger.
"trg" is the trigger at which to evaluate (a Trigger instance).
"ctlr" is the controller (a EvalController instance) used to
relay results and status and to receive control signals.
Rules for implementation:
- Must call ctlr.start(buf, trg) at start.
- Should call ctlr.set_desc(desc) near the start to provide a
short description of the evaluation.
- Should log eval errors via ctlr.error(msg, args...).
- Should log other events via ctlr.{debug|info|warn}.
- Should respond to ctlr.abort() in a timely manner.
- If successful, must report results via one of
ctlr.set_cplns() or ctlr.set_calltips().
- Must call ctlr.done(some_reason_string) when done.
Tips for implementation:
- The typical structure of an async_eval_at_trg() implementation is:
ctlr.start(self, trg)  # or \'buf\' if implemented on LangIntel
if trg.id == (<lang>, TRG_FORM_CPLN, <type>):
# handle this trigger type
elif trg.id == (<lang>, TRG_FORM_CPLN, <type>):
# handle this trigger type
- If evaluation of a particular trigger type is fast (i.e. just a
lookup in a hardcoded data structure) then it is okay to process
asynchronously.
The default implementation defers to the langintel for this buffer.
Returns no value. All interaction is on the controller. This may
raise CodeIntelError on an unexpected error condition.'

def async_eval_at_trg(self, trg, ctlr):

    self.langintel.async_eval_at_trg(self, trg, ctlr)
