]> git.saurik.com Git - cycript.git/blobdiff - Syntax.hpp
Use variadic templates to better organize Classes.
[cycript.git] / Syntax.hpp
index 5599f7e27795d9d246b043e13b0b86e2f16e4584..a3f03fab47eaca021196368cdc7cd29e965986ed 100644 (file)
@@ -150,6 +150,7 @@ enum CYFlags {
     CYNoRightHand =  (1 << 5),
     CYNoDangle =     (1 << 6),
     CYNoInteger =    (1 << 7),
+    CYNoColon =      (1 << 8),
     CYNoBFC =        (CYNoBrace | CYNoFunction | CYNoClass),
 };
 
@@ -962,6 +963,22 @@ struct CYVariable :
     virtual CYFunctionParameter *Parameter() const;
 };
 
+struct CYSymbol :
+    CYTarget
+{
+    const char *name_;
+
+    CYSymbol(const char *name) :
+        name_(name)
+    {
+    }
+
+    CYPrecedence(0)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYPrefix :
     CYExpression
 {
@@ -1089,21 +1106,26 @@ struct CYClause :
 };
 
 struct CYElement :
+    CYNext<CYElement>,
     CYThing
 {
+    CYElement(CYElement *next) :
+        CYNext<CYElement>(next)
+    {
+    }
+
     virtual bool Elision() const = 0;
 
     virtual void Replace(CYContext &context) = 0;
 };
 
 struct CYElementValue :
-    CYNext<CYElement>,
     CYElement
 {
     CYExpression *value_;
 
     CYElementValue(CYExpression *value, CYElement *next = NULL) :
-        CYNext<CYElement>(next),
+        CYElement(next),
         value_(value)
     {
     }
@@ -1121,7 +1143,8 @@ struct CYElementSpread :
 {
     CYExpression *value_;
 
-    CYElementSpread(CYExpression *value) :
+    CYElementSpread(CYExpression *value, CYElement *next = NULL) :
+        CYElement(next),
         value_(value)
     {
     }
@@ -1442,6 +1465,20 @@ struct CYIndirectMember :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYResolveMember :
+    CYMember
+{
+    CYResolveMember(CYExpression *object, CYExpression *property) :
+        CYMember(object, property)
+    {
+    }
+
+    CYPrecedence(1)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 namespace cy {
 namespace Syntax {
 
@@ -2220,6 +2257,17 @@ struct CYTypedParameter :
     virtual void Output(CYOutput &out) const;
 };
 
+struct CYTypedFormal {
+    bool variadic_;
+    CYTypedParameter *parameters_;
+
+    CYTypedFormal(bool variadic) :
+        variadic_(variadic),
+        parameters_(NULL)
+    {
+    }
+};
+
 struct CYLambda :
     CYTarget
 {
@@ -2375,10 +2423,12 @@ struct CYTypeBlockWith :
 struct CYTypeFunctionWith :
     CYTypeModifier
 {
+    bool variadic_;
     CYTypedParameter *parameters_;
 
-    CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
+    CYTypeFunctionWith(bool variadic, CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
         CYTypeModifier(next),
+        variadic_(variadic),
         parameters_(parameters)
     {
     }