X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/2c1d569a0ed9ddd14d3d1d73ee8be776e0889d35..a61a2713e0da8cffde645b2655df4bf7c04e32c5:/Complete.cpp?ds=sidebyside diff --git a/Complete.cpp b/Complete.cpp index 75b80c0..6ce6671 100644 --- a/Complete.cpp +++ b/Complete.cpp @@ -22,7 +22,6 @@ #include "cycript.hpp" #include "Driver.hpp" -#include "Cycript.tab.hh" #include "Replace.hpp" #include "String.hpp" @@ -30,19 +29,17 @@ 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()) + if (driver.Parse() || !driver.errors_.empty()) return NULL; CYOptions options; CYContext context(options); - CYStatement *statement(driver.program_->code_); + CYStatement *statement(driver.script_->code_); _assert(statement != NULL); _assert(statement->next_ == NULL); - CYExpress *express(dynamic_cast(driver.program_->code_)); + CYExpress *express(dynamic_cast(driver.script_->code_)); _assert(express != NULL); CYParenthetical *parenthetical(dynamic_cast(express->expression_)); @@ -59,8 +56,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri 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) @@ -99,24 +95,35 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri std::string begin(prefix.str()); - driver.program_ = $ CYProgram($ CYExpress($C3(ParseExpression(pool, + driver.script_ = $ CYScript($ CYExpress($C3(ParseExpression(pool, " function(object, prefix, word) {\n" " var names = [];\n" " 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" + " 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)))); - driver.program_->Replace(context); + driver.script_->Replace(context); std::stringbuf str; CYOutput out(str, options); - out << *driver.program_; + out << *driver.script_; std::string code(str.str()); CYUTF8String json(run(pool, code)); @@ -137,8 +144,12 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri std::string common; bool rest(false); - CYForEach (element, array->elements_) { - CYString *string(dynamic_cast(element->value_)); + for (CYElement *element(array->elements_); element != NULL; ) { + CYElementValue *value(dynamic_cast(element)); + _assert(value != NULL); + element = value->next_; + + CYString *string(dynamic_cast(value->value_)); _assert(string != NULL); std::string completion;