/// <summary> /// Gets all static fields for a Type. /// </summary> /// <param name="typeElement">Type element.</param> /// <returns>All static fields for the specified Type element.</returns> private FieldElement[] GetTypeStaticFields(TypeElement typeElement) { List <FieldElement> staticFields = new List <FieldElement>(); Action <ICodeElement> findStaticFields = delegate(ICodeElement codeElement) { FieldElement fieldElement = codeElement as FieldElement; if (fieldElement != null && fieldElement.MemberModifiers == MemberModifiers.Static) { bool isTypeChild = false; ICodeElement parentElement = codeElement.Parent; while (!isTypeChild && parentElement != null) { isTypeChild = parentElement == typeElement; if (!isTypeChild) { parentElement = parentElement.Parent; } } if (isTypeChild) { staticFields.Add(fieldElement); } } }; ElementUtilities.ProcessElementTree(typeElement, findStaticFields); return(staticFields.ToArray()); }
/// <summary> /// Arranges the code elements according to the configuration supplied /// in the constructor. /// </summary> /// <param name="originalElements">Original elements</param> /// <returns>An arranged collection of code elements.</returns> public ReadOnlyCollection <ICodeElement> Arrange(ReadOnlyCollection <ICodeElement> originalElements) { GroupElement rootElement = new GroupElement(); if (originalElements != null) { List <ICodeElement> elements = new List <ICodeElement>(); NamespaceElement firstNamespace = null; for (int elementIndex = 0; elementIndex < originalElements.Count; elementIndex++) { ICodeElement element = originalElements[elementIndex]; ICodeElement elementClone = element.Clone() as ICodeElement; elements.Add(elementClone); if (firstNamespace == null) { Action <ICodeElement> findFirstNamespace = delegate(ICodeElement processElement) { if (firstNamespace == null) { NamespaceElement namespaceElement = processElement as NamespaceElement; if (namespaceElement != null) { firstNamespace = namespaceElement; } } }; ElementUtilities.ProcessElementTree(elementClone, findFirstNamespace); } } MoveUsings(elements, firstNamespace); foreach (ICodeElement element in elements) { ArrangerChain.ArrangeElement(rootElement, element); } } List <ICodeElement> arranged = new List <ICodeElement>(rootElement.Children); foreach (ICodeElement arrangedElement in arranged) { // Remove the root element as the parent. arrangedElement.Parent = null; } return(arranged.AsReadOnly()); }
public void ArrangeStaticFieldsTest() { List <ICodeElement> codeElements = new List <ICodeElement>(); TypeElement classElement = new TypeElement(); classElement.Type = TypeElementType.Class; classElement.Access = CodeAccess.Public; classElement.Name = "TestClass"; FieldElement fieldElement1 = new FieldElement(); fieldElement1.MemberModifiers = MemberModifiers.Static; fieldElement1.Access = CodeAccess.Protected; fieldElement1.Type = "object"; fieldElement1.Name = "_obj"; fieldElement1.InitialValue = "typeof(int).ToString();"; classElement.AddChild(fieldElement1); // This field has a static dependency. Normally it would be sorted first // due to its access, but we want to make sure it gets added after the // field for which it is dependent. FieldElement fieldElement2 = new FieldElement(); fieldElement2.MemberModifiers = MemberModifiers.Static; fieldElement2.Access = CodeAccess.Public; fieldElement2.Type = "bool"; fieldElement2.Name = "Initialized"; fieldElement2.InitialValue = "_initializationString != null"; classElement.AddChild(fieldElement2); FieldElement fieldElement3 = new FieldElement(); fieldElement3.MemberModifiers = MemberModifiers.Static; fieldElement3.Access = CodeAccess.Private; fieldElement3.Type = "string"; fieldElement3.Name = "_initializationString"; fieldElement3.InitialValue = "_obj"; classElement.AddChild(fieldElement3); codeElements.Add(classElement); CodeArranger arranger = new CodeArranger(CodeConfiguration.Default); ReadOnlyCollection <ICodeElement> arranged = arranger.Arrange(codeElements.AsReadOnly()); Assert.AreEqual(1, arranged.Count, "After arranging, an unexpected number of elements were returned."); TypeElement typeElement = arranged[0] as TypeElement; Assert.IsNotNull(typeElement, "Expected a type element."); List <FieldElement> staticFields = new List <FieldElement>(); Action <ICodeElement> findStaticFields = delegate(ICodeElement codeElement) { FieldElement fieldElement = codeElement as FieldElement; if (fieldElement != null && fieldElement.MemberModifiers == MemberModifiers.Static) { staticFields.Add(fieldElement); } }; ElementUtilities.ProcessElementTree(typeElement, findStaticFields); Assert.AreEqual(3, staticFields.Count, "Unexpected number of static fields after arranging."); Assert.AreEqual("_obj", staticFields[0].Name); Assert.AreEqual("_initializationString", staticFields[1].Name); Assert.AreEqual("Initialized", staticFields[2].Name); // // Remove the dependency // fieldElement2.InitialValue = "true"; fieldElement3.InitialValue = "\"test\""; arranged = arranger.Arrange(codeElements.AsReadOnly()); Assert.AreEqual(1, arranged.Count, "After arranging, an unexpected number of elements were returned."); typeElement = arranged[0] as TypeElement; Assert.IsNotNull(typeElement, "Expected a type element."); staticFields.Clear(); ElementUtilities.ProcessElementTree(typeElement, findStaticFields); Assert.AreEqual(3, staticFields.Count, "Unexpected number of static fields after arranging."); Assert.AreEqual("Initialized", staticFields[0].Name); Assert.AreEqual("_obj", staticFields[1].Name); Assert.AreEqual("_initializationString", staticFields[2].Name); }