/**
         * Creates a class field Foo::$bar
         */
        public override Expr createClassConst(QuercusParser parser, Expr name)
        {
            ExprFactory factory = parser.getExprFactory();

            string className        = _var;
            string specialClassName = getSpecialClassName();

            if ("self".equals(specialClassName))
            {
                className = parser.getSelfClassName();

                return(factory.createClassConst(className, name));
            }
            else if ("parent".equals(specialClassName))
            {
                className = parser.getParentClassName();

                return(factory.createClassConst(className, name));
            }
            else if ("static".equals(specialClassName))
            {
                return(factory.createClassVirtualConst(name));
            }
            else
            {
                return(factory.createClassConst(className, name));
            }
        }
        //
        // expression creation
        //

        /**
         * Creates a class field Foo::bar
         */
        public override Expr createClassConst(QuercusParser parser, StringValue name)
        {
            ExprFactory factory = parser.getExprFactory();

            string className        = _var;
            string specialClassName = getSpecialClassName();

            if ("self".equals(specialClassName))
            {
                className = parser.getSelfClassName();

                return(factory.createClassConst(className, name));
            }
            else if ("parent".equals(specialClassName))
            {
                className = parser.getParentClassName();

                if (className != null)
                {
                    return(factory.createClassConst(className, name));
                }
                else
                {
                    // trait's parent @is not known at parse time
                    return(factory.createTraitParentClassConst(parser.getClassName(), name));
                }
            }
            else if ("static".equals(specialClassName))
            {
                return(factory.createClassVirtualConst(name));
            }
            else
            {
                return(factory.createClassConst(className, name));
            }
        }
        /**
         * Creates a class field $class::foo
         */
        public Expr createClassConst(QuercusParser parser, Expr name)
        {
            ExprFactory factory = parser.getExprFactory();

            return(factory.createClassConst(this, name));
        }