1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . ComponentModel ;
4
- using System . Diagnostics ;
5
4
using System . IO ;
6
5
using System . Runtime . InteropServices ;
7
6
using System . Runtime . InteropServices . ComTypes ;
@@ -47,14 +46,8 @@ private enum REGKIND
47
46
48
47
private readonly RubberduckParserState _state ;
49
48
private SerializableProject _serialized ;
50
- private readonly Dictionary < Declaration , SerializableDeclarationTree > _treeLookup = new Dictionary < Declaration , SerializableDeclarationTree > ( ) ;
51
49
private readonly List < Declaration > _declarations = new List < Declaration > ( ) ;
52
50
53
- private const string EnumPseudoName = "Enums" ;
54
- private Declaration _enumModule ;
55
- private const string TypePseudoName = "Types" ;
56
- private Declaration _typeModule ;
57
-
58
51
private static readonly HashSet < string > IgnoredInterfaceMembers = new HashSet < string >
59
52
{
60
53
"QueryInterface" ,
@@ -95,13 +88,29 @@ public bool SerializedVersionExists
95
88
}
96
89
}
97
90
91
+ private static readonly HashSet < DeclarationType > ProceduralTypes =
92
+ new HashSet < DeclarationType > ( new [ ]
93
+ {
94
+ DeclarationType . Procedure , DeclarationType . Function , DeclarationType . PropertyGet ,
95
+ DeclarationType . PropertyLet , DeclarationType . PropertySet
96
+ } ) ;
97
+
98
98
public List < Declaration > LoadDeclarationsFromXml ( )
99
99
{
100
100
var path = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . ApplicationData ) , "Rubberduck" , "Declarations" ) ;
101
101
var file = Path . Combine ( path , string . Format ( "{0}.{1}.{2}" , _referenceName , _referenceMajor , _referenceMinor ) + ".xml" ) ;
102
102
var reader = new XmlPersistableDeclarations ( ) ;
103
103
var deserialized = reader . Load ( file ) ;
104
- return deserialized . Unwrap ( ) ;
104
+
105
+ var declarations = deserialized . Unwrap ( ) ;
106
+
107
+ foreach ( var members in declarations . Where ( d => d . ParentDeclaration . DeclarationType == DeclarationType . ClassModule &&
108
+ ProceduralTypes . Contains ( d . DeclarationType ) )
109
+ . GroupBy ( d => d . ParentDeclaration ) )
110
+ {
111
+ _state . CoClasses . TryAdd ( members . Select ( m => m . IdentifierName ) . ToList ( ) , members . First ( ) . ParentDeclaration ) ;
112
+ }
113
+ return declarations ;
105
114
}
106
115
107
116
public List < Declaration > LoadDeclarationsFromLibrary ( )
@@ -123,7 +132,10 @@ public List<Declaration> LoadDeclarationsFromLibrary()
123
132
124
133
foreach ( var module in type . Members )
125
134
{
126
- var moduleName = new QualifiedModuleName ( _referenceName , _path , module . Name ) ;
135
+ var moduleName = new QualifiedModuleName ( _referenceName , _path ,
136
+ module . Type == DeclarationType . Enumeration || module . Type == DeclarationType . UserDefinedType
137
+ ? string . Format ( "_{0}" , module . Name )
138
+ : module . Name ) ;
127
139
128
140
var attributes = new Attributes ( ) ;
129
141
if ( module . IsPreDeclared )
@@ -135,43 +147,27 @@ public List<Declaration> LoadDeclarationsFromLibrary()
135
147
attributes . AddGlobalClassAttribute ( ) ;
136
148
}
137
149
138
- var declaration = CreateModuleDeclaration ( module ,
139
- module . Type == DeclarationType . Enumeration || module . Type == DeclarationType . UserDefinedType
140
- ? projectName
141
- : moduleName , project , attributes ) ;
142
-
143
- if ( declaration . IdentifierName . Equals ( EnumPseudoName ) )
144
- {
145
- if ( _enumModule == null )
146
- {
147
- _enumModule = declaration ;
148
- AddToOutput ( _enumModule , null ) ;
149
- }
150
- }
151
- else if ( declaration . IdentifierName . Equals ( TypePseudoName ) )
152
- {
153
- if ( _typeModule == null )
154
- {
155
- _typeModule = declaration ;
156
- AddToOutput ( _typeModule , null ) ;
157
- }
158
- }
159
- else
160
- {
161
- AddToOutput ( declaration , null ) ;
162
- }
150
+ var declaration = CreateModuleDeclaration ( module , moduleName , project , attributes ) ;
151
+ var moduleTree = new SerializableDeclarationTree ( declaration ) ;
152
+ _declarations . Add ( declaration ) ;
153
+ _serialized . AddDeclaration ( moduleTree ) ;
163
154
164
155
var membered = module as IComTypeWithMembers ;
165
156
if ( membered != null )
166
157
{
167
158
foreach ( var item in membered . Members . Where ( m => ! m . IsRestricted && ! IgnoredInterfaceMembers . Contains ( m . Name ) ) )
168
159
{
169
160
var memberDeclaration = CreateMemberDeclaration ( item , moduleName , declaration ) ;
170
- AddToOutput ( memberDeclaration , declaration ) ;
161
+ _declarations . Add ( memberDeclaration ) ;
162
+
163
+ var memberTree = new SerializableDeclarationTree ( memberDeclaration ) ;
164
+ moduleTree . AddChildTree ( memberTree ) ;
165
+
171
166
var hasParams = memberDeclaration as IDeclarationWithParameter ;
172
167
if ( hasParams != null )
173
168
{
174
- AddRangeToOutput ( hasParams . Parameters , memberDeclaration ) ;
169
+ _declarations . AddRange ( hasParams . Parameters ) ;
170
+ memberTree . AddChildren ( hasParams . Parameters ) ;
175
171
}
176
172
var coClass = memberDeclaration as ClassModuleDeclaration ;
177
173
if ( coClass != null && item . IsDefault )
@@ -184,80 +180,53 @@ public List<Declaration> LoadDeclarationsFromLibrary()
184
180
var enumeration = module as ComEnumeration ;
185
181
if ( enumeration != null )
186
182
{
187
- var qualified = new QualifiedModuleName ( _referenceName , _path , EnumPseudoName ) ;
188
- var enumDeclaration = new Declaration ( enumeration , declaration , qualified ) ;
189
- var members = enumeration . Members . Select ( e => new Declaration ( e , enumDeclaration , qualified ) ) ;
190
- AddToOutput ( enumDeclaration , null ) ;
191
- AddRangeToOutput ( members , enumDeclaration ) ;
183
+ var enumDeclaration = new Declaration ( enumeration , declaration , moduleName ) ;
184
+ _declarations . Add ( enumDeclaration ) ;
185
+ var members = enumeration . Members . Select ( e => new Declaration ( e , enumDeclaration , moduleName ) ) . ToList ( ) ;
186
+ _declarations . AddRange ( members ) ;
187
+
188
+ var enumTree = new SerializableDeclarationTree ( enumDeclaration ) ;
189
+ moduleTree . AddChildTree ( enumTree ) ;
190
+ enumTree . AddChildren ( members ) ;
192
191
}
193
192
194
193
var structure = module as ComStruct ;
195
194
if ( structure != null )
196
195
{
197
- var qualified = new QualifiedModuleName ( _referenceName , _path , TypePseudoName ) ;
198
- var typeDeclaration = new Declaration ( structure , declaration , qualified ) ;
199
- var members = structure . Fields . Select ( f => new Declaration ( f , typeDeclaration , qualified ) ) ;
200
- AddToOutput ( typeDeclaration , null ) ;
201
- AddRangeToOutput ( members , typeDeclaration ) ;
196
+ var typeDeclaration = new Declaration ( structure , declaration , moduleName ) ;
197
+ _declarations . Add ( typeDeclaration ) ;
198
+ var members = structure . Fields . Select ( f => new Declaration ( f , typeDeclaration , moduleName ) ) . ToList ( ) ;
199
+ _declarations . AddRange ( members ) ;
200
+
201
+ var typeTree = new SerializableDeclarationTree ( typeDeclaration ) ;
202
+ moduleTree . AddChildTree ( typeTree ) ;
203
+ typeTree . AddChildren ( members ) ;
202
204
}
203
205
204
206
var fields = module as IComTypeWithFields ;
205
207
if ( fields == null || ! fields . Fields . Any ( ) )
206
208
{
207
209
continue ;
208
210
}
209
- var declarations = fields . Fields . Select ( f => new Declaration ( f , declaration , projectName ) ) ;
210
- AddRangeToOutput ( declarations , declaration ) ;
211
+ var declarations = fields . Fields . Select ( f => new Declaration ( f , declaration , projectName ) ) . ToList ( ) ;
212
+ _declarations . AddRange ( declarations ) ;
213
+ moduleTree . AddChildren ( declarations ) ;
211
214
}
212
215
_state . BuiltInDeclarationTrees . TryAdd ( _serialized ) ;
213
216
return _declarations ;
214
217
}
215
218
216
- private void AddToOutput ( Declaration declaration , Declaration parent )
217
- {
218
- _declarations . Add ( declaration ) ;
219
- //if (parent == null)
220
- //{
221
- // var tree = new SerializableDeclarationTree(declaration);
222
- // _treeLookup.Add(declaration, tree);
223
- // _serialized.AddDeclaration(tree);
224
- //}
225
- //else
226
- //{
227
- // var tree = new SerializableDeclarationTree(declaration);
228
- // Debug.Assert(!_treeLookup.ContainsKey(declaration));
229
- // _treeLookup.Add(declaration, tree);
230
- // _treeLookup[parent].AddChildTree(tree);
231
- //}
232
- }
233
-
234
- private void AddRangeToOutput ( IEnumerable < Declaration > declarations , Declaration parent )
235
- {
236
- //Debug.Assert(parent != null);
237
- //var tree = _treeLookup[parent];
238
- foreach ( var declaration in declarations )
239
- {
240
- // Debug.Assert(!_treeLookup.ContainsKey(declaration));
241
- // var child = new SerializableDeclarationTree(declaration);
242
- // _treeLookup.Add(declaration, child);
243
- // tree.AddChildTree(child);
244
- _declarations . Add ( declaration ) ;
245
- }
246
- }
247
-
248
219
private Declaration CreateModuleDeclaration ( IComType module , QualifiedModuleName project , Declaration parent , Attributes attributes )
249
220
{
250
221
var enumeration = module as ComEnumeration ;
251
222
if ( enumeration != null )
252
223
{
253
- //There's no real reason that these can't all live in one pseudo-module.
254
- return _enumModule ?? new ProceduralModuleDeclaration ( EnumPseudoName , parent , project ) ;
224
+ return new ProceduralModuleDeclaration ( enumeration , parent , project ) ;
255
225
}
256
226
var types = module as ComStruct ;
257
227
if ( types != null )
258
228
{
259
- //There's also no real reason that *these* can't all live in one pseudo-module.
260
- return _typeModule ?? new ProceduralModuleDeclaration ( TypePseudoName , parent , project ) ;
229
+ return new ProceduralModuleDeclaration ( types , parent , project ) ;
261
230
}
262
231
var coClass = module as ComCoClass ;
263
232
var intrface = module as ComInterface ;
@@ -311,30 +280,5 @@ private Declaration CreateMemberDeclaration(ComMember member, QualifiedModuleNam
311
280
throw new InvalidEnumArgumentException ( string . Format ( "Unexpected DeclarationType {0} encountered." , member . Type ) ) ;
312
281
}
313
282
}
314
-
315
- //private SerializableProject GetSerializableProject(ProjectDeclaration declaration, List<Declaration> declarations)
316
- //{
317
- // var project = new SerializableProject(declaration);
318
- // var children = new List<SerializableDeclarationTree>();
319
- // var nodes = declarations.Where(x => x.ParentDeclaration.Equals(declaration)).ToList();
320
- // foreach (var item in nodes)
321
- // {
322
- // children.Add(GetSerializableTreeForDeclaration(item, declarations));
323
- // }
324
- // project.Declarations = children;
325
- // return project;
326
- //}
327
-
328
- //private SerializableDeclarationTree GetSerializableTreeForDeclaration(Declaration declaration, List<Declaration> declarations)
329
- //{
330
- // var children = new List<SerializableDeclarationTree>();
331
- // var nodes = declarations.Where(x => x.ParentDeclaration.Equals(declaration)).ToList();
332
- // declarations.RemoveAll(nodes.Contains);
333
- // foreach (var item in nodes)
334
- // {
335
- // children.Add(GetSerializableTreeForDeclaration(item, declarations));
336
- // }
337
- // return new SerializableDeclarationTree(declaration, children);
338
- //}
339
283
}
340
284
}
0 commit comments