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); }