private static void ScanDeclarations(IEnumerable <XElement> elements, out ExtendedKeyedCollection <string, PropertyDefinition> properties, out ExtendedKeyedCollection <string, Variable> variables) { properties = null; variables = null; foreach (XElement element in elements) { switch (element.Kind()) { case ElementKind.Variable: { variables = variables ?? new ExtendedKeyedCollection <string, Variable>(DefaultComparer.StringComparer); string variableName = element.AttributeValueOrThrow(AttributeNames.Name); if (variables.Contains(variableName)) { Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Variable, variableName), element); } var variable = new Variable( variableName, element.AttributeValueOrThrow(AttributeNames.Value)); variables.Add(variable); break; } case ElementKind.Property: { properties = properties ?? new ExtendedKeyedCollection <string, PropertyDefinition>(); string propertyName = element.AttributeValueOrThrow(AttributeNames.Name); if (properties.Contains(propertyName)) { Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Property, propertyName), element); } var property = new PropertyDefinition( propertyName, element.AttributeValueOrDefault(AttributeNames.DefaultValue), element.AttributeValueAsBooleanOrDefault(AttributeNames.IsCollection), element.AttributeValueAsBooleanOrDefault(AttributeNames.IsRequired), element); properties.Add(property); break; } default: { ThrowOnUnknownElement(element); break; } } } }
private static void ScanDeclarations(IEnumerable <XElement> elements, out ExtendedKeyedCollection <string, PropertyDefinition> properties, out ExtendedKeyedCollection <string, Variable> variables) { properties = null; variables = null; foreach (XElement element in elements) { switch (element.Kind()) { case ElementKind.Variable: { variables = variables ?? new ExtendedKeyedCollection <string, Variable>(DefaultComparer.StringComparer); string variableName = element.AttributeValueOrThrow(AttributeNames.Name); if (variables.Contains(variableName)) { Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Variable, variableName), element); } var variable = new Variable( variableName, element.AttributeValueOrThrow(AttributeNames.Value)); variables.Add(variable); break; } case ElementKind.Property: { properties = properties ?? new ExtendedKeyedCollection <string, PropertyDefinition>(); string name = null; bool isCollection = false; bool isRequired = false; string defaultValue = null; string description = null; foreach (XAttribute attribute in element.Attributes()) { switch (attribute.LocalName()) { case AttributeNames.Name: { name = attribute.Value; break; } case AttributeNames.IsCollection: { isCollection = bool.Parse(attribute.Value); break; } case AttributeNames.IsRequired: { isRequired = bool.Parse(attribute.Value); break; } case AttributeNames.DefaultValue: { defaultValue = attribute.Value; break; } case AttributeNames.Description: { description = attribute.Value; break; } default: { Throw(ErrorMessages.UnknownAttribute(attribute), element); break; } } } if (properties.Contains(name)) { Throw(ErrorMessages.ItemAlreadyDefined(ElementNames.Property, name), element); } if (isCollection && defaultValue != null) { Throw(ErrorMessages.CollectionPropertyCannotDefineDefaultValue(), element); } var property = new PropertyDefinition( name, isCollection, isRequired, defaultValue, description, element); properties.Add(property); break; } default: { ThrowOnUnknownElement(element); break; } } } }