Browse Source

Make SymbolCollector take a Lazy<TypeGraph> - it's expensive to construct and only used for some members.

pull/516/head
Daniel Grunwald 11 years ago
parent
commit
bede4f6643
  1. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs
  2. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs
  3. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs
  4. 18
      src/Libraries/NRefactory/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs

@ -87,7 +87,7 @@ namespace CSharpBinding @@ -87,7 +87,7 @@ namespace CSharpBinding
IEnumerable<ISymbol> GetRelatedSymbols(ISymbol entity)
{
TypeGraph typeGraph = new TypeGraph(new [] { compilation.MainAssembly });
var typeGraph = new Lazy<TypeGraph>(() => new TypeGraph(new [] { compilation.MainAssembly }));
var symbolCollector = new SymbolCollector();
return symbolCollector.GetRelatedSymbols(typeGraph, entity);
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/Analysis/SymbolCollectorTests.cs

@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -60,7 +60,7 @@ namespace ICSharpCode.NRefactory.Analysis
col.IncludeOverloads = includeOverloads;
col.GroupForRenaming = true;
var result = col.GetRelatedSymbols (new TypeGraph (compilation.Assemblies),
var result = col.GetRelatedSymbols (new Lazy<TypeGraph>(() => new TypeGraph (compilation.Assemblies)),
symbol);
if (offsets.Count != result.Count()) {
foreach (var a in result)

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/FindReferencesTest.cs

@ -469,7 +469,7 @@ namespace Foo @@ -469,7 +469,7 @@ namespace Foo
{
var sym = GetSymbol(compilation, fullyQualifiedName);
Assert.NotNull(sym);
var graph = new TypeGraph(compilation.Assemblies);
var graph = new Lazy<TypeGraph>(() => new TypeGraph(compilation.Assemblies));
var col = new SymbolCollector();
col.IncludeOverloads = includeOverloads;
col.GroupForRenaming = true;

18
src/Libraries/NRefactory/ICSharpCode.NRefactory/Analysis/SymbolCollector.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -52,7 +52,7 @@ namespace ICSharpCode.NRefactory.Analysis
}
}
static IEnumerable<ISymbol> CollectOverloads (TypeGraph g, IMethod method)
static IEnumerable<ISymbol> CollectOverloads (IMethod method)
{
return method.DeclaringType
.GetMethods (m => m.Name == method.Name)
@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -85,7 +85,7 @@ namespace ICSharpCode.NRefactory.Analysis
/// <returns>The related symbols.</returns>
/// <param name="g">The type graph.</param>
/// <param name="m">The symbol to search</param>
public IEnumerable<ISymbol> GetRelatedSymbols(TypeGraph g, ISymbol m)
public IEnumerable<ISymbol> GetRelatedSymbols(Lazy<TypeGraph> g, ISymbol m)
{
switch (m.SymbolKind) {
case SymbolKind.TypeDefinition:
@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.Analysis
return GetRelatedSymbols (g, ((IMethod)m).DeclaringTypeDefinition);
List<ISymbol> constructorSymbols = new List<ISymbol> ();
if (IncludeOverloads) {
foreach (var m3 in CollectOverloads (g, (IMethod)m)) {
foreach (var m3 in CollectOverloads ((IMethod)m)) {
constructorSymbols.Add (m3);
}
}
@ -122,12 +122,16 @@ namespace ICSharpCode.NRefactory.Analysis @@ -122,12 +122,16 @@ namespace ICSharpCode.NRefactory.Analysis
List<ISymbol> symbols = new List<ISymbol> ();
if (!member.IsExplicitInterfaceImplementation)
symbols.Add (member);
foreach (var m2 in member.ImplementedInterfaceMembers) {
symbols.AddRange (GetRelatedSymbols (g, m2));
if (GroupForRenaming) {
foreach (var m2 in member.ImplementedInterfaceMembers) {
symbols.AddRange (GetRelatedSymbols (g, m2));
}
} else {
symbols.AddRange(member.ImplementedInterfaceMembers);
}
if (member.DeclaringType.Kind == TypeKind.Interface) {
var declaringTypeNode = g.GetNode(member.DeclaringTypeDefinition);
var declaringTypeNode = g.Value.GetNode(member.DeclaringTypeDefinition);
if (declaringTypeNode != null) {
foreach (var derivedType in declaringTypeNode.DerivedTypes) {
var mem = SearchMember (derivedType.TypeDefinition, member);
@ -141,7 +145,7 @@ namespace ICSharpCode.NRefactory.Analysis @@ -141,7 +145,7 @@ namespace ICSharpCode.NRefactory.Analysis
if (IncludeOverloads) {
IncludeOverloads = false;
if (member is IMethod) {
foreach (var m3 in CollectOverloads (g, (IMethod)member)) {
foreach (var m3 in CollectOverloads ((IMethod)member)) {
symbols.AddRange (GetRelatedSymbols (g, m3));
}
} else if (member.SymbolKind == SymbolKind.Indexer) {

Loading…
Cancel
Save