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