]> git.saurik.com Git - cycript.git/commitdiff
Add a ?reparse mode to experiment pretty printing.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Jan 2016 06:11:49 +0000 (22:11 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Jan 2016 06:11:49 +0000 (22:11 -0800)
Console.cpp
Driver.hpp
Execute.cpp
ObjectiveC/Output.cpp
Parser.ypp.in
String.hpp

index 8f8ff0a028c67f6655d434ffe8ace12213e40ac4..43012acb96712a988c6d781104e4eeac20a803c7 100644 (file)
@@ -68,6 +68,7 @@
 #include <mach/mach_time.h>
 #endif
 
+#include "Code.hpp"
 #include "Driver.hpp"
 #include "Error.hpp"
 #include "Highlight.hpp"
@@ -291,7 +292,25 @@ static CYUTF8String Run(CYPool &pool, int client, const std::string &code) {
 
 static std::ostream *out_;
 
-static void Output(CYUTF8String json, std::ostream *out, bool expand = false) {
+static void Output(CYUTF8String json, std::ostream *out, bool expand = false, bool reparse = false) {
+    CYPool pool;
+
+    if (reparse) do {
+        CYStream stream(json.data, json.data + json.size);
+        CYDriver driver(pool, stream);
+        if (driver.Parse(CYMarkExpression))
+            break;
+        std::stringbuf str;
+        CYOptions options;
+        CYOutput out(str, options);
+        out.pretty_ = true;
+        out << *driver.context_;
+        std::string data(str.str());
+        json = CYPoolUTF8String(pool, data);
+        if (json.size == 0)
+            json.data = NULL;
+    } while (false);
+
     const char *data(json.data);
     size_t size(json.size);
 
@@ -607,9 +626,9 @@ static void CYConsolePrepTerm(int meta) {
     CYConsoleRemapKeys(vi_movement_keymap);
 }
 
-static void CYOutputRun(const std::string &code, bool expand = false) {
+static void CYOutputRun(const std::string &code, bool expand = false, bool reparse = false) {
     CYPool pool;
-    Output(Run(pool, client_, code), &std::cout, expand);
+    Output(Run(pool, client_, code), &std::cout, expand, reparse);
 }
 
 static void Console(CYOptions &options) {
@@ -641,6 +660,7 @@ static void Console(CYOptions &options) {
     bool debug(false);
     bool expand(false);
     bool lower(true);
+    bool reparse(false);
 
     out_ = &std::cout;
 
@@ -712,6 +732,9 @@ static void Console(CYOptions &options) {
             } else if (data == "lower") {
                 lower = !lower;
                 *out_ << "lower == " << (lower ? "true" : "false") << std::endl;
+            } else if (data == "reparse") {
+                reparse = !reparse;
+                *out_ << "reparse == " << (reparse ? "true" : "false") << std::endl;
             }
 
             continue;
@@ -775,7 +798,7 @@ static void Console(CYOptions &options) {
             std::cout << std::endl;
         }
 
-        CYOutputRun(code, expand);
+        CYOutputRun(code, expand, reparse);
     }
 }
 
index 07188ce3c5c22d43b96af6235f9ab843c5604d63..b4f1c1bd4e324c36f4d3640b2d5a23a2bb798637 100644 (file)
@@ -41,6 +41,7 @@ struct CYWord;
 enum CYMark {
     CYMarkScript,
     CYMarkModule,
+    CYMarkExpression,
 };
 
 class _visible CYDriver {
index 527d2cc39786974828502ca34055ff4964327551..5dbdd58fc66f712c3dd7747818990110c20d5264 100644 (file)
@@ -148,6 +148,14 @@ const char *CYPoolCString(CYPool &pool, CYUTF8String utf8) {
     return pool.strndup(utf8.data, utf8.size);
 }
 
+CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF8String utf8) {
+    return {pool.strndup(utf8.data, utf8.size), utf8.size};
+}
+
+_visible CYUTF8String CYPoolUTF8String(CYPool &pool, const std::string &value) {
+    return {pool.strndup(value.data(), value.size()), value.size()};
+}
+
 CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value) {
     return CYPoolUTF8String(pool, CYCastUTF16String(value));
 }
index 17a426491aed7d4addfe23cd879636408f9eeddf..e2bb0f8e618c0e8ebdab28c028234fbcad2c8239 100644 (file)
@@ -82,7 +82,46 @@ void CYObjCArray::Output(CYOutput &out, CYFlags flags) const {
 }
 
 void CYObjCDictionary::Output(CYOutput &out, CYFlags flags) const {
-    out << '@' << '{' << '}';
+    unsigned count(0);
+    CYForEach (pair, pairs_)
+        ++count;
+    bool large(count > 8);
+
+    out << '@' << '{';
+    if (large) {
+        out << '\n';
+        ++out.indent_;
+    }
+
+    bool comma(false);
+    CYForEach (pair, pairs_) {
+        if (!comma)
+            comma = true;
+        else {
+            out << ',';
+            if (large)
+                out << '\n';
+            else
+                out << ' ';
+        }
+
+        if (large)
+            out << '\t';
+
+        pair->key_->Output(out, CYAssign::Precedence_, CYNoFlags);
+        out << ':' << ' ';
+        pair->value_->Output(out, CYAssign::Precedence_, CYNoFlags);
+    }
+
+    if (large && out.pretty_)
+        out << ',';
+
+    if (large) {
+        out << '\n';
+        --out.indent_;
+    }
+
+    out << '\t' << '}';
 }
 
 void CYObjCBlock::Output(CYOutput &out, CYFlags flags) const {
@@ -101,7 +140,7 @@ void CYObjCBlock::Output(CYOutput &out, CYFlags flags) const {
     ++out.indent_;
     out << code_;
     --out.indent_;
-    out << '\n' << '}';
+    out << '\t' << '}';
 }
 
 void CYProtocol::Output(CYOutput &out) const {
index 4b7751d6576bf4ac85cc3431b9482dc00ad9a5a6..c3f23797946eeb9b37675bdb9af5b437b2a7112d 100644 (file)
@@ -228,6 +228,9 @@ type; })
         case CYMarkModule:
             driver.hold_ = yytranslate_(token::MarkModule);
             break;
+        case CYMarkExpression:
+            driver.hold_ = yytranslate_(token::MarkExpression);
+            break;
     }
 };
 
@@ -768,12 +771,14 @@ type; })
 %start Program
 %token MarkModule
 %token MarkScript
+%token MarkExpression
 
 %%
 
 Program
     : MarkScript Script
     | MarkModule Module
+    | MarkExpression Expression[expression] { driver.context_ = $expression; }
     ;
 
 /* Lexer State {{{ */
index 75e659c6339db7c446ff80fc56c4c45797bea0eb..fe33fcbbfa410ba3e4fa8dc3f25d585bfe76b256 100644 (file)
@@ -88,6 +88,9 @@ bool CYGetOffset(const char *value, ssize_t &index);
 bool CYStartsWith(const CYUTF8String &haystack, const CYUTF8String &needle);
 
 const char *CYPoolCString(CYPool &pool, CYUTF8String utf8);
+CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF8String utf8);
+CYUTF8String CYPoolUTF8String(CYPool &pool, const std::string &value);
+
 CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF16String utf16);
 CYUTF16String CYPoolUTF16String(CYPool &pool, CYUTF8String utf8);