1 #Region "Microsoft.VisualBasic::2d59ebd95f37f0df7d1cbc8d957319a0, Microsoft.VisualBasic.Core\ApplicationServices\VBDev\XmlDoc\ProjectType.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class ProjectType
35     
36     '         Properties: [Namespace], Name, Remarks, Summary
37     
38     '         Constructor: (+4 OverloadsSub New
39     
40     '         Function: EnsureEvent, EnsureField, EnsureMethod, EnsureProperty, GetEvent
41     '                   GetField, getInternal, GetMethods, GetProperties, ToString
42     
43     '         Sub: LoadFromNode
44     
45     
46     ' /********************************************************************************/
47
48 #End Region
49
50 ' Copyright (c) Bendyline LLC. All rights reserved. Licensed under the Apache License, Version 2.0.
51 '    You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. 
52
53
54 Imports System.Runtime.CompilerServices
55 Imports System.Xml
56 Imports Microsoft.VisualBasic.ApplicationServices.Development.XmlDoc.Serialization
57 Imports Microsoft.VisualBasic.Text
58 Imports Microsoft.VisualBasic.Linq
59
60 Namespace ApplicationServices.Development.XmlDoc.Assembly
61
62     ''' <summary>
63     ''' A type within a project namespace.
64     ''' </summary>
65     ''' <remarks>
66     ''' Fields和Events都不允许重载,但是属性和函数都可以重载
67     ''' </remarks>
68     Public Class ProjectType
69
70         Protected projectNamespace As ProjectNamespace
71
72         Protected fields As Dictionary(Of String, ProjectMember)
73         Protected events As Dictionary(Of String, ProjectMember)
74
75         ''' <summary>
76         ''' 因为属性存在参数,所以可能会出现重载的情况
77         ''' </summary>
78         Protected Friend properties As Dictionary(Of String, List(Of ProjectMember))
79         ''' <summary>
80         ''' 会出现重载函数,所以这里也应该是一个list
81         ''' </summary>
82         Protected Friend methods As Dictionary(Of String, List(Of ProjectMember))
83
84         Public ReadOnly Property [Namespace]() As ProjectNamespace
85             <MethodImpl(MethodImplOptions.AggressiveInlining)>
86             Get
87                 Return Me.projectNamespace
88             End Get
89         End Property
90
91         Public Property Name As String
92         Public Property Summary As String
93         Public Property Remarks As String
94
95         Friend Sub New()
96             properties = New Dictionary(Of String, List(Of ProjectMember))
97             methods = New Dictionary(Of String, List(Of ProjectMember))
98         End Sub
99
100         Public Sub New(projectNamespace As ProjectNamespace)
101             Me.projectNamespace = projectNamespace
102
103             Me.fields = New Dictionary(Of String, ProjectMember)()
104             Me.properties = New Dictionary(Of String, List(Of ProjectMember))()
105             Me.methods = New Dictionary(Of String, List(Of ProjectMember))()
106             Me.events = New Dictionary(Of String, ProjectMember)
107         End Sub
108
109         Protected Sub New(type As ProjectType)
110             projectNamespace = type.projectNamespace
111             events = type.events
112             fields = type.fields
113             properties = type.properties
114             methods = type.methods
115             Name = type.Name
116             Summary = type.Summary
117             Remarks = type.Remarks
118         End Sub
119
120         Friend Sub New(t1 As ProjectType, t2 As ProjectType)
121             projectNamespace = t1.projectNamespace
122             fields = (t1.fields.Values.AsList + t2.fields.Values).GroupBy(Function(f) f.Name.ToLower).ToDictionary(Function(g) g.Key, Function(g) g.Sum(Me))
123             events = (t1.events.Values.AsList + t2.events.Values).GroupBy(Function(f) f.Name.ToLower).ToDictionary(Function(g) g.Key, Function(g) g.Sum(Me))
124             properties = (t1.properties.Values.AsList + t2.properties.Values).IteratesALL.GroupBy(Function(f) f.Name.ToLower).ToDictionary(Function(g) g.Key, Function(g) g.ToList)
125             methods = (t1.methods.Values.AsList + t2.methods.Values).IteratesALL.GroupBy(Function(f) f.Name.ToLower).ToDictionary(Function(g) g.Key, Function(g) g.ToList)
126         End Sub
127
128         Public Overrides Function ToString() As String
129             Return Name
130         End Function
131
132         <MethodImpl(MethodImplOptions.AggressiveInlining)>
133         Public Function GetMethods(methodName As StringAs List(Of ProjectMember)
134             Return getInternal(methods, methodName.ToLower)
135         End Function
136
137         Public Function EnsureMethod(methodName As StringAs ProjectMember
138             Dim pmlist As List(Of ProjectMember) = Me.GetMethods(methodName)
139             Dim pm As New ProjectMember(Me) With {
140                 .Name = methodName
141             }
142
143             Call pmlist.Add(pm)
144
145             Return pm
146         End Function
147
148         Private Shared Function getInternal(ByRef table As Dictionary(Of String, List(Of ProjectMember)), name$) As List(Of ProjectMember)
149             If table.ContainsKey(name) Then
150                 Return table(name)
151             Else
152                 Dim list As New List(Of ProjectMember)
153                 table.Add(name, list)
154                 Return list
155             End If
156         End Function
157
158         <MethodImpl(MethodImplOptions.AggressiveInlining)>
159         Public Function GetProperties(propertyName As StringAs List(Of ProjectMember)
160             Return getInternal(properties, propertyName.ToLower)
161         End Function
162
163         Public Function EnsureProperty(propertyName As StringAs ProjectMember
164             Dim pmlist As List(Of ProjectMember) = Me.GetProperties(propertyName)
165             Dim pm As New ProjectMember(Me) With {
166                 .Name = propertyName
167             }
168
169             Call pmlist.Add(pm)
170
171             Return pm
172         End Function
173
174         Public Function GetField(fieldName As StringAs ProjectMember
175             If Me.fields.ContainsKey(fieldName.ToLower()) Then
176                 Return Me.fields(fieldName.ToLower())
177             End If
178
179             Return Nothing
180         End Function
181
182         Public Function EnsureField(fieldName As StringAs ProjectMember
183             Dim pm As ProjectMember = Me.GetField(fieldName)
184
185             If pm Is Nothing Then
186                 pm = New ProjectMember(Me) With {
187                     .Name = fieldName
188                 }
189
190                 Me.fields.Add(fieldName.ToLower(), pm)
191             End If
192
193             Return pm
194         End Function
195
196         Public Function GetEvent(eventName As StringAs ProjectMember
197             If Me.events.ContainsKey(eventName.ToLower()) Then
198                 Return Me.events(eventName.ToLower())
199             End If
200
201             Return Nothing
202         End Function
203
204         Public Function EnsureEvent(eventName As StringAs ProjectMember
205             Dim pm As ProjectMember = Me.GetField(eventName)
206
207             If pm Is Nothing Then
208                 pm = New ProjectMember(Me) With {
209                     .Name = eventName
210                 }
211
212                 Me.fields.Add(eventName.ToLower(), pm)
213             End If
214
215             Return pm
216         End Function
217
218         Public Sub LoadFromNode(xn As XmlNode)
219             Dim summaryNode As XmlNode = xn.SelectSingleNode("summary")
220
221             If summaryNode IsNot Nothing Then
222                 Me.Summary = summaryNode.InnerText.Trim(ASCII.CR, ASCII.LF, " ")
223             End If
224
225             summaryNode = xn.SelectSingleNode("remarks")
226
227             If Not summaryNode Is Nothing Then
228                 Remarks = summaryNode.InnerText.Trim(ASCII.CR, ASCII.LF, " ")
229             End If
230         End Sub
231     End Class
232 End Namespace