#include <sstream>
+static CYExpression *MessageType(CYContext &context, CYExpression *type, CYMessageParameter *next, CYExpression *extra = NULL) {
+ if (type == NULL)
+ return NULL;
+
+ CYExpression *left($C0($M(type, $S("toString"))));
+ if (extra != NULL)
+ left = $ CYAdd(left, extra);
+
+ if (next == NULL)
+ return left;
+
+ CYExpression *right(next->TypeSignature(context));
+ if (right == NULL)
+ return NULL;
+
+ return $ CYAdd(left, right);
+}
+
CYStatement *CYCategory::Replace(CYContext &context) {
CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
CYVariable *self($V("self"));
CYVariable *_class($V(instance_ ? "$cys" : "$cyp"));
+ CYExpression *type(TypeSignature(context) ?: $C1($M(cyn, $S("type")), _class));
+
return $ CYBlock($$->*
next_->Replace(context, replace)->*
$E($ CYAssign(cyn, parameters_->Selector(context)))->*
- $E($ CYAssign(cyt, $C1($M(cyn, $S("type")), _class)))->*
+ $E($ CYAssign(cyt, type))->*
$E($C4($V(replace ? "class_replaceMethod" : "class_addMethod"),
$V(instance_ ? "$cyc" : "$cym"),
cyn,
);
}
+CYExpression *CYMessage::TypeSignature(CYContext &context) const {
+ return MessageType(context, type_, parameters_, $S("@:"));
+}
+
CYFunctionParameter *CYMessageParameter::Parameters(CYContext &context) const { $T(NULL)
CYFunctionParameter *next(next_->Parameters(context));
return name_ == NULL ? next : $ CYFunctionParameter($ CYDeclaration(name_), next);
return tag_ == NULL ? next : $ CYSelectorPart(tag_, name_ != NULL, next);
}
+CYExpression *CYMessageParameter::TypeSignature(CYContext &context) const {
+ return MessageType(context, type_, next_);
+}
+
CYExpression *CYBox::Replace(CYContext &context) {
return $C1($M($V("Instance"), $S("box")), value_);
}
CYFunctionParameter *Parameters(CYContext &context) const;
CYSelector *Selector(CYContext &context) const;
CYSelectorPart *SelectorPart(CYContext &context) const;
+ CYExpression *TypeSignature(CYContext &context) const;
};
struct CYMessage :
CYStatement *Replace(CYContext &context, bool replace) const;
void Output(CYOutput &out, bool replace) const;
+
+ CYExpression *TypeSignature(CYContext &context) const;
};
struct CYProtocol :