diff --git a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs index 1bc316785..48127245a 100644 --- a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs +++ b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs @@ -170,56 +170,58 @@ namespace ICSharpCode.NRefactory.Ast public static AstType GetTypeReference(this Type type) { - List arrayRanks = new List(); - while(type.IsArray) { - // C# uses reverse array order - arrayRanks.Add(type.GetArrayRank() - 1); - type = type.GetElementType(); - } - - int pointerNest = 0; - while(type.IsPointer) { - pointerNest++; - type = type.GetElementType(); - } - - if (type.IsArray) - throw new DebuggerException("C# does not support pointers to arrays"); - - string name = type.Name; - if (name.IndexOf('`') != -1) - name = name.Substring(0, name.IndexOf('`')); - if (!string.IsNullOrEmpty(type.Namespace)) - name = type.Namespace + "." + name; - - List genArgs = new List(); - // This inludes the generic arguments of the outter types - genArgs.AddRange(type.GetGenericArguments()); - if (type.DeclaringType != null) - genArgs.RemoveRange(0, type.DeclaringType.GetGenericArguments().Length); - List genTypeRefs = new List(); - foreach(Type genArg in genArgs) { - genTypeRefs.Add(genArg.GetTypeReference()); - } + return new SimpleType(type.Name).SetStaticType((DebugType)type); - if (type.DeclaringType != null) { - var outterRef = type.DeclaringType.GetTypeReference(); - var innerRef = new ComposedType() { - PointerRank = pointerNest, - //ArraySpecifiers = arrayRanks.ConvertAll(r => new ArraySpecifier(r)), -// BaseType = new MemberType() { -// Target = outterRef, MemberName = name, TypeArguments = genTypeRefs } - }; - - return innerRef.SetStaticType((DebugType)type); - } else { - return (new ComposedType() { - PointerRank = pointerNest, - //ArraySpecifiers = arrayRanks.ConvertAll(r => new ArraySpecifier(r)), - BaseType = new SimpleType() { - Identifier = name, - /*TypeArguments = genTypeRefs*/ }}).SetStaticType((DebugType)type); - } +// List arrayRanks = new List(); +// while(type.IsArray) { +// // C# uses reverse array order +// arrayRanks.Add(type.GetArrayRank() - 1); +// type = type.GetElementType(); +// } +// +// int pointerNest = 0; +// while(type.IsPointer) { +// pointerNest++; +// type = type.GetElementType(); +// } +// +// if (type.IsArray) +// throw new DebuggerException("C# does not support pointers to arrays"); +// +// string name = type.Name; +// if (name.IndexOf('`') != -1) +// name = name.Substring(0, name.IndexOf('`')); +// if (!string.IsNullOrEmpty(type.Namespace)) +// name = type.Namespace + "." + name; +// +// List genArgs = new List(); +// // This inludes the generic arguments of the outter types +// genArgs.AddRange(type.GetGenericArguments()); +// if (type.DeclaringType != null) +// genArgs.RemoveRange(0, type.DeclaringType.GetGenericArguments().Length); +// List genTypeRefs = new List(); +// foreach(Type genArg in genArgs) { +// genTypeRefs.Add(genArg.GetTypeReference()); +// } +// +// if (type.DeclaringType != null) { +// var outterRef = type.DeclaringType.GetTypeReference(); +// var innerRef = new ComposedType() { +// PointerRank = pointerNest, +// //ArraySpecifiers = arrayRanks.ConvertAll(r => new ArraySpecifier(r)), +//// BaseType = new MemberType() { +//// Target = outterRef, MemberName = name, TypeArguments = genTypeRefs } +// }; +// +// return innerRef.SetStaticType((DebugType)type); +// } else { +// return (new ComposedType() { +// PointerRank = pointerNest, +// //ArraySpecifiers = arrayRanks.ConvertAll(r => new ArraySpecifier(r)), +// BaseType = new SimpleType() { +// Identifier = name, +// /*TypeArguments = genTypeRefs*/ }}).SetStaticType((DebugType)type); +// } } /// @@ -227,156 +229,158 @@ namespace ICSharpCode.NRefactory.Ast /// Dotted names are split into separate nodes. /// It does not normalize generic arguments. /// - static AstType NormalizeTypeReference(this AstNode expr) - { - if (expr is IdentifierExpression) { - return new SimpleType() { - Identifier = ((IdentifierExpression)expr).Identifier/*, - TypeArguments = ((IdentifierExpression)expr).TypeArguments*/ - }; - } else if (expr is MemberReferenceExpression) { - var outter = NormalizeTypeReference(((MemberReferenceExpression)expr).Target); - return new MemberType() { Target = outter, - MemberName = ((MemberReferenceExpression)expr).MemberName/*, - TypeArguments = ((MemberReferenceExpression)expr).TypeArguments*/ }; - } else if (expr is TypeReferenceExpression) { - return NormalizeTypeReference(((TypeReferenceExpression)expr).Type); - } else if (expr is ComposedType) { // Frist - it is also TypeReference - var typeRef = (ComposedType)expr; - string[] names = null; - if (typeRef.BaseType is SimpleType) - names = (((SimpleType)typeRef.BaseType)).Identifier.Split('.'); - else - names = (((MemberType)typeRef.BaseType)).MemberName.Split('.'); - - var newRef = NormalizeTypeReference(typeRef.BaseType) as ComposedType; - foreach(string name in names) { - newRef = new ComposedType() { - BaseType = new SimpleType() { Identifier = name/*, TypeArguments = new List() */} - }; - } - //(((MemberType)newRef).TypeArguments as List).AddRange(typeRef.TypeArguments); - newRef.PointerRank = typeRef.PointerRank; - //newRef.ArraySpecifiers = typeRef.ArraySpecifiers; - return newRef; - } - else if (expr is SimpleType) { - var typeRef = (SimpleType)expr; - string[] names = typeRef.Identifier.Split('.'); - if (names.Length == 1) - return typeRef; - AstType newRef = null; - foreach(string name in names) { - if (newRef == null) { - newRef = new SimpleType() { Identifier = name/*, TypeArguments = new List()*/ }; - } else { - newRef = new MemberType() { Target = newRef, MemberName = name/*, TypeArguments = new List() */}; - } - } - //((List)newRef.TypeArguments).AddRange(typeRef.TypeArguments); - //newRef.PointerNestingLevel = typeRef.PointerNestingLevel; - //newRef.RankSpecifier = typeRef.RankSpecifier; - return newRef; - } - else { - throw new EvaluateException(expr, "Type expected. {0} seen.", expr.GetType().FullName); - } - } - - static string GetNameWithArgCounts(AstType typeRef) - { - string name = string.Empty; - - if (typeRef is SimpleType) - { - name = ((SimpleType)typeRef).Identifier; - if (((SimpleType)typeRef).TypeArguments.Count() > 0) - name += "`" + ((SimpleType)typeRef).TypeArguments.Count().ToString(); - } - - if (typeRef is MemberType) { - name = ((MemberType)typeRef).MemberName; - return GetNameWithArgCounts(((MemberType)typeRef).Target) + "." + name; - } else { - return name; - } - } - +// static AstType NormalizeTypeReference(this AstNode expr) +// { +// if (expr is IdentifierExpression) { +// return new SimpleType() { +// Identifier = ((IdentifierExpression)expr).Identifier/*, +// TypeArguments = ((IdentifierExpression)expr).TypeArguments*/ +// }; +// } else if (expr is MemberReferenceExpression) { +// var outter = NormalizeTypeReference(((MemberReferenceExpression)expr).Target); +// return new MemberType() { Target = outter, +// MemberName = ((MemberReferenceExpression)expr).MemberName/*, +// TypeArguments = ((MemberReferenceExpression)expr).TypeArguments*/ }; +// } else if (expr is TypeReferenceExpression) { +// return NormalizeTypeReference(((TypeReferenceExpression)expr).Type); +// } else if (expr is ComposedType) { // Frist - it is also TypeReference +// var typeRef = (ComposedType)expr; +// string[] names = null; +// if (typeRef.BaseType is SimpleType) +// names = (((SimpleType)typeRef.BaseType)).Identifier.Split('.'); +// else +// names = (((MemberType)typeRef.BaseType)).MemberName.Split('.'); +// +// var newRef = NormalizeTypeReference(typeRef.BaseType) as ComposedType; +// foreach(string name in names) { +// newRef = new ComposedType() { +// BaseType = new SimpleType() { Identifier = name/*, TypeArguments = new List() */} +// }; +// } +// //(((MemberType)newRef).TypeArguments as List).AddRange(typeRef.TypeArguments); +// newRef.PointerRank = typeRef.PointerRank; +// //newRef.ArraySpecifiers = typeRef.ArraySpecifiers; +// return newRef; +// } else if (expr is SimpleType) { +// var typeRef = (SimpleType)expr; +// string[] names = typeRef.Identifier.Split('.'); +// if (names.Length == 1) +// return typeRef; +// AstType newRef = null; +// foreach(string name in names) { +// if (newRef == null) { +// newRef = new SimpleType() { Identifier = name/*, TypeArguments = new List()*/ }; +// } else { +// newRef = new MemberType() { Target = newRef, MemberName = name/*, TypeArguments = new List() */}; +// } +// } +// //((List)newRef.TypeArguments).AddRange(typeRef.TypeArguments); +// //newRef.PointerNestingLevel = typeRef.PointerNestingLevel; +// //newRef.RankSpecifier = typeRef.RankSpecifier; +// return newRef; +// } else if (expr is PrimitiveType) { +// return (PrimitiveType)expr; +// } else { +// throw new EvaluateException(expr, "Type expected. {0} seen.", expr.GetType().FullName); +// } +// } +// +// static string GetNameWithArgCounts(AstType typeRef) +// { +// string name = string.Empty; +// +// if (typeRef is SimpleType) +// { +// name = ((SimpleType)typeRef).Identifier; +// if (((SimpleType)typeRef).TypeArguments.Count() > 0) +// name += "`" + ((SimpleType)typeRef).TypeArguments.Count().ToString(); +// } +// +// if (typeRef is MemberType) { +// name = ((MemberType)typeRef).MemberName; +// return GetNameWithArgCounts(((MemberType)typeRef).Target) + "." + name; +// } else { +// return name; +// } +// } +// public static DebugType ResolveType(this AstNode expr, Debugger.AppDomain appDomain) { - if (expr is AstType && expr.GetStaticType() != null) - return expr.GetStaticType(); - if (expr is TypeReferenceExpression && ((TypeReferenceExpression)expr).Type.GetStaticType() != null) - return ((TypeReferenceExpression)expr).Type.GetStaticType(); + return expr.GetStaticType(); - appDomain.Process.TraceMessage("Resolving {0}", expr.PrettyPrint()); - - var typeRef = NormalizeTypeReference(expr); - - List genTypeRefs = null; - if (typeRef is MemberType) { - //FIXME genTypeRefs = ((MemberType)typeRef).CombineToNormalTypeReference().TypeArguments as List; - } else { - if (typeRef is SimpleType) { - //genTypeRefs = ((SimpleType)typeRef).TypeArguments as List; - } - } - - List genArgs = new List(); - foreach(var genTypeRef in genTypeRefs) { - genArgs.Add(ResolveType(genTypeRef, appDomain)); - } - - return ResolveTypeInternal(typeRef, genArgs.ToArray(), appDomain); +// if (expr is AstType && expr.GetStaticType() != null) +// return expr.GetStaticType(); +// if (expr is TypeReferenceExpression && ((TypeReferenceExpression)expr).Type.GetStaticType() != null) +// return ((TypeReferenceExpression)expr).Type.GetStaticType(); +// +// appDomain.Process.TraceMessage("Resolving {0}", expr.PrettyPrint()); +// +// var typeRef = NormalizeTypeReference(expr); +// +// List genTypeRefs = null; +// if (typeRef is MemberType) { +// //FIXME genTypeRefs = ((MemberType)typeRef).CombineToNormalTypeReference().TypeArguments as List; +// } else { +// if (typeRef is SimpleType) { +// //genTypeRefs = ((SimpleType)typeRef).TypeArguments as List; +// } +// } +// +// List genArgs = new List(); +// foreach(var genTypeRef in genTypeRefs) { +// genArgs.Add(ResolveType(genTypeRef, appDomain)); +// } +// +// return ResolveTypeInternal(typeRef, genArgs.ToArray(), appDomain); } /// /// For performance this is separate method. /// 'genArgs' should hold type for each generic parameter in 'typeRef'. /// - static DebugType ResolveTypeInternal(AstType typeRef, DebugType[] genArgs, Debugger.AppDomain appDomain) - { - DebugType type = null; - - if (typeRef is SimpleType) { - // Try to construct non-nested type - // If there are generic types up in the tree, it must be nested type - var simple = (SimpleType)typeRef; - - if (genArgs.Length == simple.TypeArguments.Count()) { - string name = GetNameWithArgCounts(simple); - type = DebugType.CreateFromNameOrNull(appDomain, name, null, genArgs); - } - } - // Try to construct nested type - if (type == null && typeRef is MemberType) { - var member = (MemberType)typeRef; - DebugType[] outterGenArgs = genArgs; - // Do not pass our generic arguments to outter type - Array.Resize(ref outterGenArgs, genArgs.Length - member.TypeArguments.Count()); - - DebugType outter = ResolveTypeInternal(member.Target, outterGenArgs, appDomain); - string nestedName = member.TypeArguments.Count() == 0 ? - member.MemberName : member.MemberName + "`" + member.TypeArguments.Count(); - type = DebugType.CreateFromNameOrNull(appDomain, nestedName, outter, genArgs); - } - - if (type == null) - throw new GetValueException("Can not resolve " + typeRef.PrettyPrint()); - - if (typeRef is ComposedType) { - - for(int i = 0; i < ((ComposedType)typeRef).PointerRank; i++) { - type = (DebugType)type.MakePointerType(); - } - if (((ComposedType)typeRef).ArraySpecifiers != null) { - var enumerator = ((ComposedType)typeRef).ArraySpecifiers.Reverse().GetEnumerator(); - while (enumerator.MoveNext()) { - type = (DebugType)type.MakeArrayType(enumerator.Current.Dimensions + 1); - } - } - } - return type; - } +// static DebugType ResolveTypeInternal(AstType typeRef, DebugType[] genArgs, Debugger.AppDomain appDomain) +// { +// DebugType type = null; +// +// if (typeRef is SimpleType) { +// // Try to construct non-nested type +// // If there are generic types up in the tree, it must be nested type +// var simple = (SimpleType)typeRef; +// +// if (genArgs.Length == simple.TypeArguments.Count()) { +// string name = GetNameWithArgCounts(simple); +// type = DebugType.CreateFromNameOrNull(appDomain, name, null, genArgs); +// } +// } +// // Try to construct nested type +// if (type == null && typeRef is MemberType) { +// var member = (MemberType)typeRef; +// DebugType[] outterGenArgs = genArgs; +// // Do not pass our generic arguments to outter type +// Array.Resize(ref outterGenArgs, genArgs.Length - member.TypeArguments.Count()); +// +// DebugType outter = ResolveTypeInternal(member.Target, outterGenArgs, appDomain); +// string nestedName = member.TypeArguments.Count() == 0 ? +// member.MemberName : member.MemberName + "`" + member.TypeArguments.Count(); +// type = DebugType.CreateFromNameOrNull(appDomain, nestedName, outter, genArgs); +// } +// +// if (type == null) +// throw new GetValueException("Can not resolve " + typeRef.PrettyPrint()); +// +// if (typeRef is ComposedType) { +// +// for(int i = 0; i < ((ComposedType)typeRef).PointerRank; i++) { +// type = (DebugType)type.MakePointerType(); +// } +// if (((ComposedType)typeRef).ArraySpecifiers != null) { +// var enumerator = ((ComposedType)typeRef).ArraySpecifiers.Reverse().GetEnumerator(); +// while (enumerator.MoveNext()) { +// type = (DebugType)type.MakeArrayType(enumerator.Current.Dimensions + 1); +// } +// } +// } +// return type; +// } } }