+CYTarget *CYTypeArrayOf::Replace_(CYContext &context, CYTarget *type) {
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("arrayOf")), $ CYArgument(size_)));
+}
+
+CYTarget *CYTypeBlockWith::Replace_(CYContext &context, CYTarget *type) {
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("blockWith")), parameters_->Argument(context)));
+}
+
+CYTarget *CYTypeCharacter::Replace(CYContext &context) {
+ switch (signing_) {
+ case CYTypeNeutral: return $V("char");
+ case CYTypeSigned: return $V("schar");
+ case CYTypeUnsigned: return $V("uchar");
+ default: _assert(false);
+ }
+}
+
+CYTarget *CYTypeConstant::Replace_(CYContext &context, CYTarget *type) {
+ return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("constant"))));
+}
+
+CYStatement *CYTypeDefinition::Replace(CYContext &context) {
+ return $ CYLexical(false, $B1($B(name_, $ CYTypeExpression(type_))));
+}
+
+CYTarget *CYTypeEnum::Replace(CYContext &context) {
+ CYList<CYProperty> properties;
+ CYForEach (constant, constants_)
+ properties->*$ CYPropertyValue($S(constant->name_->Word()), constant->value_);
+ CYObject *constants($ CYObject(properties));
+
+ if (specifier_ == NULL)
+ return $N1($V("Type"), constants);
+ else
+ return $C1($M(specifier_->Replace(context), $S("enumFor")), constants);
+}
+
+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));