+struct CYPropertyMethod;
+
+struct CYMethod :
+ CYFunction,
+ CYProperty
+{
+ CYMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
+ CYFunction(parameters, code),
+ CYProperty(name, next)
+ {
+ }
+
+ virtual CYFunctionExpression *Constructor();
+
+ using CYProperty::Replace;
+ virtual void Replace(CYContext &context);
+};
+
+struct CYPropertyGetter :
+ CYMethod
+{
+ CYPropertyGetter(CYPropertyName *name, CYStatement *code, CYProperty *next = NULL) :
+ CYMethod(name, NULL, code, next)
+ {
+ }
+
+ virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYPropertySetter :
+ CYMethod
+{
+ CYPropertySetter(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
+ CYMethod(name, parameters, code, next)
+ {
+ }
+
+ virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYPropertyMethod :
+ CYMethod
+{
+ CYPropertyMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
+ CYMethod(name, parameters, code, next)
+ {
+ }
+
+ virtual CYFunctionExpression *Constructor();
+
+ virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYClassTail :
+ CYThing
+{
+ CYExpression *extends_;
+
+ CYFunctionExpression *constructor_;
+ CYList<CYProperty> instance_;
+ CYList<CYProperty> static_;
+
+ CYClassTail(CYExpression *extends) :
+ extends_(extends),
+ constructor_(NULL)
+ {
+ }
+
+ void Output(CYOutput &out) const;
+};
+
+struct CYClassExpression :
+ CYTarget
+{
+ CYIdentifier *name_;
+ CYClassTail *tail_;
+
+ CYClassExpression(CYIdentifier *name, CYClassTail *tail) :
+ name_(name),
+ tail_(tail)
+ {
+ }
+
+ CYPrecedence(0)
+
+ CYTarget *Replace(CYContext &context) override;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYClassStatement :