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; }
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; }