Skip to content

Commit 3c7ce42

Browse files
committed
ReferencedDeclarationsCollector produces a SerializableDeclarationTree
1 parent 7b12e6d commit 3c7ce42

File tree

5 files changed

+58
-18
lines changed

5 files changed

+58
-18
lines changed

RetailCoder.VBE/UI/Command/MenuItems/CommandBars/SerializeDeclarationsCommandMenuItem.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,8 @@ public void Persist(string path, IEnumerable<SerializableDeclaration> items)
8181

8282
public IEnumerable<SerializableDeclaration> Load(string path)
8383
{
84-
if (string.IsNullOrEmpty(FullPath)) { throw new InvalidOperationException(); }
84+
if (string.IsNullOrEmpty(path)) { throw new InvalidOperationException(); }
8585
throw new NotImplementedException();
8686
}
87-
88-
public string FullPath { get; set; }
8987
}
9088
}

Rubberduck.Parsing/Rubberduck.Parsing.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
<Reference Include="System" />
5454
<Reference Include="System.Core" />
5555
<Reference Include="Microsoft.CSharp" />
56+
<Reference Include="System.Runtime.Serialization" />
5657
</ItemGroup>
5758
<ItemGroup>
5859
<Compile Include="Annotations\AnnotationBase.cs" />

Rubberduck.Parsing/Symbols/ComInformation.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Runtime.InteropServices.ComTypes;
1+
using System.Collections.Generic;
2+
using System.Runtime.InteropServices.ComTypes;
23
using Rubberduck.VBEditor;
34

45
namespace Rubberduck.Parsing.Symbols
@@ -25,6 +26,9 @@ public ComInformation(TYPEATTR typeAttributes, IMPLTYPEFLAGS implTypeFlags, ITyp
2526
public Declaration ModuleDeclaration { get; internal set; }
2627
public DeclarationType TypeDeclarationType { get; internal set; }
2728

29+
private readonly List<SerializableDeclarationTree> _trees = new List<SerializableDeclarationTree>();
30+
internal IList<SerializableDeclarationTree> MemberTrees { get { return _trees; } }
31+
2832
public override string ToString()
2933
{
3034
return ModuleDeclaration.IdentifierName;

Rubberduck.Parsing/Symbols/ReferencedDeclarationsCollector.cs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
using Rubberduck.Parsing.Grammar;
2020
using IMPLTYPEFLAGS = System.Runtime.InteropServices.ComTypes.IMPLTYPEFLAGS;
2121
using System.Linq;
22-
using Rubberduck.VBEditor.SafeComWrappers;
2322
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
24-
using Rubberduck.VBEditor.SafeComWrappers.VBA;
2523

2624
namespace Rubberduck.Parsing.Symbols
2725
{
@@ -148,7 +146,7 @@ private string GetTypeName(ITypeInfo info)
148146
return typeName.Equals("LONG_PTR") ? "LongPtr" : typeName; //Quickfix for http://chat.stackexchange.com/transcript/message/30119269#30119269
149147
}
150148

151-
public List<Declaration> GetDeclarationsForReference(IReference reference)
149+
public List<Declaration> GetDeclarationsForReference(IReference reference, out SerializableDeclarationTree tree)
152150
{
153151
var output = new List<Declaration>();
154152
var projectName = reference.Name;
@@ -158,12 +156,14 @@ public List<Declaration> GetDeclarationsForReference(IReference reference)
158156
LoadTypeLibEx(path, REGKIND.REGKIND_NONE, out typeLibrary);
159157
if (typeLibrary == null)
160158
{
159+
tree = null;
161160
return output;
162161
}
163162
var projectQualifiedModuleName = new QualifiedModuleName(projectName, path, projectName);
164163
var projectQualifiedMemberName = new QualifiedMemberName(projectQualifiedModuleName, projectName);
165164
var projectDeclaration = new ProjectDeclaration(projectQualifiedMemberName, projectName, isBuiltIn: true);
166165
output.Add(projectDeclaration);
166+
var moduleTrees = new List<SerializableDeclarationTree>();
167167

168168
var typeCount = typeLibrary.GetTypeInfoCount();
169169
for (var i = 0; i < typeCount; i++)
@@ -175,6 +175,7 @@ public List<Declaration> GetDeclarationsForReference(IReference reference)
175175
}
176176
catch (NullReferenceException)
177177
{
178+
tree = null;
178179
return output;
179180
}
180181

@@ -265,16 +266,14 @@ public List<Declaration> GetDeclarationsForReference(IReference reference)
265266
break;
266267
}
267268

269+
ComInformation comInfo;
268270
if (typeAttributes.guid == Guid.Empty)
269271
{
270-
LoadDeclarationsInModule(output,
271-
new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName,
272-
moduleDeclaration,
273-
typeDeclarationType));
272+
comInfo = new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName, moduleDeclaration, typeDeclarationType);
273+
LoadDeclarationsInModule(output, comInfo);
274274
}
275275
else
276276
{
277-
ComInformation comInfo;
278277
if (_comInformation.TryGetValue(typeAttributes.guid, out comInfo))
279278
{
280279
comInfo.TypeQualifiedModuleName = typeQualifiedModuleName;
@@ -283,26 +282,33 @@ public List<Declaration> GetDeclarationsForReference(IReference reference)
283282
}
284283
else
285284
{
286-
_comInformation.Add(typeAttributes.guid,
287-
new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName,
288-
moduleDeclaration,
289-
typeDeclarationType));
285+
comInfo = new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName, moduleDeclaration, typeDeclarationType);
286+
_comInformation.Add(typeAttributes.guid, comInfo);
290287
}
291288
}
292289

