}
CYExpression *CYAddressOf::Replace(CYContext &context) {
- CYPrefix::Replace(context);
return $C0($M(rhs_, $S("$cya")));
}
}
CYAssignment *CYDeclaration::Assignment(CYContext &context) {
- CYExpression *variable(Replace(context));
- return initialiser_ == NULL ? NULL : $ CYAssign(variable, initialiser_);
+ if (initialiser_ == NULL)
+ return NULL;
+
+ CYAssignment *value($ CYAssign(Variable(context), initialiser_));
+ initialiser_ = NULL;
+ return value;
+}
+
+CYVariable *CYDeclaration::Variable(CYContext &context) {
+ return $V(identifier_);
}
CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) {
CYExpression *CYDeclaration::Replace(CYContext &context) {
context.Replace(identifier_);
context.scope_->Declare(context, identifier_, CYIdentifierVariable);
- return $V(identifier_);
+ return Variable(context);
+}
+
+void CYDeclarations::Replace(CYContext &context) { $T()
+ declaration_->Replace(context);
+ next_->Replace(context);
}
CYProperty *CYDeclarations::Property(CYContext &context) { $T(NULL)
return $ CYProperty(declaration_->identifier_, declaration_->initialiser_ ?: $U, next_->Property(context));
}
-CYCompound *CYDeclarations::Replace(CYContext &context) {
- CYCompound *compound(next_ == NULL ? $ CYCompound() : next_->Replace(context));
+CYFunctionParameter *CYDeclarations::Parameter(CYContext &context) { $T(NULL)
+ return $ CYFunctionParameter(declaration_->identifier_, next_->Parameter(context));
+}
+
+CYArgument *CYDeclarations::Argument(CYContext &context) { $T(NULL)
+ return $ CYArgument(declaration_->initialiser_ ?: $U, next_->Argument(context));
+}
+
+CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL)
+ CYCompound *compound(next_->Compound(context) ?: $ CYCompound());
if (CYAssignment *assignment = declaration_->Assignment(context))
compound->AddPrev(assignment);
return compound;
}
CYExpression *CYDirectMember::Replace(CYContext &context) {
- Replace_(context);
+ context.Replace(object_);
+ context.Replace(property_);
return this;
}
return this;
}
+CYCompound *CYForDeclarations::Replace(CYContext &context) {
+ declarations_->Replace(context);
+ return declarations_->Compound(context);
+}
+
+// XXX: this still feels highly suboptimal
CYStatement *CYForIn::Replace(CYContext &context) {
- CYAssignment *assignment(initialiser_->Assignment(context));
+ if (CYAssignment *assignment = initialiser_->Assignment(context))
+ return $ CYBlock($$->*
+ $E(assignment)->*
+ this
+ );
context.Replace(initialiser_);
context.Replace(set_);
context.Replace(code_);
-
- if (assignment == NULL)
- return this;
-
- return $ CYBlock($$->*
- $E(assignment)->*
- this
- );
+ return this;
}
CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const {
}
CYExpression *CYIndirect::Replace(CYContext &context) {
- CYPrefix::Replace(context);
return $M(rhs_, $S("$cyi"));
}
CYExpression *CYIndirectMember::Replace(CYContext &context) {
- Replace_(context);
return $M($ CYIndirect(object_), property_);
}
}
CYStatement *CYLet::Replace(CYContext &context) {
- return $ CYWith($ CYObject(declarations_->Property(context)), &code_);
-}
-
-void CYMember::Replace_(CYContext &context) {
- context.Replace(object_);
- context.Replace(property_);
+ return $E($ CYCall($ CYFunctionExpression(NULL, declarations_->Parameter(context), code_), declarations_->Argument(context)));
}
namespace cy {
} }
CYStatement *CYVar::Replace(CYContext &context) {
- return $E(declarations_->Replace(context));
+ declarations_->Replace(context);
+ return $E(declarations_->Compound(context));
}
CYExpression *CYVariable::Replace(CYContext &context) {