]> git.saurik.com Git - cycript.git/blobdiff - Output.cpp
Allow users to tab complete struct and enum names.
[cycript.git] / Output.cpp
index 0bc11727f29c47ed99bc86ce772bc51c2357d1b7..155230481932471c7f99e0fde65cd84e6d68c516 100644 (file)
@@ -457,11 +457,15 @@ void CYExtend::Output(CYOutput &out, CYFlags flags) const {
     out << ' ' << object_;
 }
 
-void CYExternal::Output(CYOutput &out, CYFlags flags) const {
+void CYExternalDefinition::Output(CYOutput &out, CYFlags flags) const {
     out << "extern" << ' ' << abi_ << ' ' << typed_;
     out.Terminate();
 }
 
+void CYExternalExpression::Output(CYOutput &out, CYFlags flags) const {
+    out << '(' << "extern" << ' ' << abi_ << ' ' << typed_ << ')';
+}
+
 void CYFatArrow::Output(CYOutput &out, CYFlags flags) const {
     out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << '{' << code_ << '}';
 }
@@ -724,7 +728,7 @@ void CYTypeModifier::Output(CYOutput &out, int precedence, CYIdentifier *identif
 }
 
 void CYTypedIdentifier::Output(CYOutput &out) const {
-    specifier_->Output(out);
+    out << *specifier_;
     modifier_->Output(out, 0, identifier_, true);
 }
 
@@ -1063,10 +1067,49 @@ void CYTypeCharacter::Output(CYOutput &out) const {
     out << "char";
 }
 
+void CYTypeEnum::Output(CYOutput &out) const {
+    out << "enum" << ' ';
+    if (name_ != NULL)
+        out << *name_;
+    else {
+        if (specifier_ != NULL)
+            out << ':' << ' ' << *specifier_ << ' ';
+
+        out << '{' << '\n';
+        ++out.indent_;
+        bool comma(false);
+
+        CYForEach (constant, constants_) {
+            if (comma)
+                out << ',' << '\n';
+            else
+                comma = true;
+            out << '\t' << constant->name_;
+            out << ' ' << '=' << ' ' << constant->value_;
+        }
+
+        if (out.pretty_)
+            out << ',';
+        out << '\n';
+        --out.indent_;
+        out << '\t' << '}';
+    }
+}
+
 void CYTypeError::Output(CYOutput &out) const {
     out << "@error";
 }
 
+void CYTypeInt128::Output(CYOutput &out) const {
+    switch (signing_) {
+        case CYTypeNeutral: break;
+        case CYTypeSigned: out << "signed" << ' '; break;
+        case CYTypeUnsigned: out << "unsigned" << ' '; break;
+    }
+
+    out << "__int128";
+}
+
 void CYTypeIntegral::Output(CYOutput &out) const {
     if (signing_ == CYTypeUnsigned)
         out << "unsigned" << ' ';
@@ -1088,7 +1131,13 @@ void CYTypeStruct::Output(CYOutput &out) const {
 }
 
 void CYTypeReference::Output(CYOutput &out) const {
-    out << "struct" << ' ' << *name_;
+    switch (kind_) {
+        case CYTypeReferenceStruct: out << "struct"; break;
+        case CYTypeReferenceEnum: out << "enum"; break;
+        default: _assert(false);
+    }
+
+    out << ' ' << *name_;
 }
 
 void CYTypeVariable::Output(CYOutput &out) const {