Skip to content

Commit 88cde47

Browse files
committed
cached interface members & implementations
1 parent 3c48a19 commit 88cde47

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

Rubberduck.Parsing/Symbols/Declarations.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,33 +56,46 @@ public IEnumerable<Declaration> FindEventHandlers(Declaration control)
5656
DeclarationType.PropertySet
5757
};
5858

59+
private IEnumerable<Declaration> _interfaceMembers;
60+
5961
/// <summary>
6062
/// Finds all interface members.
6163
/// </summary>
6264
public IEnumerable<Declaration> FindInterfaceMembers()
6365
{
66+
if (_interfaceMembers != null)
67+
{
68+
return _interfaceMembers;
69+
}
70+
6471
var classes = _declarations.Where(item => item.DeclarationType == DeclarationType.Class);
6572
var interfaces = classes.Where(item => item.References.Any(reference =>
66-
reference.Context.Parent is VBAParser.ImplementsStmtContext))
67-
.Select(i => i.Scope)
68-
.ToList();
69-
70-
var members = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
71-
&& interfaces.Any(i => item.ParentScope.StartsWith(i)));
73+
reference.Context.Parent is VBAParser.ImplementsStmtContext))
74+
.Select(i => i.Scope)
75+
.ToList();
7276

73-
return members;
77+
_interfaceMembers = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
78+
&& interfaces.Any(i => item.ParentScope.StartsWith(i)));
79+
return _interfaceMembers;
7480
}
7581

82+
private IEnumerable<Declaration> _interfaceImplementationMembers;
83+
7684
/// <summary>
7785
/// Finds all class members that are interface implementation members.
7886
/// </summary>
7987
public IEnumerable<Declaration> FindInterfaceImplementationMembers()
8088
{
89+
if (_interfaceImplementationMembers != null)
90+
{
91+
return _interfaceImplementationMembers;
92+
}
93+
8194
var members = FindInterfaceMembers();
82-
var implementations = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
95+
_interfaceImplementationMembers = _declarations.Where(item => ProcedureTypes.Contains(item.DeclarationType)
8396
&& members.Select(m => m.ComponentName + '_' + m.IdentifierName).Contains(item.IdentifierName));
8497

85-
return implementations;
98+
return _interfaceImplementationMembers;
8699
}
87100
}
88101
}

0 commit comments

Comments
 (0)