py/repl: Autocomplete builtin modules.

Doing "import <tab>" will now complete/list built-in modules.

Originally at adafruit#4548 and adafruit#4608

Signed-off-by: Artyom Skrobov <tyomitch@gmail.com>
This commit is contained in:
Artyom Skrobov 2021-04-03 16:56:02 -04:00 committed by Damien George
parent 7556e01f14
commit ca35c0059c
3 changed files with 43 additions and 12 deletions

View File

@ -268,6 +268,13 @@ STATIC mp_obj_t extra_coverage(void) {
size_t len = mp_repl_autocomplete("__n", 3, &mp_plat_print, &str);
mp_printf(&mp_plat_print, "%.*s\n", (int)len, str);
len = mp_repl_autocomplete("i", 1, &mp_plat_print, &str);
mp_printf(&mp_plat_print, "%.*s\n", (int)len, str);
mp_repl_autocomplete("import ", 7, &mp_plat_print, &str);
len = mp_repl_autocomplete("import ut", 9, &mp_plat_print, &str);
mp_printf(&mp_plat_print, "%.*s\n", (int)len, str);
mp_repl_autocomplete("import utime", 12, &mp_plat_print, &str);
mp_store_global(MP_QSTR_sys, mp_import_name(MP_QSTR_sys, mp_const_none, MP_OBJ_NEW_SMALL_INT(0)));
mp_repl_autocomplete("sys.", 4, &mp_plat_print, &str);
len = mp_repl_autocomplete("sys.impl", 8, &mp_plat_print, &str);

View File

@ -26,6 +26,7 @@
#include <string.h>
#include "py/obj.h"
#include "py/objmodule.h"
#include "py/runtime.h"
#include "py/builtin.h"
#include "py/repl.h"
@ -144,10 +145,16 @@ bool mp_repl_continue_with_input(const char *input) {
}
STATIC bool test_qstr(mp_obj_t obj, qstr name) {
// try object member
mp_obj_t dest[2];
mp_load_method_protected(obj, name, dest, true);
return dest[0] != MP_OBJ_NULL;
if (obj) {
// try object member
mp_obj_t dest[2];
mp_load_method_protected(obj, name, dest, true);
return dest[0] != MP_OBJ_NULL;
} else {
// try builtin module
return mp_map_lookup((mp_map_t *)&mp_builtin_module_map,
MP_OBJ_NEW_QSTR(name), MP_MAP_LOOKUP);
}
}
STATIC const char *find_completions(const char *s_start, size_t s_len,
@ -274,6 +281,12 @@ size_t mp_repl_autocomplete(const char *str, size_t len, const mp_print_t *print
++str;
}
// after "import", suggest built-in modules
static const char import_str[] = "import ";
if (len >= 7 && !memcmp(org_str, import_str, 7)) {
obj = MP_OBJ_NULL;
}
// look for matches
size_t match_len;
qstr q_first, q_last;
@ -282,21 +295,18 @@ size_t mp_repl_autocomplete(const char *str, size_t len, const mp_print_t *print
// nothing found
if (q_first == 0) {
if (s_len == 0) {
*compl_str = " ";
return 4;
}
// If there're no better alternatives, and if it's first word
// in the line, try to complete "import".
if (s_start == org_str) {
static const char import_str[] = "import ";
if (s_start == org_str && s_len > 0) {
if (memcmp(s_start, import_str, s_len) == 0) {
*compl_str = import_str + s_len;
return sizeof(import_str) - 1 - s_len;
}
}
return 0;
if (q_first == 0) {
*compl_str = " ";
return s_len ? 0 : 4;
}
}
// 1 match found, or multiple matches with a common prefix

View File

@ -27,6 +27,20 @@ RuntimeError:
RuntimeError:
# repl
ame__
mport
builtins micropython _thread _uasyncio
btree cexample cmath cppexample
ffi framebuf gc math
termios uarray ubinascii ucollections
ucryptolib uctypes uerrno uhashlib
uheapq uio ujson umachine
uos urandom ure uselect
usocket ussl ustruct usys
utime utimeq uwebsocket uzlib
ime
utime utimeq
argv atexit byteorder exc_info
exit getsizeof implementation maxsize