示例#1
0
        private static ObjectFileDefinition LoadObjectFileDefinition(Raw.ObjectFileDefinition raw,
                                                                     HashedDefinitionDictionary <ClassDefinition>
                                                                     classDefs)
        {
            if (string.IsNullOrEmpty(raw.Name) == true)
            {
                throw new LoadException("binary object file missing name?");
            }

            ClassDefinition classDef = null;

            if (raw.Object != null)
            {
                classDef = ClassDefinitionLoader.LoadClass(raw.Object, classDefs);
            }

            return(new ObjectFileDefinition()
            {
                Name = raw.Name,
                Aliases =
                    new ReadOnlyCollection <string>(
                        new[] { raw.Name.ToLowerInvariant() }.Concat(raw.Aliases.Select(a => a.ToLowerInvariant()))
                        .Distinct()
                        .ToList()),
                Object = classDef,
            });
        }
示例#2
0
        public static ClassDefinition LoadAnonymousClass(Raw.ClassDefinition raw,
                                                         HashedDefinitionDictionary <ClassDefinition> root)
        {
            var def = new ClassDefinition();

            LoadClass(def, raw, root);
            return(def);
        }
示例#3
0
        public static ClassDefinition LoadClass(Raw.ClassDefinition raw,
                                                HashedDefinitionDictionary <ClassDefinition> root)
        {
            var def = GetClass(raw);

            LoadClass(def, raw, root);
            return(def);
        }
示例#4
0
        private static IList <FriendDefinition> LoadFriends(IEnumerable <Raw.FriendDefinition> raws,
                                                            HashedDefinitionDictionary <ClassDefinition> root)
        {
            var defs = new List <FriendDefinition>();

            if (raws != null)
            {
                defs.AddRange(raws.Select(raw => LoadFriend(raw, root)));
            }
            return(defs);
        }
示例#5
0
 private static void LoadClass(ClassDefinition def,
                               Raw.ClassDefinition raw,
                               HashedDefinitionDictionary <ClassDefinition> root)
 {
     def.Friends = new ReadOnlyCollection <FriendDefinition>(LoadFriends(raw.Friends, root));
     def.Fields  = new ReadOnlyCollection <FieldDefinition>(LoadFields(raw.Fields));
     def.Objects = new ReadOnlyCollection <ClassDefinition>(LoadObjects(raw.Objects, root));
     def.DynamicNestedClasses = raw.DynamicNestedClasses;
     def.ClassFieldName       = raw.ClassFieldName;
     def.ClassFieldHash       = raw.ClassFieldHash;
 }
示例#6
0
        private static FriendDefinition LoadFriend(Raw.FriendDefinition raw,
                                                   HashedDefinitionDictionary <ClassDefinition> root)
        {
            if (root.ContainsKey(raw.Name) == false)
            {
                throw new LoadException(string.Format("could not find object '{0}'",
                                                      raw.Name));
            }

            return(new FriendDefinition()
            {
                Class = root[raw.Name],
                ConditionField = raw.ConditionField,
                ConditionValue = raw.ConditionValue,
                ConditionType = raw.ConditionType,
            });
        }
示例#7
0
        private static IList <ClassDefinition> LoadObjects(IEnumerable <Raw.ClassDefinition> raws,
                                                           HashedDefinitionDictionary <ClassDefinition> root)
        {
            var defs = new List <ClassDefinition>();

            if (raws != null)
            {
                foreach (var raw in raws)
                {
                    var def = LoadClass(raw, root);
                    if (defs.Any(fd => fd.Hash == def.Hash))
                    {
                        throw new LoadException(string.Format("duplicate object '{0}'",
                                                              def.Name));
                    }
                    defs.Add(def);
                }
            }
            return(defs);
        }
示例#8
0
        public static NamedDefinitionDictionary <ObjectFileDefinition> Load(string basePath,
                                                                            HashedDefinitionDictionary <ClassDefinition>
                                                                            classDefs)
        {
            var raws  = LoaderHelper.Load <Raw.ObjectFileDefinition>(GetObjectFilePaths(basePath));
            var defs  = new List <ObjectFileDefinition>();
            var names = new List <string>();

            foreach (var raw in raws)
            {
                if (raw.Aliases.Any(alias => names.Contains(alias) == true))
                {
                    throw new LoadException(string.Format("duplicate binary object file '{0}'", raw.Name));
                }

                defs.Add(LoadObjectFileDefinition(raw, classDefs));
                names.AddRange(raw.Aliases);
            }
            return(new NamedDefinitionDictionary <ObjectFileDefinition>(defs));
        }
示例#9
0
        public static HashedDefinitionDictionary <ClassDefinition> Load(string basePath)
        {
            var raws = LoaderHelper.Load <Raw.ClassDefinition>(GetClassDefinitionPaths(basePath));

            var pairs = new Dictionary <Raw.ClassDefinition, ClassDefinition>();

            foreach (var raw in raws)
            {
                if (pairs.Any(d => d.Value.Name == raw.Name) == true)
                {
                    throw new LoadException(string.Format("duplicate class '{0}'",
                                                          raw.Name));
                }
                pairs.Add(raw, GetClass(raw));
            }

            var defs = new HashedDefinitionDictionary <ClassDefinition>(pairs.Values);

            foreach (var pair in pairs)
            {
                LoadClass(pair.Value, pair.Key, defs);
            }
            return(defs);
        }