Browse Source

Performance improvement for the type resolution

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5156 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 16 years ago
parent
commit
ff23ae1a78
  1. 25
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/NRefactory/Ast/ExpressionExtensionMethods.cs

25
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/NRefactory/Ast/ExpressionExtensionMethods.cs

@ -150,6 +150,7 @@ namespace ICSharpCode.NRefactory.Ast @@ -150,6 +150,7 @@ namespace ICSharpCode.NRefactory.Ast
name = type.Namespace + "." + name;
List<Type> genArgs = new List<Type>();
// This inludes the generic arguments of the outter types
genArgs.AddRange(type.GetGenericArguments());
if (type.DeclaringType != null)
genArgs.RemoveRange(0, type.DeclaringType.GetGenericArguments().Length);
@ -172,8 +173,9 @@ namespace ICSharpCode.NRefactory.Ast @@ -172,8 +173,9 @@ namespace ICSharpCode.NRefactory.Ast
/// <summary>
/// Converts tree into nested TypeReference/InnerClassTypeReference.
/// Dotted names are split into separate nodes.
/// It does not normalize generic arguments.
/// </summary>
public static TypeReference NormalizeTypeReference(this INode expr)
static TypeReference NormalizeTypeReference(this INode expr)
{
if (expr is IdentifierExpression) {
return new TypeReference(
@ -250,22 +252,35 @@ namespace ICSharpCode.NRefactory.Ast @@ -250,22 +252,35 @@ namespace ICSharpCode.NRefactory.Ast
genArgs.Add(ResolveType(genTypeRef, appDomain));
}
return ResolveTypeInternal(typeRef, genArgs.ToArray(), appDomain);
}
/// <summary>
/// For performance this is separate method.
/// 'genArgs' should hold type for each generic parameter in 'typeRef'.
/// </summary>
static DebugType ResolveTypeInternal(TypeReference typeRef, DebugType[] genArgs, Debugger.AppDomain appDomain)
{
DebugType type = null;
// Try to construct non-nested type
// If there are generic types up in the tree, it must be nested type
if (genArgs.Count == typeRef.GenericTypes.Count) {
if (genArgs.Length == typeRef.GenericTypes.Count) {
string name = GetNameWithArgCounts(typeRef);
type = DebugType.CreateFromName(appDomain, name, null, genArgs.ToArray());
type = DebugType.CreateFromName(appDomain, name, null, genArgs);
}
// Try to construct nested type
if (type == null && typeRef is InnerClassTypeReference) {
DebugType outter = ResolveType(((InnerClassTypeReference)typeRef).BaseType, appDomain);
DebugType[] outterGenArgs = genArgs;
// Do not pass our generic arguments to outter type
Array.Resize(ref outterGenArgs, genArgs.Length - typeRef.GenericTypes.Count);
DebugType outter = ResolveTypeInternal(((InnerClassTypeReference)typeRef).BaseType, outterGenArgs, appDomain);
if (outter == null)
return null;
string nestedName = typeRef.GenericTypes.Count == 0 ? typeRef.Type : typeRef.Type + "`" + typeRef.GenericTypes.Count;
type = DebugType.CreateFromName(appDomain, nestedName, outter, genArgs.ToArray());
type = DebugType.CreateFromName(appDomain, nestedName, outter, genArgs);
}
if (type == null)

Loading…
Cancel
Save