]> git.saurik.com Git - cycript.git/commitdiff
Update @import syntax to desugar into require().
authorJay Freeman (saurik) <saurik@saurik.com>
Wed, 15 Jan 2014 03:44:49 +0000 (19:44 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Wed, 15 Jan 2014 03:44:49 +0000 (19:44 -0800)
Cycript.yy.in
ObjectiveC/Output.cpp
ObjectiveC/Replace.cpp
ObjectiveC/Syntax.hpp

index 8593f2613080664cdffe89e398cc10e993a15a33..89ed1a9d0577d2f26e4040147d5ab62c4d1c94fe 100644 (file)
@@ -72,6 +72,7 @@ typedef struct {
         CYInfix *infix_;
         CYLiteral *literal_;
         CYMember *member_;
         CYInfix *infix_;
         CYLiteral *literal_;
         CYMember *member_;
+        CYModule *module_;
         CYNull *null_;
         CYNumber *number_;
         CYProgram *program_;
         CYNull *null_;
         CYNumber *number_;
         CYProgram *program_;
@@ -491,6 +492,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <messageParameter_> MessageParameterListOpt
 %type <bool_> MessageScope
 %type <typedIdentifier_> ModifiedType
 %type <messageParameter_> MessageParameterListOpt
 %type <bool_> MessageScope
 %type <typedIdentifier_> ModifiedType
+%type <module_> Module
 %type <typedIdentifier_> PrefixedType
 %type <expression_> PrimitiveType
 %type <argument_> SelectorCall_
 %type <typedIdentifier_> PrefixedType
 %type <expression_> PrimitiveType
 %type <argument_> SelectorCall_
@@ -1580,20 +1582,13 @@ PrimaryExpression
     ;
 /* }}} */
 /* Cycript (Objective-C): @import Directive {{{ */
     ;
 /* }}} */
 /* Cycript (Objective-C): @import Directive {{{ */
-PathName
-    : "/" PathName
-    | "." PathName
-    | Word PathName
-    |
-    ;
-
-ImportPath
-    : "<" PathName ">"
-    | StringLiteral
+Module
+    : Module "." Word { $$ = CYNew CYModule($3, $1); }
+    | Word { $$ = CYNew CYModule($1); }
     ;
 
     ;
 
-StatementListItem
-    : LexSetStatement LexSetRegExp "@import" ImportPath { $$ = CYNew CYImport(); }
+Declaration__
+    : "@import" Module { $$ = CYNew CYImport($2); }
     ;
 /* }}} */
 /* Cycript (Objective-C): Boxed Expressions {{{ */
     ;
 /* }}} */
 /* Cycript (Objective-C): Boxed Expressions {{{ */
index fd2a8d81747e824285e8d60b4903c76d0584dadf..6fd2229abbe28b64f3bbbe296f4c1c681a8d0a42 100644 (file)
@@ -94,6 +94,12 @@ void CYMessage::Output(CYOutput &out, bool replace) const {
     out << code_;
 }
 
     out << code_;
 }
 
+void CYModule::Output(CYOutput &out) const {
+    out << part_;
+    if (next_ != NULL)
+        out << '.' << next_;
+}
+
 void CYBox::Output(CYOutput &out, CYFlags flags) const {
     out << '@';
     value_->Output(out, Precedence(), CYRight(flags));
 void CYBox::Output(CYOutput &out, CYFlags flags) const {
     out << '@';
     value_->Output(out, Precedence(), CYRight(flags));
index e7d687f7c70cbaf15b30f8b586998e3ae8f3ffed..ec2411b3787c23d4da6914089f34a3adab0583f4 100644 (file)
@@ -93,7 +93,7 @@ CYStatement *CYField::Replace(CYContext &context) const { $T(NULL)
 }
 
 CYStatement *CYImport::Replace(CYContext &context) {
 }
 
 CYStatement *CYImport::Replace(CYContext &context) {
-    return this;
+    return $ CYVar($L1($L(module_->part_->Word(), $C1($V("require"), module_->Replace(context, "/")))));
 }
 
 CYStatement *CYMessage::Replace(CYContext &context, bool replace) const { $T(NULL)
 }
 
 CYStatement *CYMessage::Replace(CYContext &context, bool replace) const { $T(NULL)
@@ -142,6 +142,12 @@ CYExpression *CYMessageParameter::TypeSignature(CYContext &context) const {
     return MessageType(context, type_, next_);
 }
 
     return MessageType(context, type_, next_);
 }
 
+CYString *CYModule::Replace(CYContext &context, const char *separator) const {
+    if (next_ == NULL)
+        return $ CYString(part_);
+    return $ CYString($pool.strcat(next_->Replace(context, separator)->Value(), separator, part_->Word(), NULL));
+}
+
 CYExpression *CYBox::Replace(CYContext &context) {
     return $C1($M($V("Instance"), $S("box")), value_);
 }
 CYExpression *CYBox::Replace(CYContext &context) {
     return $C1($M($V("Instance"), $S("box")), value_);
 }
index 618a25e87659e9bf7e574eb228449e9b2ac99b13..8fa10ee6687f0a3b61ae271fc6dbc8fb650c48a0 100644 (file)
@@ -169,9 +169,32 @@ struct CYProtocol :
     void Output(CYOutput &out) const;
 };
 
     void Output(CYOutput &out) const;
 };
 
+struct CYModule :
+    CYNext<CYModule>,
+    CYThing
+{
+    CYWord *part_;
+
+    CYModule(CYWord *part, CYModule *next = NULL) :
+        CYNext<CYModule>(next),
+        part_(part)
+    {
+    }
+
+    CYString *Replace(CYContext &context, const char *separator) const;
+    void Output(CYOutput &out) const;
+};
+
 struct CYImport :
     CYStatement
 {
 struct CYImport :
     CYStatement
 {
+    CYModule *module_;
+
+    CYImport(CYModule *module) :
+        module_(module)
+    {
+    }
+
     virtual CYStatement *Replace(CYContext &context);
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
     virtual CYStatement *Replace(CYContext &context);
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };