Skip to content

Commit 86d84ec

Browse files
authored
Merge pull request #1906 from Hosch250/COMCollectorBugs
Only cache members with GUID's
2 parents 5633446 + 05141a3 commit 86d84ec

File tree

1 file changed

+69
-53
lines changed

1 file changed

+69
-53
lines changed

Rubberduck.Parsing/Symbols/ReferencedDeclarationsCollector.cs

Lines changed: 69 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -263,18 +263,29 @@ public List<Declaration> GetDeclarationsForReference(Reference reference)
263263
break;
264264
}
265265

266-
ComInformation comInfo;
267-
if (_comInformation.TryGetValue(typeAttributes.guid, out comInfo))
266+
if (typeAttributes.guid == Guid.Empty)
268267
{
269-
comInfo.TypeQualifiedModuleName = typeQualifiedModuleName;
270-
comInfo.ModuleDeclaration = moduleDeclaration;
271-
comInfo.TypeDeclarationType = typeDeclarationType;
268+
LoadDeclarationsInModule(output,
269+
new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName,
270+
moduleDeclaration,
271+
typeDeclarationType));
272272
}
273273
else
274274
{
275-
_comInformation.Add(typeAttributes.guid,
276-
new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName, moduleDeclaration,
277-
typeDeclarationType));
275+
ComInformation comInfo;
276+
if (_comInformation.TryGetValue(typeAttributes.guid, out comInfo))
277+
{
278+
comInfo.TypeQualifiedModuleName = typeQualifiedModuleName;
279+
comInfo.ModuleDeclaration = moduleDeclaration;
280+
comInfo.TypeDeclarationType = typeDeclarationType;
281+
}
282+
else
283+
{
284+
_comInformation.Add(typeAttributes.guid,
285+
new ComInformation(typeAttributes, 0, info, typeName, typeQualifiedModuleName,
286+
moduleDeclaration,
287+
typeDeclarationType));
288+
}
278289
}
279290

280291
info.ReleaseTypeAttr(typeAttributesPointer);
@@ -284,64 +295,69 @@ public List<Declaration> GetDeclarationsForReference(Reference reference)
284295

285296
foreach (var member in _comInformation.Values)
286297
{
287-
if (member.TypeAttributes.typekind == TYPEKIND.TKIND_COCLASS)
288-
{
289-
GetCoClassInformation(member);
290-
}
298+
LoadDeclarationsInModule(output, member);
299+
}
291300

292-
for (var memberIndex = 0; memberIndex < member.TypeAttributes.cFuncs; memberIndex++)
293-
{
294-
string[] memberNames;
301+
return output;
302+
}
295303

