예제 #1
0
        private void ResolveNamespaces()
        {
            var TypeDictionary = new HashSet <String>();

            List <String> ResolveTypeDefName(TypeDef t, List <String> Name, String Version)
            {
                var FullName = Name;

                if (TypeToNamespace.ContainsKey(t))
                {
                    FullName = TypeToNamespace[t].Concat(Name).ToList();
                }
                TypeDictionary.Add((new TypeRef {
                    Name = FullName, Version = Version
                }).VersionedName());
                return(FullName);
            }

            List <String> ResolveTypeRefName(TypeDef t, TypeRef Ref, List <String> Name, String Version)
            {
                if (TypeToNamespace.ContainsKey(t))
                {
                    var CandidateFullName = TypeToNamespace[t].Concat(Name).ToList();
                    if (TypeDictionary.Contains((new TypeRef {
                        Name = CandidateFullName, Version = Version
                    }).VersionedName()))
                    {
                        return(CandidateFullName);
                    }
                }
                if (TypeToNamespaceImports.ContainsKey(t))
                {
                    foreach (var Namespace in TypeToNamespaceImports[t])
                    {
                        var CandidateFullName = Namespace.Concat(Name).ToList();
                        if (TypeDictionary.Contains((new TypeRef {
                            Name = CandidateFullName, Version = Version
                        }).VersionedName()))
                        {
                            return(CandidateFullName);
                        }
                    }
                }
                return(Name);
            }

            var conf = new TypeMapConfiguration
            {
                MapTypeDefKernel = t =>
                {
                    if (t.OnPrimitive)
                    {
                        var p = t.Primitive;
                        return(TypeDef.CreatePrimitive(new PrimitiveDef {
                            Name = ResolveTypeDefName(t, p.Name, ""), GenericParameters = p.GenericParameters, Attributes = p.Attributes, Description = p.Description
                        }));
                    }
                    else if (t.OnAlias)
                    {
                        var a = t.Alias;
                        return(TypeDef.CreateAlias(new AliasDef {
                            Name = ResolveTypeDefName(t, a.Name, a.Version), Version = a.Version, GenericParameters = a.GenericParameters, Type = a.Type, Attributes = a.Attributes, Description = a.Description
                        }));
                    }
                    else if (t.OnRecord)
                    {
                        var r = t.Record;
                        return(TypeDef.CreateRecord(new RecordDef {
                            Name = ResolveTypeDefName(t, r.Name, r.Version), Version = r.Version, GenericParameters = r.GenericParameters, Fields = r.Fields, Attributes = r.Attributes, Description = r.Description
                        }));
                    }
                    else if (t.OnTaggedUnion)
                    {
                        var tu = t.TaggedUnion;
                        return(TypeDef.CreateTaggedUnion(new TaggedUnionDef {
                            Name = ResolveTypeDefName(t, tu.Name, tu.Version), Version = tu.Version, GenericParameters = tu.GenericParameters, Alternatives = tu.Alternatives, Attributes = tu.Attributes, Description = tu.Description
                        }));
                    }
                    else if (t.OnEnum)
                    {
                        var e = t.Enum;
                        return(TypeDef.CreateEnum(new EnumDef {
                            Name = ResolveTypeDefName(t, e.Name, e.Version), Version = e.Version, UnderlyingType = e.UnderlyingType, Literals = e.Literals, Attributes = e.Attributes, Description = e.Description
                        }));
                    }
                    else if (t.OnClientCommand)
                    {
                        var cc = t.ClientCommand;
                        return(TypeDef.CreateClientCommand(new ClientCommandDef {
                            Name = ResolveTypeDefName(t, cc.Name, cc.Version), Version = cc.Version, OutParameters = cc.OutParameters, InParameters = cc.InParameters, Attributes = cc.Attributes, Description = cc.Description
                        }));
                    }
                    else if (t.OnServerCommand)
                    {
                        var sc = t.ServerCommand;
                        return(TypeDef.CreateServerCommand(new ServerCommandDef {
                            Name = ResolveTypeDefName(t, sc.Name, sc.Version), Version = sc.Version, OutParameters = sc.OutParameters, Attributes = sc.Attributes, Description = sc.Description
                        }));
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                },
                TypeDefMarker     = MarkTypeDef,
                TypeSpecMarker    = Mark,
                VariableDefMarker = Mark
            };

            Types    = Types.Select(t => t.MapType(conf)).ToList();
            TypeRefs = TypeRefs.Select(t => t.MapType(conf)).ToList();

            var confTypeSpec = new TypeMapConfiguration
            {
                MapTypeSpecKernel = (t, ts) =>
                {
                    if (ts.OnTypeRef)
                    {
                        return(TypeSpec.CreateTypeRef(new TypeRef {
                            Name = ResolveTypeRefName(t, ts.TypeRef, ts.TypeRef.Name, ts.TypeRef.Version), Version = ts.TypeRef.Version
                        }));
                    }
                    else if (ts.OnGenericParameterRef)
                    {
                        return(ts);
                    }
                    else if (ts.OnTuple)
                    {
                        return(ts);
                    }
                    else if (ts.OnGenericTypeSpec)
                    {
                        return(ts);
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                },
                TypeDefMarker     = Mark,
                TypeSpecMarker    = Mark,
                VariableDefMarker = Mark
            };

            Types    = Types.Select(t => t.MapType(confTypeSpec)).ToList();
            TypeRefs = TypeRefs.Select(t => t.MapType(confTypeSpec)).ToList();

            TypeToNamespace        = new Dictionary <TypeDef, List <String> >();
            TypeToNamespaceImports = new Dictionary <TypeDef, List <List <String> > >();
        }