summaryrefslogtreecommitdiffstats
path: root/tools/Sandcastle/Source/Reflection/RootFilter.cs
blob: 63401a5a85bf8e1c2b01a6fdf445b639f45819a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) Microsoft Corporation.  All rights reserved.
//

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.XPath;

using System.Compiler;

namespace Microsoft.Ddue.Tools.Reflection {

    public class RootFilter
    {

#region Member Variables
        private bool exposed;

        private List < NamespaceFilter > namespaceFilters = new List < NamespaceFilter >();
#endregion

#region Constructors

        public RootFilter(bool exposed) {
            this.exposed = exposed;
        }

        public RootFilter(XmlReader configuration) {
            exposed = Convert.ToBoolean(configuration.GetAttribute("expose"));
            XmlReader subtree = configuration.ReadSubtree();
            while (subtree.Read()) {
                if ((subtree.NodeType == XmlNodeType.Element) && (subtree.Name == "namespace")) {
                    NamespaceFilter namespaceFilter = new NamespaceFilter(subtree);
                    namespaceFilters.Add(namespaceFilter);
                }
            }
            subtree.Close();
        }
#endregion

#region Public API

        /// <summary>
        /// Gets the exposed value from the config
        /// </summary>
        public bool ExposedFilterSetting
        {
            get
            {
                return exposed;
            }
        }

        /// <summary>
        /// Gets the number of namespace filters
        /// </summary>
        public int NamespaceFilterCount
        {
            get
            {
                return namespaceFilters.Count;
            }
        }

        public List < NamespaceFilter > NamespaceFilters {
            get {
                return (namespaceFilters);
            }
        }

        //Find out if any are exposed incase this class is not exposed
        public bool HasExposedMembers(TypeNode type)
        {
            foreach (NamespaceFilter namespaceFilter in namespaceFilters)
            {
                bool? result = namespaceFilter.IsExposedType(type);
                if (result != null)
                {
                    return namespaceFilter.HasExposedMembers(type);
                }
            }
            return false;
        }

        public bool IsExposedApi(Member api) {

            Namespace space = api as Namespace;
            if (space != null) return (IsExposedNamespace(space));

            TypeNode type = api as TypeNode;
            if (type != null) return (IsExposedType(type));

            return (IsExposedMember(api));

        }


        public bool IsExposedMember(Member member) {
            //Console.WriteLine("DEBUG: root.IsExposedMember");
            foreach (NamespaceFilter namespaceFilter in namespaceFilters) {
                bool? result = namespaceFilter.IsExposedMember(member);
                if (result != null) return ((bool)result);
            }
            return (exposed);
        }

        public bool IsExposedNamespace(Namespace space) {
            foreach (NamespaceFilter namespaceFilter in namespaceFilters) {
                bool? result = namespaceFilter.IsExposedNamespace(space);
                if (result != null) return ((bool)result);
            }
            return (exposed);
        }

        public bool IsExposedType(TypeNode type) {
            foreach (NamespaceFilter namespaceFilter in namespaceFilters) {
                bool? result = namespaceFilter.IsExposedType(type);
                if (result != null) return ((bool)result);
            }

            return (exposed);
        }

#endregion
    }
}