Skip to content

Commit 8bb1230

Browse files
cominternretailcoder
authored andcommitted
Convert GetDeclarationsForReference return to List<Declaration> (#1658)
* Convert GetDeclarationsForReference return to List<Declaration> to remove yield => .ToList() paradigm. * Small refactor in CreateParameterDeclaration to allow releasing struct.
1 parent dede9b2 commit 8bb1230

File tree

2 files changed

+28
-23
lines changed

2 files changed

+28
-23
lines changed

Rubberduck.Parsing/Symbols/ReferencedDeclarationsCollector.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics;
43
using System.Runtime.InteropServices;
54
using System.Runtime.InteropServices.ComTypes;
65
using Microsoft.Vbe.Interop;
@@ -19,7 +18,6 @@
1918
using TYPEFLAGS = System.Runtime.InteropServices.ComTypes.TYPEFLAGS;
2019
using VARDESC = System.Runtime.InteropServices.ComTypes.VARDESC;
2120
using Rubberduck.Parsing.Annotations;
22-
using System.Linq;
2321
using Rubberduck.Parsing.Grammar;
2422

2523
namespace Rubberduck.Parsing.Symbols
@@ -130,21 +128,22 @@ private string GetTypeName(ITypeInfo info)
130128
return typeName;
131129
}
132130

133-
public IEnumerable<Declaration> GetDeclarationsForReference(Reference reference)
131+
public List<Declaration> GetDeclarationsForReference(Reference reference)
134132
{
133+
var output = new List<Declaration>();
135134
var projectName = reference.Name;
136135
var path = reference.FullPath;
137136
ITypeLib typeLibrary;
138137
// Failure to load might mean that it's a "normal" VBProject that will get parsed by us anyway.
139138
LoadTypeLibEx(path, REGKIND.REGKIND_NONE, out typeLibrary);
140139
if (typeLibrary == null)
141140
{
142-
yield break;
141+
return output;
143142
}
144143
var projectQualifiedModuleName = new QualifiedModuleName(projectName, path, projectName);
145144
var projectQualifiedMemberName = new QualifiedMemberName(projectQualifiedModuleName, projectName);
146145
var projectDeclaration = new ProjectDeclaration(projectQualifiedMemberName, projectName, isBuiltIn: true);
147-
yield return projectDeclaration;
146+
output.Add(projectDeclaration);
148147

149148
var typeCount = typeLibrary.GetTypeInfoCount();
150149
for (var i = 0; i < typeCount; i++)
@@ -156,7 +155,7 @@ public IEnumerable<Declaration> GetDeclarationsForReference(Reference reference)
156155
}
157156
catch (NullReferenceException)
158157
{
159-
yield break;
158+
return output;
160159
}
161160

162161
if (info == null)
@@ -241,53 +240,56 @@ public IEnumerable<Declaration> GetDeclarationsForReference(Reference reference)
241240
attributes);
242241
break;
243242
}
243+
info.ReleaseTypeAttr(typeAttributesPointer);
244244

245-
yield return moduleDeclaration;
245+
output.Add(moduleDeclaration);
246246

247247
for (var memberIndex = 0; memberIndex < typeAttributes.cFuncs; memberIndex++)
248248
{
249-
FUNCDESC memberDescriptor;
250249
string[] memberNames;
251-
var memberDeclaration = CreateMemberDeclaration(out memberDescriptor, typeAttributes.typekind, info, memberIndex, typeQualifiedModuleName, moduleDeclaration, out memberNames);
250+
251+
IntPtr memberDescriptorPointer;
252+
info.GetFuncDesc(memberIndex, out memberDescriptorPointer);
253+
var memberDescriptor = (FUNCDESC)Marshal.PtrToStructure(memberDescriptorPointer, typeof(FUNCDESC));
254+
var memberDeclaration = CreateMemberDeclaration(memberDescriptor, typeAttributes.typekind, info, memberIndex, typeQualifiedModuleName, moduleDeclaration, out memberNames);
252255
if (memberDeclaration == null)
253256
{
257+
info.ReleaseFuncDesc(memberDescriptorPointer);
254258
continue;
255259
}
256260
if (moduleDeclaration.DeclarationType == DeclarationType.ClassModule && memberDeclaration is ICanBeDefaultMember && ((ICanBeDefaultMember)memberDeclaration).IsDefaultMember)
257261
{
258262
((ClassModuleDeclaration)moduleDeclaration).DefaultMember = memberDeclaration;
259263
}
260-
yield return memberDeclaration;
264+
output.Add(memberDeclaration);
261265

262266
var parameterCount = memberDescriptor.cParams - 1;
263267
for (var paramIndex = 0; paramIndex < parameterCount; paramIndex++)
264268
{
265269
var parameter = CreateParameterDeclaration(memberNames, paramIndex, memberDescriptor, typeQualifiedModuleName, memberDeclaration, info);
266-
if (memberDeclaration is IDeclarationWithParameter)
270+
var declaration = memberDeclaration as IDeclarationWithParameter;
271+
if (declaration != null)
267272
{
268-
((IDeclarationWithParameter)memberDeclaration).AddParameter(parameter);
273+
declaration.AddParameter(parameter);
269274
}
270-
yield return parameter;
275+
output.Add(parameter);
271276
}
277+
info.ReleaseFuncDesc(memberDescriptorPointer);
272278
}
273279

