Example #1
0
        public override AstNode Visit(FieldDeclaration node)
        {
            // Get the field.
            FieldVariable field = (FieldVariable)node.GetVariable();

            // Get the field type.
            IChelaType fieldType = field.GetVariableType();
            if(!fieldType.IsConstant() || field.IsExternal())
                return node; // Ignore not constant fields.

            // Get the initializer.
            Expression initializer = node.GetDefaultValue();
            if(initializer == null)
                Error(node, "constants must have initializers.");

            // Don't allow multiple definitions.
            if(constants.ContainsKey(field))
                Error(node, "multiples definitions of a constant.");

            // Store the constant.
            ConstantData data = new ConstantData(field, initializer);
            this.constants.Add(field, data);

            // Return the node.
            return node;
        }
Example #2
0
        public override AstNode Visit(FieldDeclaration node)
        {
            // Process attributes.
            ProcessAttributes(node);

            // Get the field type.
            //FieldVariable field = (FieldVariable)node.GetVariable();
            IChelaType fieldType = node.GetNodeType();

            // Get the field initializer.
            Expression initializer = node.GetDefaultValue();
            if(initializer == null)
                return node;

            // Process the initializer.
            initializer.Accept(this);

            // Check the initializer type.
            IChelaType initType = initializer.GetNodeType();
            node.SetCoercionType(fieldType);
            if(Coerce(node, fieldType, initType, initializer.GetNodeValue()) != fieldType)
                Error(node, "incompatible field initialization expression.");

            // Append it to the initialization list.
            if(!fieldType.IsConstant())
            {
                if(currentContainer.IsNamespace())
                {
                    Namespace space = (Namespace)currentContainer;
                    space.AddGlobalInitialization(node);
                }
                else
                {
                    Structure building = (Structure)currentContainer;
                    building.AddFieldInitialization(node);
                }
            }
            return node;
        }