+CYTarget *CYTypeModifier::Replace(CYContext &context, CYTarget *type) { $T(type)
+ return Replace_(context, type);
+}
+
+CYTarget *CYTypeFunctionWith::Replace_(CYContext &context, CYTarget *type) {
+ CYList<CYArgument> arguments(parameters_->Argument(context));
+ if (variadic_)
+ arguments->*$C_($ CYNull());
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("functionWith")), arguments));
+}
+
+CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) {
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("pointerTo"))));
+}
+
+CYTarget *CYTypeReference::Replace(CYContext &context) {
+ const char *prefix;
+ switch (kind_) {
+ case CYTypeReferenceStruct: prefix = "$cys"; break;
+ case CYTypeReferenceEnum: prefix = "$cye"; break;
+ default: _assert(false);
+ }
+
+ return $V($pool.strcat(prefix, name_->Word(), NULL));
+}
+
+CYTarget *CYTypeStruct::Replace(CYContext &context) {
+ CYTarget *target(tail_->Replace(context));
+ if (name_ != NULL)
+ target = $C1($M(target, $S("withName")), $S(name_->Word()));
+ return target;
+}
+
+CYTarget *CYTypeVariable::Replace(CYContext &context) {
+ return $V(name_);
+}
+
+CYTarget *CYTypeVoid::Replace(CYContext &context) {
+ return $N1($V("Type"), $ CYString("v"));
+}
+
+CYTarget *CYTypeVolatile::Replace_(CYContext &context, CYTarget *type) {
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("volatile"))));
+}
+
+CYTarget *CYType::Replace(CYContext &context) {
+ return modifier_->Replace(context, specifier_->Replace(context));
+}
+
+CYTypeFunctionWith *CYType::Function() {
+ CYTypeModifier *&modifier(CYGetLast(modifier_));
+ if (modifier == NULL)
+ return NULL;
+
+ CYTypeFunctionWith *function(modifier->Function());
+ if (function == NULL)
+ return NULL;
+
+ modifier = NULL;
+ return function;
+}
+
+CYArgument *CYTypedParameter::Argument(CYContext &context) { $T(NULL)
+ return $ CYArgument(type_->Replace(context), next_->Argument(context));
+}
+
+CYFunctionParameter *CYTypedParameter::Parameters(CYContext &context) { $T(NULL)
+ return $ CYFunctionParameter($ CYBinding(name_ ?: context.Unique()), next_->Parameters(context));
+}
+
+CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *prefix) { $T(prefix)
+ return next_->TypeSignature(context, $ CYAdd(prefix, type_->Replace(context)));
+}
+
+CYForInitializer *CYVar::Replace(CYContext &context) {
+ if (CYExpression *expression = bindings_->Replace(context, CYIdentifierVariable))
+ return $E(expression);
+ return $ CYEmpty();
+}
+
+CYTarget *CYVariable::Replace(CYContext &context) {
+ name_ = name_->Replace(context, CYIdentifierGlobal);