X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/fc8fc33d0c3a25e23e354fed740ff500fab218d9..8a3643b285973c3e59ed19e5a8c83b137ea7c30c:/Complete.cpp diff --git a/Complete.cpp b/Complete.cpp index 3d14193..276ccaf 100644 --- a/Complete.cpp +++ b/Complete.cpp @@ -22,17 +22,14 @@ #include "cycript.hpp" #include "Driver.hpp" -#include "Cycript.tab.hh" #include "Replace.hpp" #include "String.hpp" static CYExpression *ParseExpression(CYPool &pool, CYUTF8String code) { std::stringstream stream; stream << '(' << code << ')'; - CYDriver driver(pool, stream); - - cy::parser parser(driver); - if (parser.parse() != 0 || !driver.errors_.empty()) + CYDriver driver(pool, *stream.rdbuf()); + if (driver.Parse() || !driver.errors_.empty()) return NULL; CYOptions options; @@ -54,13 +51,12 @@ static CYExpression *ParseExpression(CYPool &pool, CYUTF8String code) { _visible char **CYComplete(const char *word, const std::string &line, CYUTF8String (*run)(CYPool &pool, const std::string &)) { CYLocalPool pool; - std::istringstream stream(line); + std::stringbuf stream(line); CYDriver driver(pool, stream); driver.auto_ = true; - cy::parser parser(driver); - if (parser.parse() != 0 || !driver.errors_.empty()) + if (driver.Parse() || !driver.errors_.empty()) return NULL; if (driver.mode_ == CYDriver::AutoNone) @@ -105,9 +101,24 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri " var before = prefix.length;\n" " prefix += word;\n" " var entire = prefix.length;\n" - " for (var name in object)\n" - " if (name.substring(0, entire) == prefix)\n" - " names.push(name.substr(before));\n" + " if (false) {\n" + " for (var name in object)\n" + " if (name.substring(0, entire) == prefix)\n" + " names.push(name.substr(before));\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" + " continue;\n" + " }\n" + " for (var name of local)\n" + " if (name.substring(0, entire) == prefix)\n" + " names.push(name.substr(before));\n" + " } while (object = typeof object === 'object' ? Object.getPrototypeOf(object) : object.__proto__);\n" " return names;\n" " }\n" ), expression, $S(begin.c_str()), $S(word))));