274280
for (var fieldIndex = 0; fieldIndex < typeAttributes.cVars; fieldIndex++)
275281
{
276-
yield return CreateFieldDeclaration(info, fieldIndex, typeDeclarationType, typeQualifiedModuleName, moduleDeclaration);
282+
output.Add(CreateFieldDeclaration(info, fieldIndex, typeDeclarationType, typeQualifiedModuleName, moduleDeclaration));
277283
}
278284
}
285+
return output;
279286
}
280287

281-
private Declaration CreateMemberDeclaration(out FUNCDESC memberDescriptor, TYPEKIND typeKind, ITypeInfo info, int memberIndex,
288+
private Declaration CreateMemberDeclaration(FUNCDESC memberDescriptor, TYPEKIND typeKind, ITypeInfo info, int memberIndex,
282289
QualifiedModuleName typeQualifiedModuleName, Declaration moduleDeclaration, out string[] memberNames)
283290
{
284-
IntPtr memberDescriptorPointer;
285-
info.GetFuncDesc(memberIndex, out memberDescriptorPointer);
286-
memberDescriptor = (FUNCDESC)Marshal.PtrToStructure(memberDescriptorPointer, typeof(FUNCDESC));
287-
288291
if (memberDescriptor.callconv != CALLCONV.CC_STDCALL)
289292
{
290-
memberDescriptor = new FUNCDESC();
291293
memberNames = new string[] { };
292294
return null;
293295
}
@@ -425,7 +427,8 @@ private Declaration CreateFieldDeclaration(ITypeInfo info, int fieldIndex, Decla
425427
var fieldName = names[0];
426428
var memberType = GetDeclarationType(varDesc, typeDeclarationType);
427429

428-
var asTypeName = GetTypeName(varDesc.elemdescVar.tdesc, info);
430+
var asTypeName = GetTypeName(varDesc.elemdescVar.tdesc, info);
431+
info.ReleaseVarDesc(ppVarDesc);
429432

430433
return new Declaration(new QualifiedMemberName(typeQualifiedModuleName, fieldName),
431434
moduleDeclaration, moduleDeclaration, asTypeName, null, false, false, Accessibility.Global, memberType, null,
@@ -458,6 +461,7 @@ private ParameterDeclaration CreateParameterDeclaration(IReadOnlyList<string> me
458461

459462
private IEnumerable<string> GetImplementedInterfaceNames(TYPEATTR typeAttr, ITypeInfo info)
460463
{
464+
var output = new List<string>();
461465
for (var implIndex = 0; implIndex < typeAttr.cImplTypes; implIndex++)
462466
{
463467
int href;
@@ -470,10 +474,11 @@ private IEnumerable<string> GetImplementedInterfaceNames(TYPEATTR typeAttr, ITyp
470474
if (implTypeName != "IDispatch" && implTypeName != "IUnknown")
471475
{
472476
// skip IDispatch.. just about everything implements it and RD doesn't need to care about it; don't care about IUnknown either
473-
yield return implTypeName;
477+
output.Add(implTypeName);
474478
}
475479
//Debug.WriteLine(string.Format("\tImplements {0}", implTypeName));
476480
}
481+
return output;
477482
}
478483

479484
private DeclarationType GetDeclarationType(ITypeLib typeLibrary, int i)

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ private void SyncComReferences(IReadOnlyList<VBProject> projects)
348348
if (!map.IsLoaded)
349349
{
350350
_state.OnStatusMessageUpdate(ParserState.LoadingReference.ToString());
351-
var items = _comReflector.GetDeclarationsForReference(reference).ToList();
351+
var items = _comReflector.GetDeclarationsForReference(reference);
352352
foreach (var declaration in items)
353353
{
354354
_state.AddDeclaration(declaration);

0 commit comments

Comments
 (0)