Ejemplo n.º 1
0
        public override bool VisitClassDeclarationStatements_Ex([NotNull] ClepsParser.ClassDeclarationStatementsContext context)
        {
            if (!ClassManager.IsClassBuilderAvailable(FullyQualifiedClassName))
            {
                //if the class was not found in the loaded class stage, then this is probably due to an earlier parsing error, just stop processing this class
                return(false);
            }

            if (ClassManager.IsClassBodySet(FullyQualifiedClassName))
            {
                //class body is already set
                //this branch is hit, if the user has an error in code where multiple classes have the same name
                //gracefully exit
                return(false);
            }

            Visit(context.classBodyStatements());


            ClepsClassBuilder classBuilder = ClassManager.GetClassBuilder(FullyQualifiedClassName);
            ClepsClass        classDetails = classBuilder.BuildClass();

            ClassManager.SetClassDefinition(classDetails);
            CodeGenerator.SetClassBodyAndCreateConstructor(classDetails);

            return(true);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 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);
        }