|
8 | 8 | WORD_RE = re.compile(r'\w') |
9 | 9 | jediPreview = False |
10 | 10 |
|
| 11 | +class RedirectStdout(object): |
| 12 | + def __init__(self, new_stdout=None): |
| 13 | + """If stdout is None, redirect to /dev/null""" |
| 14 | + self._new_stdout = new_stdout or open(os.devnull, 'w') |
| 15 | + |
| 16 | + def __enter__(self): |
| 17 | + sys.stdout.flush() |
| 18 | + oldstdout_fno = self.oldstdout_fno = os.dup(sys.stdout.fileno()) |
| 19 | + os.dup2(self._new_stdout.fileno(), 1) |
| 20 | + |
| 21 | + def __exit__(self, exc_type, exc_value, traceback): |
| 22 | + self._new_stdout.flush() |
| 23 | + os.dup2(self.oldstdout_fno, 1) |
11 | 24 |
|
12 | 25 | class JediCompletion(object): |
13 | 26 | basic_types = { |
@@ -533,12 +546,12 @@ def _process_request(self, request): |
533 | 546 | lookup = request.get('lookup', 'completions') |
534 | 547 |
|
535 | 548 | if lookup == 'names': |
536 | | - return self._write_response(self._serialize_definitions( |
| 549 | + return self._serialize_definitions( |
537 | 550 | jedi.api.names( |
538 | 551 | source=request.get('source', None), |
539 | 552 | path=request.get('path', ''), |
540 | 553 | all_scopes=True), |
541 | | - request['id'])) |
| 554 | + request['id']) |
542 | 555 |
|
543 | 556 | script = jedi.api.Script( |
544 | 557 | source=request.get('source', None), line=request['line'] + 1, |
@@ -548,29 +561,27 @@ def _process_request(self, request): |
548 | 561 | defs = self._get_definitionsx(script.goto_definitions(), request['id']) |
549 | 562 | if len(defs) == 0: |
550 | 563 | defs = self._get_definitionsx(script.goto_assignments(), request['id']) |
551 | | - return self._write_response(json.dumps({'id': request['id'], 'results': defs})) |
| 564 | + return json.dumps({'id': request['id'], 'results': defs}) |
552 | 565 | if lookup == 'tooltip': |
553 | 566 | if jediPreview: |
554 | 567 | defs = self._get_definitionsx(script.goto_definitions(), request['id'], True) |
555 | 568 | if len(defs) == 0: |
556 | 569 | defs = self._get_definitionsx(script.goto_assignments(), request['id'], True) |
557 | | - return self._write_response(json.dumps({'id': request['id'], 'results': defs})) |
| 570 | + return json.dumps({'id': request['id'], 'results': defs}) |
558 | 571 | else: |
559 | | - return self._write_response(self._serialize_tooltip(script.goto_definitions(), request['id'])) |
| 572 | + return self._serialize_tooltip(script.goto_definitions(), request['id']) |
560 | 573 | elif lookup == 'arguments': |
561 | | - return self._write_response(self._serialize_arguments( |
562 | | - script, request['id'])) |
| 574 | + return self._serialize_arguments( |
| 575 | + script, request['id']) |
563 | 576 | elif lookup == 'usages': |
564 | | - return self._write_response(self._serialize_usages( |
565 | | - script.usages(), request['id'])) |
| 577 | + return self._serialize_usages( |
| 578 | + script.usages(), request['id']) |
566 | 579 | elif lookup == 'methods': |
567 | | - return self._write_response( |
568 | | - self._serialize_methods(script, request['id'], |
569 | | - request.get('prefix', ''))) |
| 580 | + return self._serialize_methods(script, request['id'], |
| 581 | + request.get('prefix', '')) |
570 | 582 | else: |
571 | | - return self._write_response( |
572 | | - self._serialize_completions(script, request['id'], |
573 | | - request.get('prefix', ''))) |
| 583 | + return self._serialize_completions(script, request['id'], |
| 584 | + request.get('prefix', '')) |
574 | 585 |
|
575 | 586 | def _write_response(self, response): |
576 | 587 | sys.stdout.write(response + '\n') |
@@ -585,7 +596,9 @@ def watch(self): |
585 | 596 | sys.stderr.write('Received EOF from the standard input,exiting' + '\n') |
586 | 597 | sys.stderr.flush() |
587 | 598 | return |
588 | | - self._process_request(rq) |
| 599 | + with RedirectStdout(): |
| 600 | + response = self._process_request(rq) |
| 601 | + self._write_response(response) |
589 | 602 |
|
590 | 603 | except Exception: |
591 | 604 | sys.stderr.write(traceback.format_exc() + '\n') |
|