Beispiel #1
0
        private bool GetBaseClass(ICSharpClass cSharpClass, IClassSplitting splitting, IDictionary <IClass, ICSharpClass> classTable, out ICSharpClass result)
        {
            result = null;
            IClass BaseClass = null;

            // If the class inherits from a class that must be a parent, select it as base class.
            foreach (IInheritance InheritanceItem in cSharpClass.Source.InheritanceList)
            {
                IClassType ClassParentType = InheritanceItem.ResolvedClassParentType.Item;
                IClass     ParentClass     = ClassParentType.BaseClass;

                Debug.Assert(ParentClass != null);

                if (splitting.MustInherit.Contains(ParentClass))
                {
                    Debug.Assert(BaseClass == null);
                    BaseClass = ParentClass;
                }
            }

            // No such class. Try classes that don't have to be interface.
            if (BaseClass == null)
            {
                IList <IClass> ParentCandidates = new List <IClass>();

                foreach (IInheritance InheritanceItem in cSharpClass.Source.InheritanceList)
                {
                    IClassType ClassParentType = InheritanceItem.ResolvedClassParentType.Item;
                    IClass     ParentClass     = ClassParentType.BaseClass;

                    if (splitting.OtherParents.Contains(ParentClass))
                    {
                        ParentCandidates.Add(ParentClass);
                    }
                }

                if (ParentCandidates.Count > 0)
                {
                    BaseClass = ParentCandidates[0];
                }
            }

            if (BaseClass != null)
            {
                foreach (KeyValuePair <IClass, ICSharpClass> Entry in classTable)
                {
                    ICSharpClass Item = Entry.Value;

                    if (Item.Source == BaseClass)
                    {
                        Debug.Assert(result == null);
                        result = Item;
                    }
                }
            }

            return(result != null);
        }
        /// <summary>
        /// Creates a <see cref="ClassSplitting"/> object.
        /// </summary>
        /// <param name="classList">The list of classes to split.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="result">The created object upon return.</param>
        public static bool Create(IList <IClass> classList, IErrorList errorList, out IClassSplitting result)
        {
            result = new ClassSplitting();

            foreach (IClass ClassItem in classList)
            {
                if (ClassItem.HasExternBody)
                {
                    result.MustInherit.Add(ClassItem);
                }
            }

            foreach (IClass ClassItem in classList)
            {
                bool InheritanceForced = false;
                foreach (IInheritance InheritanceItem in ClassItem.InheritanceList)
                {
                    IClassType ClassParentType = InheritanceItem.ResolvedClassParentType.Item;
                    IClass     BaseClass       = ClassParentType.BaseClass;

                    if (result.MustInherit.Contains(BaseClass))
                    {
                        if (InheritanceForced)
                        {
                            errorList.AddError(new ErrorMultipleExternBody(ClassItem));
                            break;
                        }
                        else
                        {
                            InheritanceForced = true;
                        }
                    }
                }

                if (errorList.IsEmpty && InheritanceForced)
                {
                    foreach (IInheritance InheritanceItem in ClassItem.InheritanceList)
                    {
                        IClassType ClassParentType = InheritanceItem.ResolvedClassParentType.Item;
                        IClass     BaseClass       = ClassParentType.BaseClass;

                        if (!result.MustInherit.Contains(BaseClass) && !result.MustInterface.Contains(BaseClass))
                        {
                            result.MustInterface.Add(BaseClass);
                        }
                    }
                }
            }

            if (!errorList.IsEmpty)
            {
                return(false);
            }

            foreach (IClass ClassItem in classList)
            {
                if (!result.MustInherit.Contains(ClassItem) && !result.MustInterface.Contains(ClassItem))
                {
                    result.OtherParents.Add(ClassItem);
                }
            }

            return(true);
        }