296-
IntPtr memberDescriptorPointer;
297-
member.TypeInfo.GetFuncDesc(memberIndex, out memberDescriptorPointer);
298-
var memberDescriptor = (FUNCDESC)Marshal.PtrToStructure(memberDescriptorPointer, typeof(FUNCDESC));
304+
private void LoadDeclarationsInModule(List<Declaration> output, ComInformation member)
305+
{
306+
if (member.TypeAttributes.typekind == TYPEKIND.TKIND_COCLASS)
307+
{
308+
GetCoClassInformation(member);
309+
}
299310

300-
var memberDeclaration = CreateMemberDeclaration(memberDescriptor, member.TypeAttributes.typekind, member.TypeInfo, member.ImplTypeFlags,
301-
member.TypeQualifiedModuleName, member.ModuleDeclaration, out memberNames);
302-
if (memberDeclaration == null)
303-
{
304-
member.TypeInfo.ReleaseFuncDesc(memberDescriptorPointer);
305-
continue;
306-
}
311+
for (var memberIndex = 0; memberIndex < member.TypeAttributes.cFuncs; memberIndex++)
312+
{
313+
string[] memberNames;
307314

308-
if (member.ModuleDeclaration.DeclarationType == DeclarationType.ClassModule &&
309-
memberDeclaration is ICanBeDefaultMember &&
310-
((ICanBeDefaultMember)memberDeclaration).IsDefaultMember)
311-
{
312-
((ClassModuleDeclaration)member.ModuleDeclaration).DefaultMember = memberDeclaration;
313-
}
314-
output.Add(memberDeclaration);
315+
IntPtr memberDescriptorPointer;
316+
member.TypeInfo.GetFuncDesc(memberIndex, out memberDescriptorPointer);
317+
var memberDescriptor = (FUNCDESC)Marshal.PtrToStructure(memberDescriptorPointer, typeof(FUNCDESC));
315318

316-
var parameterCount = memberDescriptor.cParams - (memberDescriptor.invkind.HasFlag(INVOKEKIND.INVOKE_PROPERTYGET) ? 0 : 1);
317-
var parameters = new List<ParameterDeclaration>();
318-
for (var paramIndex = 0; paramIndex < parameterCount; paramIndex++)
319-
{
320-
var parameter = CreateParameterDeclaration(memberNames, paramIndex, memberDescriptor,
321-
member.TypeQualifiedModuleName, memberDeclaration, member.TypeInfo);
322-
var declaration = memberDeclaration as IDeclarationWithParameter;
323-
if (declaration != null)
324-
{
325-
parameters.Add(parameter);
326-
declaration.AddParameter(parameter);
327-
}
328-
output.Add(parameter);
329-
}
319+
var memberDeclaration = CreateMemberDeclaration(memberDescriptor, member.TypeAttributes.typekind, member.TypeInfo, member.ImplTypeFlags,
320+
member.TypeQualifiedModuleName, member.ModuleDeclaration, out memberNames);
321+
if (memberDeclaration == null)
322+
{
330323
member.TypeInfo.ReleaseFuncDesc(memberDescriptorPointer);
331-
if (parameters.Any() && memberDescriptor.cParamsOpt == -1)
324+
continue;
325+
}
326+
327+
if (member.ModuleDeclaration.DeclarationType == DeclarationType.ClassModule &&
328+
memberDeclaration is ICanBeDefaultMember &&
329+
((ICanBeDefaultMember)memberDeclaration).IsDefaultMember)
330+
{
331+
((ClassModuleDeclaration)member.ModuleDeclaration).DefaultMember = memberDeclaration;
332+
}
333+
output.Add(memberDeclaration);
334+
335+
var parameterCount = memberDescriptor.cParams - (memberDescriptor.invkind.HasFlag(INVOKEKIND.INVOKE_PROPERTYGET) ? 0 : 1);
336+
var parameters = new List<ParameterDeclaration>();
337+
for (var paramIndex = 0; paramIndex < parameterCount; paramIndex++)
338+
{
339+
var parameter = CreateParameterDeclaration(memberNames, paramIndex, memberDescriptor,
340+
member.TypeQualifiedModuleName, memberDeclaration, member.TypeInfo);
341+
var declaration = memberDeclaration as IDeclarationWithParameter;
342+
if (declaration != null)
332343
{
333-
parameters.Last().IsParamArray = true;
344+
parameters.Add(parameter);
345+
declaration.AddParameter(parameter);
334346
}
347+
output.Add(parameter);
335348
}
336-
337-
for (var fieldIndex = 0; fieldIndex < member.TypeAttributes.cVars; fieldIndex++)
349+
member.TypeInfo.ReleaseFuncDesc(memberDescriptorPointer);
350+
if (parameters.Any() && memberDescriptor.cParamsOpt == -1)
338351
{
339-
output.Add(CreateFieldDeclaration(member.TypeInfo, fieldIndex, member.TypeDeclarationType, member.TypeQualifiedModuleName,
340-
member.ModuleDeclaration));
352+
parameters.Last().IsParamArray = true;
341353
}
342354
}
343355

344-
return output;
356+
for (var fieldIndex = 0; fieldIndex < member.TypeAttributes.cVars; fieldIndex++)
357+
{
358+
output.Add(CreateFieldDeclaration(member.TypeInfo, fieldIndex, member.TypeDeclarationType, member.TypeQualifiedModuleName,
359+
member.ModuleDeclaration));
360+
}
345361
}
346362

347363
private void GetCoClassInformation(ComInformation member)

0 commit comments

Comments
 (0)