/*
         * ; SEMANTIC: validar que el constructor no tenga tipo de retorno
         * class-member-declaration-options:
         | optional-modifier type-or-void identifier field-or-method-or-constructor */
        private void class_member_declaration_options(ref ClassTypeNode currentClassType, EncapsulationNode encapsulation)
        {
            printIfDebug("class_member_declaration_options");
            if (pass(optionalModifiersOptions)) //Field or Method
            {
                Token optionalModifierToken = token;
                var   methodModifier        = new MethodModifierNode(optionalModifierToken);
                consumeToken();
                if (!pass(typesOptions, voidOption))
                {
                    throwError("type-or-void expected");
                }
                var type = type_or_void();
                if (!pass(TokenType.ID))
                {
                    throwError("identifier expected");
                }
                if (optionalModifierToken.type == TokenType.RW_STATIC) //Field
                {
                    field_or_method_declaration(ref currentClassType, type, encapsulation, methodModifier);
                }
                else   //Method
                {
                    var Identifier            = new IdNode(token.lexeme, token);
                    var identifierMethodToken = token;
                    consumeToken();
                    var methodDeclared = method_declaration(Identifier, type, identifierMethodToken);
                    methodDeclared.setModifier(methodModifier);
                    methodDeclared.setEncapsulation(encapsulation);
                    currentClassType.addMethod(methodDeclared);
                }
            }
            else if (pass(typesOptions, voidOption)) //Field, Method or constructor
            {
                Token oldToken = token;
                var   type     = type_or_void();

                if (oldToken.type == TokenType.ID) //Field, Method or constructor
                {
                    if (pass(TokenType.ID))        //Field or Method
                    {
                        field_or_method_declaration(ref currentClassType, type, encapsulation, null);
                    }
                    else if (pass(TokenType.PUNT_PAREN_OPEN)) //Contructor
                    {
                        var Identifier             = new IdNode(oldToken.lexeme, token);
                        var contructoreDeclaration = constructor_declaration(Identifier);
                        contructoreDeclaration.setEncapsulation(encapsulation);
                        currentClassType.addContructor(contructoreDeclaration);
                    }
                }
                else  //Field or Method
                {
                    if (!pass(TokenType.ID))
                    {
                        throwError("identifier expected");
                    }
                    field_or_method_declaration(ref currentClassType, type, encapsulation, null);
                }
            }
            // else //Contructor
            // {
            //     constructor_declaration();
            // }
        }