diff --git a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs index c87f464f6..a0e9ae3a5 100644 --- a/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs +++ b/Debugger/Debugger.Core/NRefactory/Ast/ExpressionExtensionMethods.cs @@ -107,10 +107,10 @@ namespace ICSharpCode.NRefactory.Ast if (memberInfo is MethodInfo) { var mre = new MemberReferenceExpression() { Target = target, MemberName = memberInfo.Name }; - var ie = new InvocationExpression() { - Target = mre.Clone()/*, - Arguments = AddExplicitTypes((MethodInfo)memberInfo, args) */ - }; + var ie = new InvocationExpression() { Target = mre.Clone() }; + foreach (var element in AddExplicitTypes((MethodInfo)memberInfo, args)) { + ie.AddChild(element, AstNode.Roles.Argument); + } return ie.SetStaticType(memberInfo.MemberType); } @@ -120,12 +120,12 @@ namespace ICSharpCode.NRefactory.Ast if (args.Length > 0) { if (memberInfo.Name != "Item") throw new DebuggerException("Arguments expected only for the Item property"); - return (new IndexerExpression() { - Target = target.Clone()/*, - Arguments = AddExplicitTypes(propInfo.GetGetMethod() ?? propInfo.GetSetMethod() - , args) */ - } - ).SetStaticType(memberInfo.MemberType); + var ie = new IndexerExpression() { Target = target.Clone() }; + + foreach (var element in AddExplicitTypes(propInfo.GetGetMethod() ?? propInfo.GetSetMethod(), args)) { + ie.AddChild(element, AstNode.Roles.Argument); + } + return ie.SetStaticType(memberInfo.MemberType); } else { return (new MemberReferenceExpression() { Target = target.Clone(), MemberName = memberInfo.Name }).SetStaticType(memberInfo.MemberType); } @@ -170,139 +170,8 @@ namespace ICSharpCode.NRefactory.Ast public static AstType GetTypeReference(this Type type) { return new SimpleType(type.Name).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); -// } } - /// - /// Converts tree into nested TypeReference/InnerClassTypeReference. - /// 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 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) { var result = expr.GetStaticType(); @@ -310,80 +179,6 @@ namespace ICSharpCode.NRefactory.Ast return result; return DebugType.CreateFromType(appDomain, expr.Annotation()); - -// 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; -// } } } diff --git a/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerHelper.cs b/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerHelper.cs index 089ac0d34..da03dfe8a 100644 --- a/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerHelper.cs +++ b/Debugger/ILSpy.Debugger/Services/Debugger/DebuggerHelper.cs @@ -28,11 +28,8 @@ namespace ILSpy.Debugger.Services.Debugger var iEnumerableType = DebugType.CreateFromType(itemType.AppDomain, typeof(IEnumerable<>), itemType); // explicitely cast the variable to IEnumerable, where T is itemType Expression iEnumerableVariableExplicitCast = new CastExpression { Expression = iEnumerableVariable.Clone() , Type = iEnumerableType.GetTypeReference() }; - var obj = new ObjectCreateExpression() { - Type = listType.GetTypeReference()/*, - Arguments = iEnumerableVariableExplicitCast.ToList() */ - }; + var obj = new ObjectCreateExpression() { Type = listType.GetTypeReference() }; foreach (var element in iEnumerableVariableExplicitCast.ToList()) { obj.AddChild(element, AstNode.Roles.Argument); }