X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/c3d9dbc7522c2ba685074d9ab5672e3e023e5f5d..447b698cea96010d0850e056348ef6cd085b96d9:/Complete.cpp diff --git a/Complete.cpp b/Complete.cpp index d822d99..820895c 100644 --- a/Complete.cpp +++ b/Complete.cpp @@ -1,5 +1,5 @@ -/* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2015 Jay Freeman (saurik) +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) */ /* GNU Affero General Public License, Version 3 {{{ */ @@ -89,6 +89,20 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri prefix << (*part)->word_ << ':'; } break; + case CYDriver::AutoResolve: + expression = $M(driver.context_, $S("$cyr")); + break; + + case CYDriver::AutoStruct: + expression = $ CYThis(); + prefix << "$cys"; + break; + + case CYDriver::AutoEnum: + expression = $ CYThis(); + prefix << "$cye"; + break; + default: _assert(false); } @@ -104,8 +118,12 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri " if (false) {\n" " for (var name in object)\n" " if (name.substring(0, entire) == prefix)\n" - " names.push(name.substr(before));\n" + " names.push(name);\n" " } else do {\n" + " if (object.hasOwnProperty(\"cy$complete\")) {\n" + " names = names.concat(object.cy$complete(prefix));\n" + " continue;\n" + " }\n" " try {\n" " var local = Object.getOwnPropertyNames(object);\n" " } catch (e) {\n" @@ -113,7 +131,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri " }\n" " for (var name of local)\n" " if (name.substring(0, entire) == prefix)\n" - " names.push(name.substr(before));\n" + " names.push(name);\n" " } while (object = typeof object === 'object' ? Object.getPrototypeOf(object) : object.__proto__);\n" " return names;\n" " }\n" @@ -138,7 +156,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri return NULL; // XXX: use an std::set? - typedef std::vector Completions; + typedef std::vector Completions; Completions completions; std::string common; @@ -152,27 +170,32 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri CYString *string(dynamic_cast(value->value_)); _assert(string != NULL); - std::string completion; + CYUTF8String completion; if (string->size_ != 0) - completion.assign(string->value_, string->size_); + completion = {string->value_, string->size_}; else if (driver.mode_ == CYDriver::AutoMessage) completion = "]"; else continue; + completion.data += begin.size(); + completion.size -= begin.size(); + + if (CYStartsWith(completion, "$cy")) + continue; completions.push_back(completion); if (!rest) { common = completion; rest = true; } else { - size_t limit(completion.size()), size(common.size()); + size_t limit(completion.size), size(common.size()); if (size > limit) common = common.substr(0, limit); else limit = size; for (limit = 0; limit != size; ++limit) - if (common[limit] != completion[limit]) + if (common[limit] != completion.data[limit]) break; if (limit != size) common = common.substr(0, limit); @@ -194,7 +217,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri results[0] = strdup(common.c_str()); size_t index(0); for (Completions::const_iterator i(completions.begin()); i != completions.end(); ++i) - results[++index] = strdup(i->c_str()); + results[++index] = strdup(i->data); results[count + 1] = NULL; return results;