/// <summary> /// 継承クラスの一覧を取得する。 /// </summary> /// <param name="fullName">クラスのフル名。</param> /// <param name="project">プロジェクト情報のインスタンス。</param> /// <returns>継承クラスの一覧。</returns> public static List<dynamic> GetExtendClasses( string fullName, WarlockProject project) { var ret = new List<dynamic>(); Action<string> recursive = null; recursive = (name) => { var classDefinition = project.FindClassDefinition(name); if (classDefinition != null) { if (ret.Contains(classDefinition)) { throw new InvalidOperationException("クラス定義の継承に循環参照が存在しています。"); } ret.Add(classDefinition); if (!String.IsNullOrEmpty(classDefinition.Extends)) { recursive(classDefinition.Extends); } return; } RubyClassDefinition objectDefinition = null; if (project.ObjectDefinitionMap.ContainsKey(name)) { objectDefinition = project.ObjectDefinitionMap[name] as RubyClassDefinition; if (objectDefinition != null) { ret.Add(objectDefinition); if (!String.IsNullOrEmpty(objectDefinition.SuperClassName) && objectDefinition.SuperClassName != "Object") { recursive(objectDefinition.SuperClassName); } return; } } }; recursive(fullName); ret.Reverse(); return ret; }
///// <summary> ///// データベース定義をクラス上で使用しているかチェックする。 ///// </summary> ///// <param name="classDefinition">クラス定義のインスタンス。</param> ///// <param name="project">プロジェクト情報のインスタンス。</param> ///// <returns>クラス定義をデータベース上で使用している場合はtrue。</returns> public bool IsUsingClass(WarlockProject project) { var dataClass = project.FindClassDefinition(this.DataClass); if (dataClass == null) return false; List<dynamic> extendClasses = dataClass.GetExtendClasses(project); var usingClasses = FindUsingClass(project); foreach (var usingClass in usingClasses) { foreach (var extendClass in extendClasses) { if (usingClass.Equals(extendClass)) return false; } return true; } return false; }
/// <summary> /// データベースで使用中のデータベースの一覧を取得する。 /// </summary> /// <param name="project">プロジェクト情報のインスタンス。</param> /// <returns>データベースで使用中のデータベースの一覧。</returns> private List<DatabaseDefinition> FindUsingDatabase(WarlockProject project) { var ret = new List<DatabaseDefinition>(); var dataClass = project.FindClassDefinition(this.DataClass); if (dataClass == null) return ret; var checkingStack = new List<ClassDefinition>(); Action<DatabaseDefinition> recursive = null; recursive = (database) => { if (!ret.Contains(database)) ret.Add(database); var clazz = project.FindClassDefinition(this.DataClass); if (clazz == null) return; if (checkingStack.Contains(clazz)) return; checkingStack.Add(clazz); foreach (var accessor in clazz.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; recursive(accessorData); } } checkingStack.Remove(clazz); }; foreach (var accessor in dataClass.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; recursive(accessorData); } } return ret; }
/// <summary> /// データベース定義を使用しているクラスの一覧を取得する。 /// </summary> ///// <param name="project">プロジェクト情報のインスタンス。</param> /// <returns></returns> public List<dynamic> FindUsingClass(WarlockProject project) { var ret = new List<dynamic>(); var dataClass = project.FindClassDefinition(this.DataClass); if (dataClass == null) return ret; List<dynamic> extendClasses = dataClass.GetExtendClasses(project); extendClasses.Reverse(); var checkingStack = new List<ClassDefinition>(); Action<ClassDefinition> recursive = null; recursive = (clazz) => { if (!ret.Contains(clazz)) ret.Add(clazz); if (checkingStack.Contains(clazz)) return; checkingStack.Add(clazz); foreach (var accessor in clazz.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; var accessorClass = project.FindClassDefinition(accessorData.DataClass); if (accessorClass == null) continue; recursive(accessorClass); } } checkingStack.Remove(clazz); }; foreach (var extendClass in extendClasses) { ret.Add(extendClass); if (extendClass is ClassDefinition) { var castedExtendClass = (ClassDefinition)extendClass; recursive(castedExtendClass); } } return ret; }