mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-05 19:06:04 +00:00

This is relanding D81001. The patch originally failed as on newer editline versions it seems CC_REFRESH will move the cursor to the start of the line via \r and then back to the original position. On older editline versions like the one used by default on macOS, CC_REFRESH doesn't move the cursor at all. As the patch changed the way we handle tab completion (previously we did REDISPLAY but now we're doing CC_REFRESH), this caused a few completion tests to receive this unexpected cursor movement in the output stream. This patch updates those tests to also accept output that contains the specific cursor movement commands (\r and then \x1b[XC). lldbpexpect.py received an utility method for generating the cursor movement escape sequence. Original summary: I implemented autosuggestion if there is one possible suggestion. I set the keybinds for every character. When a character is typed, Editline::TypedCharacter is called. Then, autosuggestion part is displayed in gray, and you can actually input by typing C-k. Editline::Autosuggest is a function for finding completion, and it is like Editline::TabCommand now, but I will add more features to it. Testing does not work well in my environment, so I can't confirm that it goes well, sorry. I am dealing with it now. Reviewed By: teemperor, JDevlieghere, #lldb Differential Revision: https://reviews.llvm.org/D81001
78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
from __future__ import absolute_import
|
|
|
|
# System modules
|
|
import os
|
|
import sys
|
|
|
|
# Third-party modules
|
|
import six
|
|
|
|
# LLDB Modules
|
|
import lldb
|
|
from .lldbtest import *
|
|
from . import lldbutil
|
|
from lldbsuite.test.decorators import *
|
|
|
|
if sys.platform.startswith('win32'):
|
|
# llvm.org/pr22274: need a pexpect replacement for windows
|
|
class PExpectTest(object):
|
|
pass
|
|
else:
|
|
import pexpect
|
|
|
|
@skipIfRemote
|
|
class PExpectTest(TestBase):
|
|
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
PROMPT = "(lldb) "
|
|
|
|
def expect_prompt(self):
|
|
self.child.expect_exact(self.PROMPT)
|
|
|
|
def launch(self, executable=None, extra_args=None, timeout=30, dimensions=None):
|
|
logfile = getattr(sys.stdout, 'buffer',
|
|
sys.stdout) if self.TraceOn() else None
|
|
|
|
args = ['--no-lldbinit', '--no-use-colors']
|
|
for cmd in self.setUpCommands():
|
|
args += ['-O', cmd]
|
|
if executable is not None:
|
|
args += ['--file', executable]
|
|
if extra_args is not None:
|
|
args.extend(extra_args)
|
|
|
|
env = dict(os.environ)
|
|
env["TERM"]="vt100"
|
|
|
|
self.child = pexpect.spawn(
|
|
lldbtest_config.lldbExec, args=args, logfile=logfile,
|
|
timeout=timeout, dimensions=dimensions, env=env)
|
|
self.expect_prompt()
|
|
for cmd in self.setUpCommands():
|
|
self.child.expect_exact(cmd)
|
|
self.expect_prompt()
|
|
if executable is not None:
|
|
self.child.expect_exact("target create")
|
|
self.child.expect_exact("Current executable set to")
|
|
self.expect_prompt()
|
|
|
|
def expect(self, cmd, substrs=None):
|
|
self.assertNotIn('\n', cmd)
|
|
self.child.sendline(cmd)
|
|
if substrs is not None:
|
|
for s in substrs:
|
|
self.child.expect_exact(s)
|
|
self.expect_prompt()
|
|
|
|
def quit(self, gracefully=True):
|
|
self.child.sendeof()
|
|
self.child.close(force=not gracefully)
|
|
self.child = None
|
|
|
|
def cursor_forward_escape_seq(self, chars_to_move):
|
|
"""
|
|
Returns the escape sequence to move the cursor forward/right
|
|
by a certain amount of characters.
|
|
"""
|
|
return b"\x1b\[" + str(chars_to_move).encode("utf-8") + b"C"
|