**/
/* }}} */
+#include <sstream>
+
#include "Replace.hpp"
-#include "ObjectiveC/Syntax.hpp"
-#include <sstream>
+#include "ObjectiveC/Syntax.hpp"
static CYExpression *MessageType(CYContext &context, CYTypedIdentifier *type, CYMessageParameter *next, CYExpression *extra = NULL) {
CYExpression *left($C0($M(type->Replace(context), $S("toString"))));
CYStatement *CYCategory::Replace(CYContext &context) {
CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
- return $E($C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
+ return $E($C1($F(NULL, $P6($B($I("$cys")), $B($I("$cyp")), $B($I("$cyc")), $B($I("$cyn")), $B($I("$cyt")), $B($I("$cym"))), $$->*
$E($ CYAssign($V("$cyp"), $C1($V("object_getClass"), cys)))->*
$E($ CYAssign(cyc, cys))->*
$E($ CYAssign($V("$cym"), $C1($V("object_getClass"), cyc)))->*
messages_->Replace(context, true)
- ), name_->ClassName(context, true)));
+ ), $C1($V("objc_getClass"), $S(name_))));
}
-CYExpression *CYClass::Replace_(CYContext &context) {
+CYStatement *CYImplementation::Replace(CYContext &context) {
CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
- CYExpression *name(name_ != NULL ? name_->ClassName(context, false) : $C1($V("$cyq"), $S("CY$")));
-
- return $C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
+ return $E($C1($F(NULL, $P6($B($I("$cys")), $B($I("$cyp")), $B($I("$cyc")), $B($I("$cyn")), $B($I("$cyt")), $B($I("$cym"))), $$->*
$E($ CYAssign($V("$cyp"), $C1($V("object_getClass"), cys)))->*
- $E($ CYAssign(cyc, $C3($V("objc_allocateClassPair"), cys, name, $D(0))))->*
+ $E($ CYAssign(cyc, $C3($V("objc_allocateClassPair"), cys, $S(name_), $D(0))))->*
$E($ CYAssign($V("$cym"), $C1($V("object_getClass"), cyc)))->*
protocols_->Replace(context)->*
fields_->Replace(context)->*
messages_->Replace(context, false)->*
$E($C1($V("objc_registerClassPair"), cyc))->*
$ CYReturn(cyc)
- ), super_ == NULL ? $ CYNull() : super_);
-}
-
-CYExpression *CYClassExpression::Replace(CYContext &context) {
- return Replace_(context);
+ ), extends_ == NULL ? $ CYNull() : extends_));
}
-CYStatement *CYClassStatement::Replace(CYContext &context) {
- return $E(Replace_(context));
-}
-
-CYStatement *CYClassField::Replace(CYContext &context) const { $T(NULL)
+CYStatement *CYImplementationField::Replace(CYContext &context) const { $T(NULL)
CYVariable *cyn($V("$cyn"));
CYVariable *cyt($V("$cyt"));
);
}
-CYExpression *CYInstanceLiteral::Replace(CYContext &context) {
+CYTarget *CYInstanceLiteral::Replace(CYContext &context) {
return $N1($V("Instance"), number_);
}
$E($C4($V(replace ? "class_replaceMethod" : "class_addMethod"),
$V(instance_ ? "$cyc" : "$cym"),
cyn,
- $N2($V("Functor"), $F(NULL, $P2($L("self"), $L("_cmd"), parameters_->Parameters(context)), $$->*
- $ CYVar($L1($L("$cyr", $N2($V("objc_super"), self, _class))))->*
+ $N2($V("Functor"), $F(NULL, $P2($B($I("self")), $B($I("_cmd")), parameters_->Parameters(context)), $$->*
+ $ CYVar($B1($B($I("$cyr"), $N2($V("objc_super"), self, _class))))->*
$ CYReturn($C1($M($F(NULL, NULL, code_.code_), $S("call")), self))
), cyt),
cyt
CYFunctionParameter *CYMessageParameter::Parameters(CYContext &context) const { $T(NULL)
CYFunctionParameter *next(next_->Parameters(context));
- return type_ == NULL ? next : $ CYFunctionParameter($ CYDeclaration(type_->identifier_), next);
+ return type_ == NULL ? next : $ CYFunctionParameter($B(type_->identifier_), next);
}
CYSelector *CYMessageParameter::Selector(CYContext &context) const {
CYSelectorPart *CYMessageParameter::SelectorPart(CYContext &context) const { $T(NULL)
CYSelectorPart *next(next_->SelectorPart(context));
- return tag_ == NULL ? next : $ CYSelectorPart(tag_, type_ != NULL, next);
+ return name_ == NULL ? next : $ CYSelectorPart(name_, type_ != NULL, next);
}
CYExpression *CYMessageParameter::TypeSignature(CYContext &context) const {
return MessageType(context, type_, next_);
}
-CYExpression *CYBox::Replace(CYContext &context) {
+CYTarget *CYBox::Replace(CYContext &context) {
return $C1($M($V("Instance"), $S("box")), value_);
}
-CYExpression *CYObjCBlock::Replace(CYContext &context) {
- return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
+CYTarget *CYObjCArray::Replace(CYContext &context) {
+ size_t count(0);
+ CYForEach (element, elements_)
+ ++count;
+ return $ CYSendDirect($V("NSArray"), $C_($ CYWord("arrayWithObjects"), $ CYArray(elements_), $C_($ CYWord("count"), $D(count))));
+}
+
+CYTarget *CYObjCDictionary::Replace(CYContext &context) {
+ CYList<CYElement> keys;
+ CYList<CYElement> values;
+ size_t count(0);
+
+ CYForEach (pair, pairs_) {
+ keys->*$ CYElementValue(pair->key_);
+ values->*$ CYElementValue(pair->value_);
+ ++count;
+ }
+
+ return $ CYSendDirect($V("NSDictionary"), $C_($ CYWord("dictionaryWithObjects"), $ CYArray(values), $C_($ CYWord("forKeys"), $ CYArray(keys), $C_($ CYWord("count"), $D(count)))));
+}
+
+CYTarget *CYObjCBlock::Replace(CYContext &context) {
+ return $C1($ CYTypeExpression(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
}
CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)
);
}
-CYExpression *CYSelector::Replace(CYContext &context) {
- return $C1($V("sel_registerName"), name_->Replace(context));
+CYTarget *CYSelector::Replace(CYContext &context) {
+ return $C1($V("sel_registerName"), parts_->Replace(context));
}
CYString *CYSelectorPart::Replace(CYContext &context) {
return $S($pool.strdup(str.str().c_str()));
}
-CYExpression *CYSendDirect::Replace(CYContext &context) {
+CYTarget *CYSendDirect::Replace(CYContext &context) {
std::ostringstream name;
CYArgument **argument(&arguments_);
CYSelectorPart *selector(NULL), *current(NULL);
return $C2($V("objc_msgSend"), self_, selector->Replace(context), arguments_);
}
-CYExpression *CYSendSuper::Replace(CYContext &context) {
+CYTarget *CYSendSuper::Replace(CYContext &context) {
return $ CYSendDirect($V("$cyr"), arguments_);
}