Пример #1
0
        public CodeTraverser(
            Solution solution,
            TypeContext context)
        {
            if (solution == null)
            {
                throw new ArgumentNullException("solution");
            }

            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            this.solution = solution;
            this.context  = context;

            this.Settings = new TraverserSettings();
        }
Пример #2
0
        private void TraverseNamespace(
            CodeNamespace codeNamespace,
            TraverserSettings settings)
        {
            if (settings.NamespaceFilter == null ||
                settings.NamespaceFilter(codeNamespace))
            {
                if (settings.ClassToInterfaceBuilder != null)
                {
                    Traversal.TraverseClassesInNamespace(
                        codeNamespace,
                        (codeClass) =>
                    {
                        if (settings.ClassFilter == null ||
                            settings.ClassFilter(codeClass))
                        {
                            TypeScriptInterface builtType =
                                settings.ClassToInterfaceBuilder.Build(
                                    codeClass,
                                    this.context);

                            if (builtType != null &&
                                settings.TypeDecorators != null &&
                                settings.TypeDecorators.Any())
                            {
                                foreach (Action <TypeScriptType> typeDecorator in settings.TypeDecorators)
                                {
                                    typeDecorator(builtType);
                                }
                            }
                        }
                    });
                }

                if (settings.InterfaceToInterfaceBuilder != null)
                {
                    Traversal.TraverseInterfacesInNamespace(
                        codeNamespace,
                        (codeInterface) =>
                    {
                        if (settings.InterfaceFilter == null ||
                            settings.InterfaceFilter(codeInterface))
                        {
                            TypeScriptInterface builtType =
                                settings.InterfaceToInterfaceBuilder.Build(
                                    codeInterface,
                                    this.context);

                            if (builtType != null &&
                                settings.TypeDecorators != null &&
                                settings.TypeDecorators.Any())
                            {
                                foreach (Action <TypeScriptType> typeDecorator in settings.TypeDecorators)
                                {
                                    typeDecorator(builtType);
                                }
                            }
                        }
                    });
                }

                if (settings.EnumBuilder != null)
                {
                    Traversal.TraverseEnumsInNamespace(
                        codeNamespace,
                        (codeEnum) =>
                    {
                        if (settings.EnumFilter == null ||
                            settings.EnumFilter(codeEnum))
                        {
                            settings.EnumBuilder.Build(
                                codeEnum,
                                this.context);
                        }
                    });
                }
            }
        }
Пример #3
0
        private void ResolveReferenceTypes(
            IDictionary <string, IList <CodeNamespace> > namespacesByName,
            ICollection <string> attemptedSourceNames)
        {
            int result = 0;

            if (attemptedSourceNames == null)
            {
                attemptedSourceNames = new HashSet <string>();
            }
            IDictionary <IList <CodeNamespace>, ICollection <string> > typeNamesByNamespaces =
                new Dictionary <IList <CodeNamespace>, ICollection <string> >();

            TypeName outputName;
            IList <CodeNamespace> namespaceList;
            ICollection <string>  typeNames;
            IList <TypeReference> typeReferences = this.context.GetTypeReferences().ToList();

            foreach (TypeReference typeReference in typeReferences)
            {
                if (!attemptedSourceNames.Contains(typeReference.SourceType.UniversalName))
                {
                    outputName = this.context.ResolveOutputTypeName(
                        typeReference,
                        allowNull: true);
                    if (outputName == null)
                    {
                        if (namespacesByName.TryGetValue(
                                typeReference.SourceType.Namespace,
                                out namespaceList))
                        {
                            if (!typeNamesByNamespaces.TryGetValue(
                                    namespaceList,
                                    out typeNames))
                            {
                                typeNames = new HashSet <string>();
                                typeNamesByNamespaces.Add(
                                    namespaceList,
                                    typeNames);
                            }

                            typeNames.Add(typeReference.SourceType.UniversalName);
                            result++;
                        }
                        else if (typeReference.ContextTypeReference == null &&
                                 this.Settings.FailOnUnresolvedReferences)
                        {
                            throw new Exception(String.Format(
                                                    "Can't resolve type {0} because the namespace is unknown",
                                                    typeReference.SourceType.QualifiedName));
                        }
                    }
                    attemptedSourceNames.Add(typeReference.SourceType.UniversalName);
                }
            }

            TraverserSettings settings;

            foreach (KeyValuePair <IList <CodeNamespace>, ICollection <string> > namespaceTypeNamesPair
                     in typeNamesByNamespaces)
            {
                settings = new TraverserSettings()
                {
                    ClassToInterfaceBuilder = this.Settings.ClassToInterfaceBuilder,
                    EnumBuilder             = this.Settings.EnumBuilder,
                    ClassFilter             = (codeClass) =>
                    {
                        TypeName currentName = TypeName.ParseDte(codeClass.FullName);
                        return(namespaceTypeNamesPair.Value.Contains(currentName.UniversalName));
                    },
                    EnumFilter = (codeEnum) =>
                    {
                        TypeName currentName = TypeName.ParseDte(codeEnum.FullName);
                        return(namespaceTypeNamesPair.Value.Contains(currentName.UniversalName));
                    },
                    TypeDecorators = this.Settings.TypeDecorators
                };

                foreach (CodeNamespace codeNamespace in namespaceTypeNamesPair.Key)
                {
                    this.TraverseNamespace(
                        codeNamespace,
                        settings);
                }
            }

            if (typeNamesByNamespaces.Count > 0)
            {
                this.ResolveReferenceTypes(
                    namespacesByName,
                    attemptedSourceNames);
            }
        }