From: Gert D. <dri...@us...> - 2007-12-15 21:38:00
|
Update of /cvsroot/nant/nant/src/NAnt.Core In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv558 Modified Files: Element.cs Log Message: Process both public and protected properties. When an item in a collection is a ConditionalElement, then only add it to the collection if the item is actually enable (Ifdefined is true, and UnlessDefined is false). Index: Element.cs =================================================================== RCS file: /cvsroot/nant/nant/src/NAnt.Core/Element.cs,v retrieving revision 1.96 retrieving revision 1.97 diff -C2 -d -r1.96 -r1.97 *** Element.cs 10 Nov 2007 15:17:31 -0000 1.96 --- Element.cs 15 Dec 2007 21:37:11 -0000 1.97 *************** *** 33,36 **** --- 33,37 ---- using NAnt.Core.Attributes; + using NAnt.Core.Configuration; using NAnt.Core.Types; using NAnt.Core.Util; *************** *** 462,466 **** // see if we have a valid copy constructor ConstructorInfo constructor = elementType.GetConstructor(new Type[] {dataType.GetType()}); ! if (constructor != null){ dataType = (DataTypeBase) constructor.Invoke(new object[] {dataType}); } else { --- 463,467 ---- // see if we have a valid copy constructor ConstructorInfo constructor = elementType.GetConstructor(new Type[] {dataType.GetType()}); ! if (constructor != null) { dataType = (DataTypeBase) constructor.Invoke(new object[] {dataType}); } else { *************** *** 658,676 **** public void Initialize() { Type currentType = Element.GetType(); ! PropertyInfo[] propertyInfoArray = currentType.GetProperties( ! BindingFlags.Public | BindingFlags.Instance); // loop through all the properties in the derived class. foreach (PropertyInfo propertyInfo in propertyInfoArray) { if (InitializeAttribute(propertyInfo)) { continue; } ! if (InitializeBuildElementCollection(propertyInfo)) { continue; } ! if (InitializeChildElement(propertyInfo)) { continue; } --- 659,695 ---- public void Initialize() { Type currentType = Element.GetType(); ! PropertyInfo[] propertyInfoArray = currentType.GetProperties( ! BindingFlags.Public | BindingFlags.Instance | ! BindingFlags.NonPublic); // loop through all the properties in the derived class. foreach (PropertyInfo propertyInfo in propertyInfoArray) { + MethodInfo getter = null; + MethodInfo setter = null; + + setter = propertyInfo.GetSetMethod(true); + if (setter != null && !(setter.IsPublic || setter.IsFamily)) { + setter = null; + } + + getter = propertyInfo.GetGetMethod(true); + if (getter != null && !(getter.IsPublic || getter.IsFamily)) { + getter = null; + } + + // skip properties that are not public or protected + if (getter == null && setter == null) + continue; + if (InitializeAttribute(propertyInfo)) { continue; } ! if (InitializeBuildElementCollection(propertyInfo)) { continue; } ! if (InitializeChildElement(propertyInfo, getter, setter)) { continue; } *************** *** 1068,1071 **** --- 1087,1096 ---- elementType); + // check if element should actually be added + ConditionalElement conditional = childElement as ConditionalElement; + if (conditional != null && !conditional.Enabled) { + continue; + } + // set element in array list.SetValue(childElement, arrayIndex); *************** *** 1077,1082 **** if (propertyInfo.PropertyType.IsArray) { try { ! // set the member array to our newly created array ! propertyInfo.SetValue(Element, list, null); } catch (TargetInvocationException ex) { if (ex.InnerException is BuildException) { --- 1102,1117 ---- if (propertyInfo.PropertyType.IsArray) { try { ! if (arrayIndex != list.Length) { ! // create a new array with a size that exactly matches ! // the number of initialized elements ! Array final = Array.CreateInstance(elementType, arrayIndex); ! // copy initialized entries to new array ! Array.Copy(list, 0, final, 0, arrayIndex); ! // set the member array to our newly created array ! propertyInfo.SetValue(Element, final, null); ! } else { ! // set the member array to our newly created array ! propertyInfo.SetValue(Element, list, null); ! } } catch (TargetInvocationException ex) { if (ex.InnerException is BuildException) { *************** *** 1139,1144 **** // add each element of the array to collection instance ! foreach (object childElement in list) { ! addMethod.Invoke(collection, BindingFlags.Default, null, new object[] {childElement}, CultureInfo.InvariantCulture); } } --- 1174,1181 ---- // add each element of the array to collection instance ! for (int i = 0; i < arrayIndex; i++) { ! object child = list.GetValue(i); ! addMethod.Invoke(collection, BindingFlags.Default, null, ! new object[] {child}, CultureInfo.InvariantCulture); } } *************** *** 1147,1151 **** } ! protected virtual bool InitializeChildElement(PropertyInfo propertyInfo) { // now do nested BuildElements BuildElementAttribute buildElementAttribute = (BuildElementAttribute) --- 1184,1188 ---- } ! protected virtual bool InitializeChildElement(PropertyInfo propertyInfo, MethodInfo getter, MethodInfo setter) { // now do nested BuildElements BuildElementAttribute buildElementAttribute = (BuildElementAttribute) *************** *** 1184,1189 **** // create the child build element; not needed directly. It will be assigned to the local property. ! CreateChildBuildElement(propertyInfo, nestedElementNode, ! Properties, TargetFramework); // output warning to build log when multiple nested elements --- 1221,1226 ---- // create the child build element; not needed directly. It will be assigned to the local property. ! CreateChildBuildElement(propertyInfo, getter, setter, ! nestedElementNode, Properties, TargetFramework); // output warning to build log when multiple nested elements *************** *** 1338,1354 **** /// </summary> /// <param name="propInf">The <see cref="PropertyInfo" /> instance that represents the property of the current class.</param> /// <param name="xml">The <see cref="XmlNode" /> used to initialize the new <see cref="Element" /> instance.</param> /// <param name="properties">The collection of property values to use for macro expansion.</param> /// <param name="framework">The <see cref="FrameworkInfo" /> from which to obtain framework-specific information.</param> /// <returns>The <see cref="Element" /> child.</returns> ! private Element CreateChildBuildElement(PropertyInfo propInf, XmlNode xml, PropertyDictionary properties, FrameworkInfo framework) { ! MethodInfo getter = null; ! MethodInfo setter = null; Element childElement = null; Type elementType = null; - setter = propInf.GetSetMethod(true); - getter = propInf.GetGetMethod(true); - // if there is a getter, then get the current instance of the object, and use that if (getter != null) { --- 1375,1388 ---- /// </summary> /// <param name="propInf">The <see cref="PropertyInfo" /> instance that represents the property of the current class.</param> + /// <param name="getter">A <see cref="MethodInfo" /> representing the get accessor for the property.</param> + /// <param name="setter">A <see cref="MethodInfo" /> representing the set accessor for the property.</param> /// <param name="xml">The <see cref="XmlNode" /> used to initialize the new <see cref="Element" /> instance.</param> /// <param name="properties">The collection of property values to use for macro expansion.</param> /// <param name="framework">The <see cref="FrameworkInfo" /> from which to obtain framework-specific information.</param> /// <returns>The <see cref="Element" /> child.</returns> ! private Element CreateChildBuildElement(PropertyInfo propInf, MethodInfo getter, MethodInfo setter, XmlNode xml, PropertyDictionary properties, FrameworkInfo framework) { Element childElement = null; Type elementType = null; // if there is a getter, then get the current instance of the object, and use that if (getter != null) { *************** *** 1376,1381 **** } ! // create a new instance of the object if there is not a get method. (or the get object returned null... see above) ! if (getter == null && setter != null) { elementType = setter.GetParameters()[0].ParameterType; if (elementType.IsAbstract) { --- 1410,1416 ---- } ! // create a new instance of the object if there is no get method ! // or the get object returned null ! if (getter == null) { elementType = setter.GetParameters()[0].ParameterType; if (elementType.IsAbstract) { |