public override object VisitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
        {
            string    memberName = context.FieldName.Name.Text;
            bool      isStatic   = context.STATIC() != null;
            ClepsType memberType = Visit(context.typename()) as ClepsType;

            var oldMemberName     = CurrMemberName;
            var oldMemberIsStatic = CurrMemberIsStatic;
            var oldMemberType     = CurrMemberType;

            CurrMemberName     = memberName;
            CurrMemberIsStatic = isStatic;
            CurrMemberType     = memberType;

            if (context.rightHandExpression() != null)
            {
                Visit(context.rightHandExpression());
            }

            CurrMemberName     = oldMemberName;
            CurrMemberIsStatic = oldMemberIsStatic;
            CurrMemberType     = oldMemberType;

            return(true);
        }
        public override object VisitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
        {
            string memberName = context.FieldName.Name.Text;

            ClepsClassBuilder classBuilder = ClassManager.GetClassBuilder(FullyQualifiedClassName);

            if (classBuilder == null)
            {
                //This is probably because of some earlier error. Return gracefully
                return(false);
            }

            if (classBuilder.DoesClassContainMember(memberName))
            {
                string errorMessage = String.Format("Class {0} has multiple definitions of member {1}", FullyQualifiedClassName, memberName);
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage));
                //Don't process this member
                return(false);
            }

            bool      isStatic   = context.STATIC() != null;
            ClepsType memberType = Visit(context.typename()) as ClepsType;

            if (memberType.IsFunctionType)
            {
                CodeGenerator.CreateMethod(FullyQualifiedClassName, isStatic, memberType, memberName);
            }

            classBuilder.AddNewMember(isStatic, memberType, memberName);
            return(true);
        }
Пример #3
0
        public override object VisitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
        {
            string memberName;

            if (context.OPERATOR() == null)
            {
                memberName = context.FieldName.Name.Text;
            }
            else
            {
                memberName = context.OperatorName.GetText();
            }

            ClepsClassBuilder classBuilder = ClassManager.GetClassBuilder(FullyQualifiedClassName);

            if (classBuilder == null)
            {
                //This is probably because of some earlier error. Return gracefully
                return(false);
            }

            bool      isStatic   = context.STATIC() != null;
            ClepsType memberType = Visit(context.typename()) as ClepsType;

            string cantAddReason;

            if (!classBuilder.CanAddMemberToClass(memberName, memberType, isStatic, out cantAddReason))
            {
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, cantAddReason));
                //Don't process this member
                return(false);
            }

            bool isConst = context.CONST() != null;

            classBuilder.AddNewMember(isStatic, new ClepsVariable(memberName, memberType, isConst));

            EntryPointManager.NewMemberSeen(FullyQualifiedClassName, memberName, memberType, isStatic);

            return(true);
        }
Пример #4
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="ClepsParser.memberDeclarationStatement"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
 {
 }
Пример #5
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="ClepsParser.memberDeclarationStatement"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
 {
     return(VisitChildren(context));
 }
        public override object VisitMemberDeclarationStatement([NotNull] ClepsParser.MemberDeclarationStatementContext context)
        {
            string memberName;

            if (context.OPERATOR() == null)
            {
                memberName = context.FieldName.Name.Text;
            }
            else
            {
                memberName = context.OperatorName.GetText();
            }

            bool      isStatic   = context.STATIC() != null;
            ClepsType memberType = Visit(context.typename()) as ClepsType;
            bool      isConst    = context.CONST() != null;

            //var oldMemberName = CurrMemberName;
            var oldMemberIsStatic = CurrMemberIsStatic;

            //var oldMemberType = CurrMemberType;

            //CurrMemberName = memberName;
            CurrMemberIsStatic = isStatic;
            //CurrMemberType = memberType;

            if (context.rightHandExpression() != null)
            {
                var expressionValue = Visit(context.rightHandExpression());

                //if(!memberType.IsFunctionType)
                {
                    IValue         expressionRegister = expressionValue as IValue;
                    IValueRegister targetRegister;
                    IMethodValue   initializerMethod;

                    if (isStatic)
                    {
                        initializerMethod = CodeGenerator.GetClassStaticInitializerRegister(FullyQualifiedClassName);
                        targetRegister    = CodeGenerator.GetStaticFieldRegister(FullyQualifiedClassName, memberName, memberType);
                    }
                    else
                    {
                        if (isConst)
                        {
                            initializerMethod = CodeGenerator.GetGlobalInitializerRegister();
                            targetRegister    = CodeGenerator.GetConstantMemberFieldRegisterForWrite(FullyQualifiedClassName, memberName, memberType);
                        }
                        else
                        {
                            initializerMethod = CodeGenerator.GetClassInitializerRegister(FullyQualifiedClassName);
                            targetRegister    = CodeGenerator.GetMemberFieldRegisterFromSameClass(FullyQualifiedClassName, memberName, memberType);
                        }
                    }

                    initializerMethod.CreateAssignment(targetRegister, expressionRegister);
                }
            }

            //CurrMemberName = oldMemberName;
            CurrMemberIsStatic = oldMemberIsStatic;
            //CurrMemberType = oldMemberType;

            return(true);
        }