293290
info.ReleaseTypeAttr(typeAttributesPointer);
294291

295292
output.Add(moduleDeclaration);
293+
var moduleTree = new SerializableDeclarationTree(new SerializableDeclaration(moduleDeclaration), comInfo.MemberTrees);
294+
moduleTrees.Add(moduleTree);
296295
}
297296

298297
foreach (var member in _comInformation.Values)
299298
{
300299
LoadDeclarationsInModule(output, member);
301300
}
302301

302+
tree = new SerializableDeclarationTree(new SerializableDeclaration(projectDeclaration), moduleTrees);
303303
return output;
304304
}
305305

306+
public List<Declaration> GetDeclarationsForReference(IReference reference)
307+
{
308+
SerializableDeclarationTree tree;
309+
return GetDeclarationsForReference(reference, out tree);
310+
}
311+
306312
private void LoadDeclarationsInModule(List<Declaration> output, ComInformation member)
307313
{
308314
if (member.TypeAttributes.typekind == TYPEKIND.TKIND_COCLASS)
@@ -353,12 +359,17 @@ memberDeclaration is ICanBeDefaultMember &&
353359
{
354360
parameters.Last().IsParamArray = true;
355361
}
362+
363+
var parameterTrees = parameters.Select(p => new SerializableDeclarationTree(p));
364+
var tree = new SerializableDeclarationTree(new SerializableDeclaration(memberDeclaration), parameterTrees);
365+
member.MemberTrees.Add(tree);
356366
}
357367

358368
for (var fieldIndex = 0; fieldIndex < member.TypeAttributes.cVars; fieldIndex++)
359369
{
360-
output.Add(CreateFieldDeclaration(member.TypeInfo, fieldIndex, member.TypeDeclarationType, member.TypeQualifiedModuleName,
361-
member.ModuleDeclaration));
370+
var declaration = CreateFieldDeclaration(member.TypeInfo, fieldIndex, member.TypeDeclarationType, member.TypeQualifiedModuleName, member.ModuleDeclaration);
371+
output.Add(declaration);
372+
member.MemberTrees.Add(new SerializableDeclarationTree(declaration));
362373
}
363374
}
364375

Rubberduck.Parsing/Symbols/SerializableDeclaration.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using System.Runtime.Serialization;
34
using Rubberduck.Parsing.Annotations;
45
using Rubberduck.Parsing.VBA;
56
using Rubberduck.VBEditor;
67

78
namespace Rubberduck.Parsing.Symbols
89
{
10+
[DataContract]
11+
public class SerializableDeclarationTree
12+
{
13+
private readonly SerializableDeclaration _node;
14+
private readonly IEnumerable<SerializableDeclarationTree> _children;
15+
16+
public SerializableDeclarationTree(Declaration declaration)
17+
: this(new SerializableDeclaration(declaration)) { }
18+
19+
public SerializableDeclarationTree(SerializableDeclaration node)
20+
: this(node, Enumerable.Empty<SerializableDeclarationTree>()) { }
21+
22+
public SerializableDeclarationTree(SerializableDeclaration node, IEnumerable<SerializableDeclarationTree> children)
23+
{
24+
_node = node;
25+
_children = children;
26+
}
27+
28+
[DataMember]
29+
public SerializableDeclaration Node { get { return _node; } }
30+
31+
[DataMember]
32+
public IEnumerable<SerializableDeclarationTree> Children { get { return _children; } }
33+
}
34+
935
public class SerializableDeclaration
1036
{
1137
public SerializableDeclaration()

0 commit comments

Comments
 (0)