Skip to content

Commit a4911b7

Browse files
committed
De-consolidate enums and types again (:sigh:), hook serialization back up.
1 parent c433ff7 commit a4911b7

File tree

3 files changed

+74
-113
lines changed

3 files changed

+74
-113
lines changed

Rubberduck.Parsing/Symbols/ProceduralModuleDeclaration.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,21 @@ public ProceduralModuleDeclaration(ComModule statics, Declaration parent, Qualif
4646
IsPrivateModule = statics.IsRestricted;
4747
}
4848

49-
//This is the pseudo-module ctor for COM enumerations and types.
50-
public ProceduralModuleDeclaration(string pseudo, Declaration parent, QualifiedModuleName module)
49+
//These are the pseudo-module ctor for COM enumerations and types.
50+
public ProceduralModuleDeclaration(ComEnumeration pseudo, Declaration parent, QualifiedModuleName module)
5151
: this(
52-
module.QualifyMemberName(pseudo),
52+
module.QualifyMemberName(pseudo.Name),
5353
parent,
54-
pseudo,
54+
pseudo.Name,
55+
true,
56+
new List<IAnnotation>(),
57+
new Attributes()) { }
58+
59+
public ProceduralModuleDeclaration(ComStruct pseudo, Declaration parent, QualifiedModuleName module)
60+
: this(
61+
module.QualifyMemberName(pseudo.Name),
62+
parent,
63+
pseudo.Name,
5564
true,
5665
new List<IAnnotation>(),
5766
new Attributes()) { }

Rubberduck.Parsing/Symbols/ReferencedDeclarationsCollector.cs

Lines changed: 53 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel;
4-
using System.Diagnostics;
54
using System.IO;
65
using System.Runtime.InteropServices;
76
using System.Runtime.InteropServices.ComTypes;
@@ -47,14 +46,8 @@ private enum REGKIND
4746

4847
private readonly RubberduckParserState _state;
4948
private SerializableProject _serialized;
50-
private readonly Dictionary<Declaration, SerializableDeclarationTree> _treeLookup = new Dictionary<Declaration, SerializableDeclarationTree>();
5149
private readonly List<Declaration> _declarations = new List<Declaration>();
5250

53-
private const string EnumPseudoName = "Enums";
54-
private Declaration _enumModule;
55-
private const string TypePseudoName = "Types";
56-
private Declaration _typeModule;
57-
5851
private static readonly HashSet<string> IgnoredInterfaceMembers = new HashSet<string>
5952
{
6053
"QueryInterface",
@@ -95,13 +88,29 @@ public bool SerializedVersionExists
9588
}
9689
}
9790

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+
9898
public List<Declaration> LoadDeclarationsFromXml()
9999
{
100100
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Rubberduck", "Declarations");
101101
var file = Path.Combine(path, string.Format("{0}.{1}.{2}", _referenceName, _referenceMajor, _referenceMinor) + ".xml");
102102
var reader = new XmlPersistableDeclarations();
103103
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;
105114
}
106115

107116
public List<Declaration> LoadDeclarationsFromLibrary()
@@ -123,7 +132,10 @@ public List<Declaration> LoadDeclarationsFromLibrary()
123132

124133
foreach (var module in type.Members)
125134
{
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);
127139

128140
var attributes = new Attributes();
129141
if (module.IsPreDeclared)
@@ -135,43 +147,27 @@ public List<Declaration> LoadDeclarationsFromLibrary()
135147
attributes.AddGlobalClassAttribute();
136148
}
137149

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);
163154

164155
var membered = module as IComTypeWithMembers;
165156
if (membered != null)
166157
{
167158
foreach (var item in membered.Members.Where(m => !m.IsRestricted && !IgnoredInterfaceMembers.Contains(m.Name)))
168159
{
169160
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+
171166
var hasParams = memberDeclaration as IDeclarationWithParameter;
172167
if (hasParams != null)
173168
{
174-
AddRangeToOutput(hasParams.Parameters, memberDeclaration);
169+
_declarations.AddRange(hasParams.Parameters);
170+
memberTree.AddChildren(hasParams.Parameters);
175171
}
176172
var coClass = memberDeclaration as ClassModuleDeclaration;
177173
if (coClass != null && item.IsDefault)
@@ -184,80 +180,53 @@ public List<Declaration> LoadDeclarationsFromLibrary()
184180
var enumeration = module as ComEnumeration;
185181
if (enumeration != null)
186182
{
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);
192191
}
193192

194193
var structure = module as ComStruct;
195194
if (structure != null)
196195
{
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);
202204
}
203205

204206
var fields = module as IComTypeWithFields;
205207
if (fields == null || !fields.Fields.Any())
206208
{
207209
continue;
208210
}
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);
211214
}
212215
_state.BuiltInDeclarationTrees.TryAdd(_serialized);
213216
return _declarations;
214217
}
215218

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-
248219
private Declaration CreateModuleDeclaration(IComType module, QualifiedModuleName project, Declaration parent, Attributes attributes)
249220
{
250221
var enumeration = module as ComEnumeration;
251222
if (enumeration != null)
252223
{
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);
255225
}
256226
var types = module as ComStruct;
257227
if (types != null)
258228
{
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);
261230
}
262231
var coClass = module as ComCoClass;
263232
var intrface = module as ComInterface;
@@ -311,30 +280,5 @@ private Declaration CreateMemberDeclaration(ComMember member, QualifiedModuleNam
311280
throw new InvalidEnumArgumentException(string.Format("Unexpected DeclarationType {0} encountered.", member.Type));
312281
}
313282
}
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-
//}
339283
}
340284
}

Rubberduck.Parsing/Symbols/SerializableDeclaration.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ public SerializableDeclarationTree(SerializableDeclaration node, IEnumerable<Ser
3636
Children = children;
3737
}
3838

39+
public void AddChildren(IEnumerable<Declaration> declarations)
40+
{
41+
foreach (var child in declarations)
42+
{
43+
_children.Add(new SerializableDeclarationTree(child));
44+
}
45+
}
46+
3947
public void AddChildTree(SerializableDeclarationTree tree)
4048
{
4149
_children.Add(tree);

0 commit comments

Comments
 (0)