Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        ///// <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;
        }
Esempio n. 3
0
        /// <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;
        }
Esempio n. 4
0
        /// <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;
        }