Exemplo n.º 1
0
        /// <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());
        }
Exemplo n.º 2
0
        /// <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());
        }
Exemplo n.º 3
0
        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);
        }