+CYTarget *CYTypeError::Replace(CYContext &context) {
+ _assert(false);
+ return NULL;
+}
+
+CYTarget *CYTypeExpression::Replace(CYContext &context) {
+ return typed_->Replace(context);
+}
+
+CYTarget *CYTypeFloating::Replace(CYContext &context) {
+ switch (length_) {
+ case 0: return $V("float");
+ case 1: return $V("double");
+ case 2: return $V("longdouble");
+ default: _assert(false);
+ }
+}
+
+CYTarget *CYTypeInt128::Replace(CYContext &context) {
+ return $V(signing_ == CYTypeUnsigned ? "uint128" : "int128");
+}
+
+CYTarget *CYTypeIntegral::Replace(CYContext &context) {
+ bool u(signing_ == CYTypeUnsigned);
+ switch (length_) {
+ case 0: return $V(u ? "ushort" : "short");
+ case 1: return $V(u ? "uint" : "int");
+ case 2: return $V(u ? "ulong" : "long");
+ case 3: return $V(u ? "ulonglong" : "longlong");
+ default: _assert(false);
+ }
+}
+
+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));