From: Jay Freeman (saurik) Date: Mon, 4 Jan 2016 03:29:47 +0000 (-0800) Subject: Allow users to tab complete struct and enum names. X-Git-Tag: v0.9.590~67 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/840966082c867decd624b074661e31945193abea?ds=sidebyside Allow users to tab complete struct and enum names. --- diff --git a/Analyze.cpp b/Analyze.cpp index 0f46cb4..f5195a0 100644 --- a/Analyze.cpp +++ b/Analyze.cpp @@ -524,7 +524,7 @@ static CXChildVisitResult CYChildVisit(CXCursor cursor, CXCursor parent, CXClien CYTypeExpression(&typed).Output(out, CYNoBFC); value << ".withName(\"" << name << "\")"; - name += "$cye"; + name = "$cye" + name; flags = CYBridgeType; // the enum constants are implemented separately *also* @@ -603,7 +603,7 @@ static CXChildVisitResult CYChildVisit(CXCursor cursor, CXCursor parent, CXClien CYTypeExpression(&typed).Output(out, CYNoBFC); value << ".withName(\"" << name << "\")"; - name += "$cys"; + name = "$cys" + name; flags = CYBridgeType; } break; diff --git a/Complete.cpp b/Complete.cpp index 8240068..820895c 100644 --- a/Complete.cpp +++ b/Complete.cpp @@ -93,6 +93,16 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri 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); } @@ -108,7 +118,7 @@ _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" @@ -121,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" @@ -168,9 +178,11 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri else continue; + completion.data += begin.size(); + completion.size -= begin.size(); + if (CYStartsWith(completion, "$cy")) continue; - completions.push_back(completion); if (!rest) { diff --git a/Driver.hpp b/Driver.hpp index a653d0a..07188ce 100644 --- a/Driver.hpp +++ b/Driver.hpp @@ -114,6 +114,8 @@ class _visible CYDriver { AutoIndirect, AutoMessage, AutoResolve, + AutoStruct, + AutoEnum, } mode_; private: diff --git a/Parser.ypp.in b/Parser.ypp.in index 19e235f..4b7751d 100644 --- a/Parser.ypp.in +++ b/Parser.ypp.in @@ -2147,6 +2147,8 @@ PrimitiveReference : PrimitiveType[pass] { $$ = $pass; } | "struct" IdentifierType[name] { $$ = CYNew CYTypeReference(CYTypeReferenceStruct, $name); } | "enum" IdentifierType[name] { $$ = CYNew CYTypeReference(CYTypeReferenceEnum, $name); } + | "struct" AutoComplete { driver.mode_ = CYDriver::AutoStruct; YYACCEPT; } + | "enum" AutoComplete { driver.mode_ = CYDriver::AutoEnum; YYACCEPT; } ; TypedIdentifierMaybe @@ -2440,6 +2442,7 @@ Statement__ PrimaryExpression : "(" LexOf "struct" NewLineOpt IdentifierType[name] TypeQualifierRightOpt[typed] ")" { $typed->specifier_ = CYNew CYTypeReference(CYTypeReferenceStruct, $name); $$ = CYNew CYTypeExpression($typed); } + | "(" LexOf "struct" NewLineOpt AutoComplete { driver.mode_ = CYDriver::AutoStruct; YYACCEPT; } ; /* }}} */ /* Cycript (C): Type Definitions {{{ */ diff --git a/Replace.cpp b/Replace.cpp index 65d8236..103f6f8 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -1288,14 +1288,14 @@ CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) { } CYTarget *CYTypeReference::Replace(CYContext &context) { - const char *suffix; + const char *prefix; switch (kind_) { - case CYTypeReferenceStruct: suffix = "$cys"; break; - case CYTypeReferenceEnum: suffix = "$cye"; break; + case CYTypeReferenceStruct: prefix = "$cys"; break; + case CYTypeReferenceEnum: prefix = "$cye"; break; default: _assert(false); } - return $V($pool.strcat(name_->Word(), suffix, NULL)); + return $V($pool.strcat(prefix, name_->Word(), NULL)); } CYTarget *CYTypeStruct::Replace(CYContext &context) {