]> git.saurik.com Git - cycript.git/blobdiff - Complete.cpp
Also use CXType walker to for function prototypes.
[cycript.git] / Complete.cpp
index 8240068428fc4e060dd5308415bf7868e93c173b..fcf8f5dc364e6b4def21964068c067e5e2ca5f5b 100644 (file)
@@ -19,6 +19,8 @@
 **/
 /* }}} */
 
+#include <typeinfo>
+
 #include "cycript.hpp"
 
 #include "Driver.hpp"
@@ -84,7 +86,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri
 
         case CYDriver::AutoMessage: {
             CYDriver::Context &thing(driver.contexts_.back());
-            expression = $M($C1($V("object_getClass"), thing.context_), $S("messages"));
+            expression = $M($C1($V("object_getClass"), thing.context_), $S("prototype"));
             for (CYDriver::Context::Words::const_iterator part(thing.words_.begin()); part != thing.words_.end(); ++part)
                 prefix << (*part)->word_ << ':';
         } break;
@@ -93,14 +95,31 @@ _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);
     }
 
     std::string begin(prefix.str());
 
-    driver.script_ = $ CYScript($ CYExpress($C3(ParseExpression(pool,
-    "   function(object, prefix, word) {\n"
+    CYBoolean *message;
+    if (driver.mode_ == CYDriver::AutoMessage)
+        message = $ CYTrue();
+    else
+        message = $ CYFalse();
+
+    driver.script_ = $ CYScript($ CYExpress($C4(ParseExpression(pool,
+    "   function(value, prefix, word, message) {\n"
+    "       var object = value;\n"
     "       var names = [];\n"
     "       var before = prefix.length;\n"
     "       prefix += word;\n"
@@ -108,12 +127,10 @@ _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"
+    "           if (object.hasOwnProperty(\"cy$complete\"))\n"
+    "               names = names.concat(object.cy$complete.call(value, prefix, message));\n"
     "           try {\n"
     "               var local = Object.getOwnPropertyNames(object);\n"
     "           } catch (e) {\n"
@@ -121,11 +138,11 @@ _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"
-    ), expression, $S(begin.c_str()), $S(word))));
+    ), expression, $S(begin.c_str()), $S(word), message)));
 
     driver.script_->Replace(context);
 
@@ -157,8 +174,10 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri
         _assert(value != NULL);
         element = value->next_;
 
-        CYString *string(dynamic_cast<CYString *>(value->value_));
-        _assert(string != NULL);
+        _assert(value->value_ != NULL);
+        CYString *string(value->value_->String(context));
+        if (string == NULL)
+            CYThrow("string was actually %s", typeid(*value->value_).name());
 
         CYUTF8String completion;
         if (string->size_ != 0)
@@ -168,9 +187,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) {