# Abstract class Template( TextInterpolation(PhpOpen), ClassDeclaration(abstract, class, Name, DeclarationList( MethodDeclaration(Visibility, function, Name, ParamList, Block ), MethodDeclaration(abstract, Visibility, function, Name, ParamList ) ) ) ) # Anonymous classes Template( TextInterpolation(PhpOpen), ExpressionStatement( NewExpression(new, class, DeclarationList( MethodDeclaration(Visibility, function, Name, ParamList, Block ) ) ) ), ExpressionStatement( NewExpression(new, class, BaseClause(extends, Name), ClassInterfaceClause(implements, Name, Name), DeclarationList ) ), ExpressionStatement( NewExpression(new, class, ArgList, DeclarationList( PropertyDeclaration( Visibility, VariableDeclarator( VariableName ) ) ) ) ), ExpressionStatement( NewExpression(new, class, ArgList(VariableName, VariableName), BaseClause(extends, Name), DeclarationList( UseDeclaration(use, Name ) ) ) ), ClassDeclaration(class, Name, DeclarationList( MethodDeclaration(Visibility, function, Name, ParamList, Block( ReturnStatement(return, NewExpression(new, class, ArgList(VariableName), BaseClause(extends, Name), DeclarationList( ConstDeclaration(const, VariableDeclarator(Name, AssignOp, String) ) ) ) ) ) ) ) ) ) # Conditional class definition Template( TextInterpolation(PhpOpen), IfStatement(if, ParenthesizedExpression(Boolean), Block( ClassDeclaration(class, Name, DeclarationList ) ) ) ) # Class constant modifiers Template( TextInterpolation(PhpOpen), ClassDeclaration(class, Name, DeclarationList( ConstDeclaration(const, VariableDeclarator(Name, AssignOp, Integer) ), ConstDeclaration(Visibility, const, VariableDeclarator(Name, AssignOp, Integer) ), ConstDeclaration(Visibility, const, VariableDeclarator(Name, AssignOp, Integer) ), ConstDeclaration(Visibility, const, VariableDeclarator(Name, AssignOp, Integer) ), ConstDeclaration(final, const, VariableDeclarator(Name, AssignOp, Integer) ) ) ) ) # Final class Template( TextInterpolation(PhpOpen), ClassDeclaration(final, class, Name, DeclarationList ) ) # Implicitly public properties and methods Template( TextInterpolation(PhpOpen), ClassDeclaration(abstract, class, Name, DeclarationList( PropertyDeclaration( var, VariableDeclarator(VariableName) ), PropertyDeclaration( static, VariableDeclarator(VariableName) ), MethodDeclaration(abstract, function, Name, ParamList ), MethodDeclaration(final, function, Name, ParamList, Block ), MethodDeclaration(static, function, Name, ParamList, Block ), MethodDeclaration(final, static, function, Name, ParamList, Block ), MethodDeclaration(function, Name, ParamList, Block ) ) ) ) # Property Types Template( TextInterpolation(PhpOpen), ClassDeclaration(class, Name, DeclarationList( PropertyDeclaration( Visibility, NamedType(Name), VariableDeclarator(VariableName) ), PropertyDeclaration( Visibility, static, NamedType(Name), VariableDeclarator(VariableName) ), PropertyDeclaration( Visibility, OptionalType(LogicOp, NamedType(Name)), VariableDeclarator(VariableName) ), PropertyDeclaration( Visibility, VariableDeclarator(VariableName) ) ) ) ) # Constructor Property Promotion Template( TextInterpolation(PhpOpen), ClassDeclaration(class, Name, DeclarationList( MethodDeclaration(Visibility, function, Name, ParamList( PropertyParameter( Visibility, NamedType(Name), VariableName, AssignOp, Float ), Parameter( NamedType(Name), VariableName, AssignOp, Float ), PropertyParameter( Visibility, NamedType(Name), VariableName, AssignOp, Float ) ), Block ) ) ) ) # Class constant Template( TextInterpolation(PhpOpen), ExpressionStatement( ScopedExpression( Name, ClassMemberName(Name) ), ";" ) )