summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/unix/coverage.c7
-rw-r--r--py/repl.c34
-rw-r--r--tests/unix/extra_coverage.py.exp14
3 files changed, 43 insertions, 12 deletions
diff --git a/ports/unix/coverage.c b/ports/unix/coverage.c
index 220666e38..d5b5d8dd7 100644
--- a/ports/unix/coverage.c
+++ b/ports/unix/coverage.c
@@ -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);
diff --git a/py/repl.c b/py/repl.c
index c8bb715e9..57bc21eff 100644
--- a/py/repl.c
+++ b/py/repl.c
@@ -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
diff --git a/tests/unix/extra_coverage.py.exp b/tests/unix/extra_coverage.py.exp
index ab4d97774..ea91813fc 100644
--- a/tests/unix/extra_coverage.py.exp
+++ b/tests/unix/extra_coverage.py.exp
@@ -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