From 008a3c71e5a8d1dccf777e7b3326bd07a2baf7c9 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 6 Jan 2019 10:34:37 +0100 Subject: [PATCH 01/24] DelegateConstruction: - add support for unknown delegate construction pattern. The method is compiler-generated, but has no compiler-generated name, we should be able to infer lambda usage from anonymous types used in the signature (i. e., the method can only be used as lambda, because that's where type names are optional). - Add CombineExitsTransform in DelegateConstruction: this allows combining lambdas with multiple return statements into a single expression (as it is expected by query expressions). --- .../ICSharpCode.Decompiler.csproj | 3 +- .../IL/Transforms/CombineExitsTransform.cs | 32 +++++++++++++++++++ .../IL/Transforms/DelegateConstruction.cs | 24 +++++++++++--- 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs diff --git a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj index 39b503afb..21f00796d 100644 --- a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj +++ b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj @@ -74,7 +74,7 @@ - + @@ -265,6 +265,7 @@ + diff --git a/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs new file mode 100644 index 000000000..217179b37 --- /dev/null +++ b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ICSharpCode.Decompiler.IL.Transforms +{ + class CombineExitsTransform : IILTransform + { + public void Run(ILFunction function, ILTransformContext context) + { + if (!(function.Body is BlockContainer container && container.Blocks.Count == 1)) + return; + var block = container.EntryPoint; + if (block.Kind != BlockKind.ControlFlow) + return; + if (!(block.Instructions.SecondToLastOrDefault() is IfInstruction ifInst && block.Instructions.LastOrDefault() is Leave leave)) + return; + if (!ifInst.FalseInst.MatchNop()) + return; + if (!(Block.Unwrap(ifInst.TrueInst) is Leave leave2)) + return; + if (!(leave.IsLeavingFunction && leave2.IsLeavingFunction)) + return; + if (leave.Value.MatchNop() || leave2.Value.MatchNop()) + return; + IfInstruction value = new IfInstruction(ifInst.Condition, leave.Value, leave2.Value); + Leave combinedLeave = new Leave(leave.TargetContainer, value); + ifInst.ReplaceWith(combinedLeave); + block.Instructions.RemoveAt(combinedLeave.ChildIndex + 1); + } + } +} diff --git a/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs b/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs index 4d8606751..7a04540da 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs @@ -105,13 +105,24 @@ namespace ICSharpCode.Decompiler.IL.Transforms static bool IsAnonymousMethod(ITypeDefinition decompiledTypeDefinition, IMethod method) { - if (method == null || !(method.HasGeneratedName() || method.Name.Contains("$"))) + if (method == null || !(method.HasGeneratedName() || method.Name.Contains("$") || ContainsAnonymousType(method))) return false; if (!(method.IsCompilerGeneratedOrIsInCompilerGeneratedClass() || IsPotentialClosure(decompiledTypeDefinition, method.DeclaringTypeDefinition))) return false; return true; } - + + static bool ContainsAnonymousType(IMethod method) + { + if (method.ReturnType.ContainsAnonymousType()) + return true; + foreach (var p in method.Parameters) { + if (p.Type.ContainsAnonymousType()) + return true; + } + return false; + } + static bool IsPotentialClosure(ITypeDefinition decompiledTypeDefinition, ITypeDefinition potentialDisplayClass) { if (potentialDisplayClass == null || !potentialDisplayClass.IsCompilerGeneratedOrIsInCompilerGeneratedClass()) @@ -178,7 +189,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms } var nestedContext = new ILTransformContext(context, function); - function.RunTransforms(CSharpDecompiler.GetILTransforms().TakeWhile(t => !(t is DelegateConstruction)), nestedContext); + function.RunTransforms(CSharpDecompiler.GetILTransforms().TakeWhile(t => !(t is DelegateConstruction)).Concat(GetTransforms()), nestedContext); function.AcceptVisitor(new ReplaceDelegateTargetVisitor(target, function.Variables.SingleOrDefault(v => v.Index == -1 && v.Kind == VariableKind.Parameter))); // handle nested lambdas ((IILTransform)new DelegateConstruction()).Run(function, nestedContext); @@ -186,7 +197,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms function.AddILRange(value.Arguments[1].ILRange); return function; } - + + private IEnumerable GetTransforms() + { + yield return new CombineExitsTransform(); + } + /// /// Replaces loads of 'this' with the target expression. /// Async delegates use: ldobj(ldloca this). From 32cec2a1fba2eee0d853d176b0444b0ac16c16ca Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 6 Jan 2019 10:38:25 +0100 Subject: [PATCH 02/24] Fix traversal bug in DecompileQueries: expressions with independent sub-expressions like conditional-expressions, binary operators or parameter lists were not handled correctly. --- .../CSharp/Transforms/IntroduceQueryExpressions.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs index 38e1c35a1..57d25c8cd 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs @@ -74,7 +74,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms QueryExpression query = DecompileQuery(node as InvocationExpression); if (query != null) node.ReplaceWith(query); - for (AstNode child = (query ?? node).FirstChild; child != null; child = child.NextSibling) { + AstNode next; + for (AstNode child = (query ?? node).FirstChild; child != null; child = next) { + // store referece to next child before transformation + next = child.NextSibling; DecompileQueries(child); } } From 9487d0a714e820340b93de2ba6949170f5673bcc Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 6 Jan 2019 10:40:00 +0100 Subject: [PATCH 03/24] Make pattern in TryRemoveTransparentIdentifier more flexible. Allow multiple let expressions per anonymous type declaration. --- .../Transforms/CombineQueryExpressions.cs | 99 ++++++++----------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs index dea7a451b..9d617e519 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs @@ -69,29 +69,23 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms } } } - + static readonly QuerySelectClause selectTransparentIdentifierPattern = new QuerySelectClause { - Expression = new Choice { - new AnonymousTypeCreateExpression { - Initializers = { - new NamedExpression { - Name = Pattern.AnyString, - Expression = new IdentifierExpression(Pattern.AnyString) - }.WithName("nae1"), - new NamedExpression { - Name = Pattern.AnyString, - Expression = new AnyNode("nae2Expr") - }.WithName("nae2") - } - }, - new AnonymousTypeCreateExpression { - Initializers = { - new NamedNode("identifier", new IdentifierExpression(Pattern.AnyString)), - new AnyNode("nae2Expr") - } + Expression = new AnonymousTypeCreateExpression { + Initializers = { + new Repeat( + new Choice { + new IdentifierExpression(Pattern.AnyString).WithName("expr"), // capture variable with same name + new NamedExpression { + Name = Pattern.AnyString, + Expression = new AnyNode() + }.WithName("expr") + } + ) { MinCount = 1 } } - }}; - + } + }; + bool IsTransparentIdentifier(string identifier) { return identifier.StartsWith("<>", StringComparison.Ordinal) && (identifier.Contains("TransparentIdentifier") || identifier.Contains("TranspIdent")); @@ -101,48 +95,33 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (!IsTransparentIdentifier(fromClause.Identifier)) return false; - Match match = selectTransparentIdentifierPattern.Match(innerQuery.Clauses.Last()); + QuerySelectClause selectClause = innerQuery.Clauses.Last() as QuerySelectClause; + Match match = selectTransparentIdentifierPattern.Match(selectClause); if (!match.Success) return false; - QuerySelectClause selectClause = (QuerySelectClause)innerQuery.Clauses.Last(); - NamedExpression nae1 = match.Get("nae1").SingleOrDefault(); - NamedExpression nae2 = match.Get("nae2").SingleOrDefault(); - if (nae1 != null && nae1.Name != ((IdentifierExpression)nae1.Expression).Identifier) - return false; - Expression nae2Expr = match.Get("nae2Expr").Single(); - IdentifierExpression nae2IdentExpr = nae2Expr as IdentifierExpression; - if (nae2IdentExpr != null && (nae2 == null || nae2.Name == nae2IdentExpr.Identifier)) { - // from * in (from x in ... select new { x = x, y = y }) ... - // => - // from x in ... ... - fromClause.Remove(); - selectClause.Remove(); - // Move clauses from innerQuery to query - QueryClause insertionPos = null; - foreach (var clause in innerQuery.Clauses) { - query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach()); - } - } else { - // from * in (from x in ... select new { x = x, y = expr }) ... - // => - // from x in ... let y = expr ... - fromClause.Remove(); - selectClause.Remove(); - // Move clauses from innerQuery to query - QueryClause insertionPos = null; - foreach (var clause in innerQuery.Clauses) { - query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach()); + + // from * in (from x in ... select new { members of anonymous type }) ... + // => + // from x in ... { let x = ... } ... + fromClause.Remove(); + selectClause.Remove(); + // Move clauses from innerQuery to query + QueryClause insertionPos = null; + foreach (var clause in innerQuery.Clauses) { + query.Clauses.InsertAfter(insertionPos, insertionPos = clause.Detach()); + } + + foreach (var expr in match.Get("expr")) { + switch (expr) { + case IdentifierExpression identifier: + // nothing to add + continue; + case NamedExpression namedExpression: + if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier) + continue; + query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = namedExpression.Name, Expression = namedExpression.Expression.Detach() }); + break; } - string ident; - if (nae2 != null) - ident = nae2.Name; - else if (nae2Expr is IdentifierExpression) - ident = ((IdentifierExpression)nae2Expr).Identifier; - else if (nae2Expr is MemberReferenceExpression) - ident = ((MemberReferenceExpression)nae2Expr).MemberName; - else - throw new InvalidOperationException("Could not infer name from initializer in AnonymousTypeCreateExpression"); - query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = ident, Expression = nae2Expr.Detach() }); } return true; } From 238b5ac0920977f155ce177fcb0963c4a07556ac Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 23 Jan 2019 00:22:36 +0100 Subject: [PATCH 04/24] Fix CombineExitsTransform --- ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs index 217179b37..469fbdedf 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs @@ -13,11 +13,11 @@ namespace ICSharpCode.Decompiler.IL.Transforms var block = container.EntryPoint; if (block.Kind != BlockKind.ControlFlow) return; - if (!(block.Instructions.SecondToLastOrDefault() is IfInstruction ifInst && block.Instructions.LastOrDefault() is Leave leave)) + if (!(block.Instructions.SecondToLastOrDefault() is IfInstruction ifInst && block.Instructions.LastOrDefault() is Leave leave2)) return; if (!ifInst.FalseInst.MatchNop()) return; - if (!(Block.Unwrap(ifInst.TrueInst) is Leave leave2)) + if (!(Block.Unwrap(ifInst.TrueInst) is Leave leave)) return; if (!(leave.IsLeavingFunction && leave2.IsLeavingFunction)) return; From 1d2cd930de7d4cefebf9768ad559dc31769208de Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 23 Jan 2019 00:23:53 +0100 Subject: [PATCH 05/24] Add LetIdentifierAnnotation to allow linking of let variables. --- .../Transforms/CombineQueryExpressions.cs | 35 ++++-- .../Transforms/IntroduceQueryExpressions.cs | 109 +++++++++++------- .../Output/TextTokenWriter.cs | 10 ++ 3 files changed, 103 insertions(+), 51 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs index 9d617e519..91405aa6e 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs @@ -17,6 +17,7 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Collections.Generic; using System.Linq; using ICSharpCode.Decompiler.CSharp.Syntax; using ICSharpCode.Decompiler.CSharp.Syntax.PatternMatching; @@ -32,7 +33,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (!context.Settings.QueryExpressions) return; - CombineQueries(rootNode); + CombineQueries(rootNode, new Dictionary()); } static readonly InvocationExpression castPattern = new InvocationExpression { @@ -42,18 +43,18 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms TypeArguments = { new AnyNode("targetType") } }}; - void CombineQueries(AstNode node) + void CombineQueries(AstNode node, Dictionary letIdentifiers) { for (AstNode child = node.FirstChild; child != null; child = child.NextSibling) { - CombineQueries(child); + CombineQueries(child, letIdentifiers); } QueryExpression query = node as QueryExpression; if (query != null) { QueryFromClause fromClause = (QueryFromClause)query.Clauses.First(); QueryExpression innerQuery = fromClause.Expression as QueryExpression; if (innerQuery != null) { - if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery)) { - RemoveTransparentIdentifierReferences(query); + if (TryRemoveTransparentIdentifier(query, fromClause, innerQuery, letIdentifiers)) { + RemoveTransparentIdentifierReferences(query, letIdentifiers); } else { QueryContinuationClause continuation = new QueryContinuationClause(); continuation.PrecedingQuery = innerQuery.Detach(); @@ -91,7 +92,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms return identifier.StartsWith("<>", StringComparison.Ordinal) && (identifier.Contains("TransparentIdentifier") || identifier.Contains("TranspIdent")); } - bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery) + bool TryRemoveTransparentIdentifier(QueryExpression query, QueryFromClause fromClause, QueryExpression innerQuery, Dictionary letClauses) { if (!IsTransparentIdentifier(fromClause.Identifier)) return false; @@ -117,9 +118,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms // nothing to add continue; case NamedExpression namedExpression: - if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier) + if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier) { + letClauses[namedExpression.Name] = identifierExpression.Annotation(); continue; - query.Clauses.InsertAfter(insertionPos, new QueryLetClause { Identifier = namedExpression.Name, Expression = namedExpression.Expression.Detach() }); + } + QueryLetClause letClause = new QueryLetClause { Identifier = namedExpression.Name, Expression = namedExpression.Expression.Detach() }; + var annotation = new LetIdentifierAnnotation(); + letClause.AddAnnotation(annotation); + letClauses[namedExpression.Name] = annotation; + query.Clauses.InsertAfter(insertionPos, letClause); break; } } @@ -129,10 +136,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms /// /// Removes all occurrences of transparent identifiers /// - void RemoveTransparentIdentifierReferences(AstNode node) + void RemoveTransparentIdentifierReferences(AstNode node, Dictionary letClauses) { foreach (AstNode child in node.Children) { - RemoveTransparentIdentifierReferences(child); + RemoveTransparentIdentifierReferences(child, letClauses); } MemberReferenceExpression mre = node as MemberReferenceExpression; if (mre != null) { @@ -141,11 +148,17 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms IdentifierExpression newIdent = new IdentifierExpression(mre.MemberName); mre.TypeArguments.MoveTo(newIdent.TypeArguments); newIdent.CopyAnnotationsFrom(mre); - newIdent.RemoveAnnotations(); // remove the reference to the property of the anonymous type + newIdent.RemoveAnnotations(); // remove the reference to the property of the anonymous type + if (letClauses.TryGetValue(mre.MemberName, out var annotation)) + newIdent.AddAnnotation(annotation); mre.ReplaceWith(newIdent); return; } } } } + + public class LetIdentifierAnnotation + { + } } diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs index 57d25c8cd..83896b873 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms QueryFromClause fromClause = (QueryFromClause)query.Clauses.First(); if (IsDegenerateQuery(query)) { // introduce select for degenerate query - query.Clauses.Add(new QuerySelectClause { Expression = new IdentifierExpression(fromClause.Identifier) }); + query.Clauses.Add(new QuerySelectClause { Expression = new IdentifierExpression(fromClause.Identifier).CopyAnnotationsFrom(fromClause) }); } // See if the data source of this query is a degenerate query, // and combine the queries if possible. @@ -94,12 +94,12 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (invocation.Arguments.Count != 1) return null; - string parameterName; + ParameterDeclaration parameter; Expression body; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameterName, out body)) { + if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out body)) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = parameterName, Expression = mre.Target.Detach() }); - query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(body.Detach(), parameterName) }); + query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); + query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(body.Detach(), parameter.Name) }); return query; } return null; @@ -107,24 +107,24 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms case "GroupBy": { if (invocation.Arguments.Count == 2) { - string parameterName1, parameterName2; + ParameterDeclaration parameter1, parameter2; Expression keySelector, elementSelector; - if (MatchSimpleLambda(invocation.Arguments.ElementAt(0), out parameterName1, out keySelector) - && MatchSimpleLambda(invocation.Arguments.ElementAt(1), out parameterName2, out elementSelector) - && parameterName1 == parameterName2) + if (MatchSimpleLambda(invocation.Arguments.ElementAt(0), out parameter1, out keySelector) + && MatchSimpleLambda(invocation.Arguments.ElementAt(1), out parameter2, out elementSelector) + && parameter1.Name == parameter2.Name) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = parameterName1, Expression = mre.Target.Detach() }); + query.Clauses.Add(MakeFromClause(parameter1, mre.Target.Detach())); query.Clauses.Add(new QueryGroupClause { Projection = elementSelector.Detach(), Key = keySelector.Detach() }); return query; } } else if (invocation.Arguments.Count == 1) { - string parameterName; + ParameterDeclaration parameter; Expression keySelector; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameterName, out keySelector)) { + if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out keySelector)) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = parameterName, Expression = mre.Target.Detach() }); - query.Clauses.Add(new QueryGroupClause { Projection = new IdentifierExpression(parameterName), Key = keySelector.Detach() }); + query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); + query.Clauses.Add(new QueryGroupClause { Projection = new IdentifierExpression(parameter.Name).CopyAnnotationsFrom(parameter), Key = keySelector.Detach() }); return query; } } @@ -134,9 +134,9 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (invocation.Arguments.Count != 2) return null; - string parameterName; + ParameterDeclaration parameter; Expression collectionSelector; - if (!MatchSimpleLambda(invocation.Arguments.ElementAt(0), out parameterName, out collectionSelector)) + if (!MatchSimpleLambda(invocation.Arguments.ElementAt(0), out parameter, out collectionSelector)) return null; if (IsNullConditional(collectionSelector)) return null; @@ -144,11 +144,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms if (lambda != null && lambda.Parameters.Count == 2 && lambda.Body is Expression) { ParameterDeclaration p1 = lambda.Parameters.ElementAt(0); ParameterDeclaration p2 = lambda.Parameters.ElementAt(1); - if (p1.Name == parameterName) { + if (p1.Name == parameter.Name) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = p1.Name, Expression = mre.Target.Detach() }); - query.Clauses.Add(new QueryFromClause { Identifier = p2.Name, Expression = collectionSelector.Detach() }); - query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(((Expression)lambda.Body).Detach(), parameterName) }); + query.Clauses.Add(MakeFromClause(p1, mre.Target.Detach())); + query.Clauses.Add(MakeFromClause(p2, collectionSelector.Detach())); + query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(((Expression)lambda.Body).Detach(), parameter.Name) }); return query; } } @@ -158,11 +158,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (invocation.Arguments.Count != 1) return null; - string parameterName; + ParameterDeclaration parameter; Expression body; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameterName, out body)) { + if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out body)) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = parameterName, Expression = mre.Target.Detach() }); + query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); query.Clauses.Add(new QueryWhereClause { Condition = body.Detach() }); return query; } @@ -175,10 +175,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { if (invocation.Arguments.Count != 1) return null; - string parameterName; + ParameterDeclaration parameter; Expression orderExpression; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameterName, out orderExpression)) { - if (ValidateThenByChain(invocation, parameterName)) { + if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out orderExpression)) { + if (ValidateThenByChain(invocation, parameter.Name)) { QueryOrderClause orderClause = new QueryOrderClause(); InvocationExpression tmp = invocation; while (mre.MemberName == "ThenBy" || mre.MemberName == "ThenByDescending") { @@ -191,7 +191,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms tmp = (InvocationExpression)mre.Target; mre = (MemberReferenceExpression)tmp.Target; - MatchSimpleLambda(tmp.Arguments.Single(), out parameterName, out orderExpression); + MatchSimpleLambda(tmp.Arguments.Single(), out parameter, out orderExpression); } // insert new ordering at beginning orderClause.Orderings.InsertAfter( @@ -201,7 +201,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms }); QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = parameterName, Expression = mre.Target.Detach() }); + query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); query.Clauses.Add(orderClause); return query; } @@ -217,21 +217,21 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms Expression source2 = invocation.Arguments.ElementAt(0); if (IsNullConditional(source2)) return null; - string elementName1, elementName2; + ParameterDeclaration element1, element2; Expression key1, key2; - if (!MatchSimpleLambda(invocation.Arguments.ElementAt(1), out elementName1, out key1)) + if (!MatchSimpleLambda(invocation.Arguments.ElementAt(1), out element1, out key1)) return null; - if (!MatchSimpleLambda(invocation.Arguments.ElementAt(2), out elementName2, out key2)) + if (!MatchSimpleLambda(invocation.Arguments.ElementAt(2), out element2, out key2)) return null; LambdaExpression lambda = invocation.Arguments.ElementAt(3) as LambdaExpression; if (lambda != null && lambda.Parameters.Count == 2 && lambda.Body is Expression) { ParameterDeclaration p1 = lambda.Parameters.ElementAt(0); ParameterDeclaration p2 = lambda.Parameters.ElementAt(1); - if (p1.Name == elementName1 && (p2.Name == elementName2 || mre.MemberName == "GroupJoin")) { + if (p1.Name == element1.Name && (p2.Name == element2.Name || mre.MemberName == "GroupJoin")) { QueryExpression query = new QueryExpression(); - query.Clauses.Add(new QueryFromClause { Identifier = elementName1, Expression = source1.Detach() }); + query.Clauses.Add(MakeFromClause(element1, source1.Detach())); QueryJoinClause joinClause = new QueryJoinClause(); - joinClause.JoinIdentifier = elementName2; // join elementName2 + joinClause.JoinIdentifier = element2.Name; // join elementName2 joinClause.InExpression = source2.Detach(); // in source2 joinClause.OnExpression = key1.Detach(); // on key1 joinClause.EqualsExpression = key2.Detach(); // equals key2 @@ -250,6 +250,35 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms } } + QueryFromClause MakeFromClause(ParameterDeclaration parameter, Expression body) + { + QueryFromClause fromClause = new QueryFromClause { + Identifier = parameter.Name, + Expression = body + }; + fromClause.CopyAnnotationsFrom(parameter); + return fromClause; + } + + class ApplyAnnotationVisitor : DepthFirstAstVisitor + { + private LetIdentifierAnnotation annotation; + private string identifier; + + public ApplyAnnotationVisitor(LetIdentifierAnnotation annotation, string identifier) + { + this.annotation = annotation; + this.identifier = identifier; + } + + public override AstNode VisitIdentifier(Identifier identifier) + { + if (identifier.Name == this.identifier) + identifier.AddAnnotation(annotation); + return identifier; + } + } + bool IsNullConditional(Expression target) { return target is UnaryOperatorExpression uoe && uoe.Operator == UnaryOperatorType.NullConditional; @@ -278,11 +307,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms MemberReferenceExpression mre = invocation.Target as MemberReferenceExpression; if (mre == null) return false; - string parameterName; + ParameterDeclaration parameter; Expression body; - if (!MatchSimpleLambda(invocation.Arguments.Single(), out parameterName, out body)) + if (!MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out body)) return false; - if (parameterName != expectedParameterName) + if (parameter.Name != expectedParameterName) return false; if (mre.MemberName == "OrderBy" || mre.MemberName == "OrderByDescending") @@ -294,7 +323,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms } /// Matches simple lambdas of the form "a => b" - bool MatchSimpleLambda(Expression expr, out string parameterName, out Expression body) + bool MatchSimpleLambda(Expression expr, out ParameterDeclaration parameter, out Expression body) { // HACK : remove workaround after all unnecessary casts are eliminated. LambdaExpression lambda; @@ -305,12 +334,12 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms if (lambda != null && lambda.Parameters.Count == 1 && lambda.Body is Expression) { ParameterDeclaration p = lambda.Parameters.Single(); if (p.ParameterModifier == ParameterModifier.None) { - parameterName = p.Name; + parameter = p; body = (Expression)lambda.Body; return true; } } - parameterName = null; + parameter = null; body = null; return false; } diff --git a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs index bd6bd9628..e9f42a9f4 100644 --- a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs +++ b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs @@ -140,6 +140,10 @@ namespace ICSharpCode.Decompiler if (variable != null) return variable; + var letClauseVariable = node.Annotation(); + if (letClauseVariable != null) + return letClauseVariable; + var gotoStatement = node as GotoStatement; if (gotoStatement != null) { @@ -163,6 +167,12 @@ namespace ICSharpCode.Decompiler return variable; } + if (node is QueryLetClause) { + var variable = node.Annotation(); + if (variable != null) + return variable; + } + var label = node as LabelStatement; if (label != null) { var method = nodeStack.Select(nd => nd.GetSymbol() as IMethod).FirstOrDefault(mr => mr != null); From 2c0f26ca3e78da67edbbf90c64b6550b9694f90d Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 23 Jan 2019 00:24:29 +0100 Subject: [PATCH 06/24] Add unit tests --- .../TestCases/Pretty/QueryExpressions.cs | 19 ++ .../TestCases/Pretty/QueryExpressions.il | 176 ++++++++++++++++- .../TestCases/Pretty/QueryExpressions.opt.il | 141 ++++++++++++- .../Pretty/QueryExpressions.opt.roslyn.il | 178 ++++++++++++++--- .../Pretty/QueryExpressions.roslyn.il | 187 +++++++++++++++--- 5 files changed, 625 insertions(+), 76 deletions(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.cs index ebcf87829..37a16167d 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.cs @@ -213,6 +213,25 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty select (x); } + public static IEnumerable Issue1310a(bool test) + { +#if ROSLYN && OPT + IEnumerable obj = test ? (from c in Enumerable.Range(0, 255) + where char.IsLetter((char)c) + select (char)c) : (from c in Enumerable.Range(0, 255) + where char.IsDigit((char)c) + select (char)c); + return obj.Concat(obj); +#else + IEnumerable enumerable = test ? (from c in Enumerable.Range(0, 255) + where char.IsLetter((char)c) + select (char)c) : (from c in Enumerable.Range(0, 255) + where char.IsDigit((char)c) + select (char)c); + return enumerable.Concat(enumerable); +#endif + } + public static Maybe Cast(Maybe a) where TB : class { return from m in a diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.il index a73a6d0ea..2aa36ab3a 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.il @@ -17,8 +17,8 @@ { .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. - .custom instance void [mscorlib]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 ) .permissionset reqmin = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} .hash algorithm 0x00008004 @@ -273,6 +273,14 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate6a' .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate6f' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate70' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate71' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate72' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .method public hidebysig instance object MultipleWhere() cil managed { @@ -1097,6 +1105,92 @@ IL_004e: ret } // end of method QueryExpressions::Issue437 + .method public hidebysig static class [mscorlib]System.Collections.Generic.IEnumerable`1 + Issue1310a(bool test) cil managed + { + // Code size 186 (0xba) + .maxstack 3 + .locals init (class [mscorlib]System.Collections.Generic.IEnumerable`1 V_0, + class [mscorlib]System.Collections.Generic.IEnumerable`1 V_1) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: brtrue.s IL_0059 + + IL_0004: ldc.i4.0 + IL_0005: ldc.i4 0xff + IL_000a: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_000f: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_0014: brtrue.s IL_0029 + + IL_0016: ldnull + IL_0017: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6d'(int32) + IL_001d: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0022: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_0027: br.s IL_0029 + + IL_0029: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_002e: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0033: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_0038: brtrue.s IL_004d + + IL_003a: ldnull + IL_003b: ldftn char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6e'(int32) + IL_0041: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0046: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_004b: br.s IL_004d + + IL_004d: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_0052: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0057: br.s IL_00ac + + IL_0059: ldc.i4.0 + IL_005a: ldc.i4 0xff + IL_005f: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_0064: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_0069: brtrue.s IL_007e + + IL_006b: ldnull + IL_006c: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6b'(int32) + IL_0072: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0077: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_007c: br.s IL_007e + + IL_007e: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_0083: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0088: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_008d: brtrue.s IL_00a2 + + IL_008f: ldnull + IL_0090: ldftn char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6c'(int32) + IL_0096: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_009b: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_00a0: br.s IL_00a2 + + IL_00a2: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_00a7: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_00ac: nop + IL_00ad: stloc.0 + IL_00ae: ldloc.0 + IL_00af: ldloc.0 + IL_00b0: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Concat(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Collections.Generic.IEnumerable`1) + IL_00b5: stloc.1 + IL_00b6: br.s IL_00b8 + + IL_00b8: ldloc.1 + IL_00b9: ret + } // end of method QueryExpressions::Issue1310a + .method public hidebysig static valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 Cast(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 a) cil managed { @@ -1106,19 +1200,19 @@ IL_0000: nop IL_0001: ldarg.0 IL_0002: ldnull - IL_0003: ldftn class '<>f__AnonymousType11`2' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6c'(!!0) + IL_0003: ldftn class '<>f__AnonymousType11`2' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__74'(!!0) IL_0009: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2'>::.ctor(object, native int) IL_000e: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType11`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_0013: ldnull - IL_0014: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6d'(class '<>f__AnonymousType11`2') + IL_0014: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__75'(class '<>f__AnonymousType11`2') IL_001a: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2',bool>::.ctor(object, native int) IL_001f: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Wheref__AnonymousType11`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_0024: ldnull - IL_0025: ldftn !!1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6e'(class '<>f__AnonymousType11`2') + IL_0025: ldftn !!1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__76'(class '<>f__AnonymousType11`2') IL_002b: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2',!!TB>::.ctor(object, native int) IL_0030: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType11`2',!!1>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, @@ -2055,8 +2149,70 @@ IL_0005: ret } // end of method QueryExpressions::'b__68' + .method private hidebysig static bool 'b__6b'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 12 (0xc) + .maxstack 1 + .locals init (bool V_0) + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsLetter(char) + IL_0007: stloc.0 + IL_0008: br.s IL_000a + + IL_000a: ldloc.0 + IL_000b: ret + } // end of method QueryExpressions::'b__6b' + + .method private hidebysig static char 'b__6c'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 7 (0x7) + .maxstack 1 + .locals init (char V_0) + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: stloc.0 + IL_0003: br.s IL_0005 + + IL_0005: ldloc.0 + IL_0006: ret + } // end of method QueryExpressions::'b__6c' + + .method private hidebysig static bool 'b__6d'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 12 (0xc) + .maxstack 1 + .locals init (bool V_0) + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsDigit(char) + IL_0007: stloc.0 + IL_0008: br.s IL_000a + + IL_000a: ldloc.0 + IL_000b: ret + } // end of method QueryExpressions::'b__6d' + + .method private hidebysig static char 'b__6e'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 7 (0x7) + .maxstack 1 + .locals init (char V_0) + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: stloc.0 + IL_0003: br.s IL_0005 + + IL_0005: ldloc.0 + IL_0006: ret + } // end of method QueryExpressions::'b__6e' + .method private hidebysig static class '<>f__AnonymousType11`2' - 'b__6c'(!!TA m) cil managed + 'b__74'(!!TA m) cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 27 (0x1b) @@ -2074,9 +2230,9 @@ IL_0019: ldloc.0 IL_001a: ret - } // end of method QueryExpressions::'b__6c' + } // end of method QueryExpressions::'b__74' - .method private hidebysig static bool 'b__6d'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier6b') cil managed + .method private hidebysig static bool 'b__75'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier73') cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 22 (0x16) @@ -2094,9 +2250,9 @@ IL_0014: ldloc.0 IL_0015: ret - } // end of method QueryExpressions::'b__6d' + } // end of method QueryExpressions::'b__75' - .method private hidebysig static !!TB 'b__6e'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier6b') cil managed + .method private hidebysig static !!TB 'b__76'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier73') cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 11 (0xb) @@ -2109,7 +2265,7 @@ IL_0009: ldloc.0 IL_000a: ret - } // end of method QueryExpressions::'b__6e' + } // end of method QueryExpressions::'b__76' } // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.il index 487f6754b..4997aebba 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.il @@ -17,8 +17,8 @@ { .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. - .custom instance void [mscorlib]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 ) .permissionset reqmin = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} .hash algorithm 0x00008004 @@ -263,6 +263,14 @@ .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate6a' .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate6f' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate70' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate71' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .field private static class [mscorlib]System.Func`2 'CS$<>9__CachedAnonymousMethodDelegate72' + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) .method public hidebysig instance object MultipleWhere() cil managed { @@ -909,6 +917,77 @@ IL_0045: ret } // end of method QueryExpressions::Issue437 + .method public hidebysig static class [mscorlib]System.Collections.Generic.IEnumerable`1 + Issue1310a(bool test) cil managed + { + // Code size 172 (0xac) + .maxstack 3 + .locals init (class [mscorlib]System.Collections.Generic.IEnumerable`1 V_0) + IL_0000: ldarg.0 + IL_0001: brtrue.s IL_0054 + + IL_0003: ldc.i4.0 + IL_0004: ldc.i4 0xff + IL_0009: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_000e: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_0013: brtrue.s IL_0026 + + IL_0015: ldnull + IL_0016: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6d'(int32) + IL_001c: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0021: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_0026: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate71' + IL_002b: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0030: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_0035: brtrue.s IL_0048 + + IL_0037: ldnull + IL_0038: ldftn char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6e'(int32) + IL_003e: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0043: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_0048: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate72' + IL_004d: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0052: br.s IL_00a3 + + IL_0054: ldc.i4.0 + IL_0055: ldc.i4 0xff + IL_005a: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_005f: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_0064: brtrue.s IL_0077 + + IL_0066: ldnull + IL_0067: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6b'(int32) + IL_006d: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0072: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_0077: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate6f' + IL_007c: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0081: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_0086: brtrue.s IL_0099 + + IL_0088: ldnull + IL_0089: ldftn char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6c'(int32) + IL_008f: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0094: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_0099: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'CS$<>9__CachedAnonymousMethodDelegate70' + IL_009e: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_00a3: stloc.0 + IL_00a4: ldloc.0 + IL_00a5: ldloc.0 + IL_00a6: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Concat(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Collections.Generic.IEnumerable`1) + IL_00ab: ret + } // end of method QueryExpressions::Issue1310a + .method public hidebysig static valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 Cast(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 a) cil managed { @@ -916,19 +995,19 @@ .maxstack 8 IL_0000: ldarg.0 IL_0001: ldnull - IL_0002: ldftn class '<>f__AnonymousType11`2' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6c'(!!0) + IL_0002: ldftn class '<>f__AnonymousType11`2' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__74'(!!0) IL_0008: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2'>::.ctor(object, native int) IL_000d: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType11`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_0012: ldnull - IL_0013: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6d'(class '<>f__AnonymousType11`2') + IL_0013: ldftn bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__75'(class '<>f__AnonymousType11`2') IL_0019: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2',bool>::.ctor(object, native int) IL_001e: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Wheref__AnonymousType11`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_0023: ldnull - IL_0024: ldftn !!1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__6e'(class '<>f__AnonymousType11`2') + IL_0024: ldftn !!1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions::'b__76'(class '<>f__AnonymousType11`2') IL_002a: newobj instance void class [mscorlib]System.Func`2f__AnonymousType11`2',!!TB>::.ctor(object, native int) IL_002f: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType11`2',!!1>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, @@ -1626,8 +1705,50 @@ IL_0001: ret } // end of method QueryExpressions::'b__68' + .method private hidebysig static bool 'b__6b'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsLetter(char) + IL_0007: ret + } // end of method QueryExpressions::'b__6b' + + .method private hidebysig static char 'b__6c'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: ret + } // end of method QueryExpressions::'b__6c' + + .method private hidebysig static bool 'b__6d'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsDigit(char) + IL_0007: ret + } // end of method QueryExpressions::'b__6d' + + .method private hidebysig static char 'b__6e'(int32 c) cil managed + { + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: conv.u2 + IL_0002: ret + } // end of method QueryExpressions::'b__6e' + .method private hidebysig static class '<>f__AnonymousType11`2' - 'b__6c'(!!TA m) cil managed + 'b__74'(!!TA m) cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 23 (0x17) @@ -1640,9 +1761,9 @@ IL_0011: newobj instance void class '<>f__AnonymousType11`2'::.ctor(!0, !1) IL_0016: ret - } // end of method QueryExpressions::'b__6c' + } // end of method QueryExpressions::'b__74' - .method private hidebysig static bool 'b__6d'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier6b') cil managed + .method private hidebysig static bool 'b__75'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier73') cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 18 (0x12) @@ -1655,9 +1776,9 @@ IL_000e: ldc.i4.0 IL_000f: ceq IL_0011: ret - } // end of method QueryExpressions::'b__6d' + } // end of method QueryExpressions::'b__75' - .method private hidebysig static !!TB 'b__6e'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier6b') cil managed + .method private hidebysig static !!TB 'b__76'(class '<>f__AnonymousType11`2' '<>h__TransparentIdentifier73') cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) // Code size 7 (0x7) @@ -1665,7 +1786,7 @@ IL_0000: ldarg.0 IL_0001: callvirt instance !1 class '<>f__AnonymousType11`2'::get_t() IL_0006: ret - } // end of method QueryExpressions::'b__6e' + } // end of method QueryExpressions::'b__76' } // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.roslyn.il index f1e4543e1..91a5ac863 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.opt.roslyn.il @@ -3857,6 +3857,10 @@ .field public static class [mscorlib]System.Func`2,class '<>f__AnonymousType16`2'> '<>9__19_1' .field public static class [mscorlib]System.Func`2 '<>9__20_0' .field public static class [mscorlib]System.Func`2 '<>9__20_1' + .field public static class [mscorlib]System.Func`2 '<>9__21_0' + .field public static class [mscorlib]System.Func`2 '<>9__21_1' + .field public static class [mscorlib]System.Func`2 '<>9__21_2' + .field public static class [mscorlib]System.Func`2 '<>9__21_3' .method private hidebysig specialname rtspecialname static void .cctor() cil managed { @@ -4499,25 +4503,67 @@ IL_0001: ret } // end of method '<>c'::'b__20_1' + .method assembly hidebysig instance bool + 'b__21_0'(int32 c) cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsLetter(char) + IL_0007: ret + } // end of method '<>c'::'b__21_0' + + .method assembly hidebysig instance char + 'b__21_1'(int32 c) cil managed + { + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: ret + } // end of method '<>c'::'b__21_1' + + .method assembly hidebysig instance bool + 'b__21_2'(int32 c) cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsDigit(char) + IL_0007: ret + } // end of method '<>c'::'b__21_2' + + .method assembly hidebysig instance char + 'b__21_3'(int32 c) cil managed + { + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: ret + } // end of method '<>c'::'b__21_3' + } // end of class '<>c' - .class auto ansi serializable sealed nested private beforefieldinit '<>c__21`2' + .class auto ansi serializable sealed nested private beforefieldinit '<>c__22`2' extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' '<>9' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2'> '<>9__21_0' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',bool> '<>9__21_1' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',!TB> '<>9__21_2' + .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' '<>9' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2'> '<>9__22_0' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',bool> '<>9__22_1' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',!TB> '<>9__22_2' .method private hidebysig specialname rtspecialname static void .cctor() cil managed { // Code size 11 (0xb) .maxstack 8 - IL_0000: newobj instance void class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::.ctor() - IL_0005: stsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' + IL_0000: newobj instance void class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::.ctor() + IL_0005: stsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' IL_000a: ret - } // end of method '<>c__21`2'::.cctor + } // end of method '<>c__22`2'::.cctor .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -4527,10 +4573,10 @@ IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret - } // end of method '<>c__21`2'::.ctor + } // end of method '<>c__22`2'::.ctor .method assembly hidebysig instance class '<>f__AnonymousType17`2' - 'b__21_0'(!TA m) cil managed + 'b__22_0'(!TA m) cil managed { // Code size 23 (0x17) .maxstack 8 @@ -4542,10 +4588,10 @@ IL_0011: newobj instance void class '<>f__AnonymousType17`2'::.ctor(!0, !1) IL_0016: ret - } // end of method '<>c__21`2'::'b__21_0' + } // end of method '<>c__22`2'::'b__22_0' .method assembly hidebysig instance bool - 'b__21_1'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed + 'b__22_1'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed { // Code size 15 (0xf) .maxstack 8 @@ -4555,19 +4601,19 @@ IL_000b: ldnull IL_000c: cgt.un IL_000e: ret - } // end of method '<>c__21`2'::'b__21_1' + } // end of method '<>c__22`2'::'b__22_1' .method assembly hidebysig instance !TB - 'b__21_2'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed + 'b__22_2'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.1 IL_0001: callvirt instance !1 class '<>f__AnonymousType17`2'::get_t() IL_0006: ret - } // end of method '<>c__21`2'::'b__21_2' + } // end of method '<>c__22`2'::'b__22_2' - } // end of class '<>c__21`2' + } // end of class '<>c__22`2' .field public class [mscorlib]System.Collections.Generic.IEnumerable`1 customers .field public class [mscorlib]System.Collections.Generic.IEnumerable`1 orders @@ -5305,49 +5351,125 @@ IL_0049: ret } // end of method QueryExpressions::Issue437 + .method public hidebysig static class [mscorlib]System.Collections.Generic.IEnumerable`1 + Issue1310a(bool test) cil managed + { + // Code size 178 (0xb2) + .maxstack 3 + IL_0000: ldarg.0 + IL_0001: brtrue.s IL_0058 + + IL_0003: ldc.i4.0 + IL_0004: ldc.i4 0xff + IL_0009: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_000e: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_2' + IL_0013: dup + IL_0014: brtrue.s IL_002d + + IL_0016: pop + IL_0017: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_001c: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_2'(int32) + IL_0022: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0027: dup + IL_0028: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_2' + IL_002d: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0032: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_3' + IL_0037: dup + IL_0038: brtrue.s IL_0051 + + IL_003a: pop + IL_003b: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0040: ldftn instance char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_3'(int32) + IL_0046: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_004b: dup + IL_004c: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_3' + IL_0051: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0056: br.s IL_00ab + + IL_0058: ldc.i4.0 + IL_0059: ldc.i4 0xff + IL_005e: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_0063: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_0' + IL_0068: dup + IL_0069: brtrue.s IL_0082 + + IL_006b: pop + IL_006c: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0071: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_0'(int32) + IL_0077: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_007c: dup + IL_007d: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_0' + IL_0082: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0087: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_1' + IL_008c: dup + IL_008d: brtrue.s IL_00a6 + + IL_008f: pop + IL_0090: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0095: ldftn instance char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_1'(int32) + IL_009b: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_00a0: dup + IL_00a1: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_1' + IL_00a6: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_00ab: dup + IL_00ac: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Concat(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Collections.Generic.IEnumerable`1) + IL_00b1: ret + } // end of method QueryExpressions::Issue1310a + .method public hidebysig static valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 Cast(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 a) cil managed { // Code size 110 (0x6e) .maxstack 3 IL_0000: ldarg.0 - IL_0001: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_0' + IL_0001: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_0' IL_0006: dup IL_0007: brtrue.s IL_0020 IL_0009: pop - IL_000a: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_000f: ldftn instance class '<>f__AnonymousType17`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_0'(!0) + IL_000a: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_000f: ldftn instance class '<>f__AnonymousType17`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_0'(!0) IL_0015: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2'>::.ctor(object, native int) IL_001a: dup - IL_001b: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_0' + IL_001b: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_0' IL_0020: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType17`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) - IL_0025: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_1' + IL_0025: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_1' IL_002a: dup IL_002b: brtrue.s IL_0044 IL_002d: pop - IL_002e: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_0033: ldftn instance bool class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_1'(class '<>f__AnonymousType17`2') + IL_002e: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_0033: ldftn instance bool class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_1'(class '<>f__AnonymousType17`2') IL_0039: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2',bool>::.ctor(object, native int) IL_003e: dup - IL_003f: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_1' + IL_003f: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_1' IL_0044: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Wheref__AnonymousType17`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) - IL_0049: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_2' + IL_0049: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_2' IL_004e: dup IL_004f: brtrue.s IL_0068 IL_0051: pop - IL_0052: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_0057: ldftn instance !1 class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_2'(class '<>f__AnonymousType17`2') + IL_0052: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_0057: ldftn instance !1 class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_2'(class '<>f__AnonymousType17`2') IL_005d: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2',!!TB>::.ctor(object, native int) IL_0062: dup - IL_0063: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_2' + IL_0063: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_2' IL_0068: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType17`2',!!1>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_006d: ret diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.roslyn.il index fe6097b4f..72381673d 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.roslyn.il +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/QueryExpressions.roslyn.il @@ -3960,6 +3960,10 @@ .field public static class [mscorlib]System.Func`2,class '<>f__AnonymousType16`2'> '<>9__19_1' .field public static class [mscorlib]System.Func`2 '<>9__20_0' .field public static class [mscorlib]System.Func`2 '<>9__20_1' + .field public static class [mscorlib]System.Func`2 '<>9__21_0' + .field public static class [mscorlib]System.Func`2 '<>9__21_1' + .field public static class [mscorlib]System.Func`2 '<>9__21_2' + .field public static class [mscorlib]System.Func`2 '<>9__21_3' .method private hidebysig specialname rtspecialname static void .cctor() cil managed { @@ -4605,25 +4609,67 @@ IL_0001: ret } // end of method '<>c'::'b__20_1' + .method assembly hidebysig instance bool + 'b__21_0'(int32 c) cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsLetter(char) + IL_0007: ret + } // end of method '<>c'::'b__21_0' + + .method assembly hidebysig instance char + 'b__21_1'(int32 c) cil managed + { + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: ret + } // end of method '<>c'::'b__21_1' + + .method assembly hidebysig instance bool + 'b__21_2'(int32 c) cil managed + { + // Code size 8 (0x8) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: call bool [mscorlib]System.Char::IsDigit(char) + IL_0007: ret + } // end of method '<>c'::'b__21_2' + + .method assembly hidebysig instance char + 'b__21_3'(int32 c) cil managed + { + // Code size 3 (0x3) + .maxstack 8 + IL_0000: ldarg.1 + IL_0001: conv.u2 + IL_0002: ret + } // end of method '<>c'::'b__21_3' + } // end of class '<>c' - .class auto ansi serializable sealed nested private beforefieldinit '<>c__21`2' + .class auto ansi serializable sealed nested private beforefieldinit '<>c__22`2' extends [mscorlib]System.Object { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' '<>9' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2'> '<>9__21_0' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',bool> '<>9__21_1' - .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',!TB> '<>9__21_2' + .field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' '<>9' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2'> '<>9__22_0' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',bool> '<>9__22_1' + .field public static class [mscorlib]System.Func`2f__AnonymousType17`2',!TB> '<>9__22_2' .method private hidebysig specialname rtspecialname static void .cctor() cil managed { // Code size 11 (0xb) .maxstack 8 - IL_0000: newobj instance void class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::.ctor() - IL_0005: stsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' + IL_0000: newobj instance void class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::.ctor() + IL_0005: stsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' IL_000a: ret - } // end of method '<>c__21`2'::.cctor + } // end of method '<>c__22`2'::.cctor .method public hidebysig specialname rtspecialname instance void .ctor() cil managed @@ -4634,10 +4680,10 @@ IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: nop IL_0007: ret - } // end of method '<>c__21`2'::.ctor + } // end of method '<>c__22`2'::.ctor .method assembly hidebysig instance class '<>f__AnonymousType17`2' - 'b__21_0'(!TA m) cil managed + 'b__22_0'(!TA m) cil managed { // Code size 23 (0x17) .maxstack 8 @@ -4649,10 +4695,10 @@ IL_0011: newobj instance void class '<>f__AnonymousType17`2'::.ctor(!0, !1) IL_0016: ret - } // end of method '<>c__21`2'::'b__21_0' + } // end of method '<>c__22`2'::'b__22_0' .method assembly hidebysig instance bool - 'b__21_1'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed + 'b__22_1'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed { // Code size 15 (0xf) .maxstack 8 @@ -4662,19 +4708,19 @@ IL_000b: ldnull IL_000c: cgt.un IL_000e: ret - } // end of method '<>c__21`2'::'b__21_1' + } // end of method '<>c__22`2'::'b__22_1' .method assembly hidebysig instance !TB - 'b__21_2'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed + 'b__22_2'(class '<>f__AnonymousType17`2' '<>h__TransparentIdentifier0') cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.1 IL_0001: callvirt instance !1 class '<>f__AnonymousType17`2'::get_t() IL_0006: ret - } // end of method '<>c__21`2'::'b__21_2' + } // end of method '<>c__22`2'::'b__22_2' - } // end of class '<>c__21`2' + } // end of class '<>c__22`2' .field public class [mscorlib]System.Collections.Generic.IEnumerable`1 customers .field public class [mscorlib]System.Collections.Generic.IEnumerable`1 orders @@ -5502,6 +5548,91 @@ IL_004e: ret } // end of method QueryExpressions::Issue437 + .method public hidebysig static class [mscorlib]System.Collections.Generic.IEnumerable`1 + Issue1310a(bool test) cil managed + { + // Code size 185 (0xb9) + .maxstack 3 + .locals init (class [mscorlib]System.Collections.Generic.IEnumerable`1 V_0, + class [mscorlib]System.Collections.Generic.IEnumerable`1 V_1) + IL_0000: nop + IL_0001: ldarg.0 + IL_0002: brtrue.s IL_0059 + + IL_0004: ldc.i4.0 + IL_0005: ldc.i4 0xff + IL_000a: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_000f: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_2' + IL_0014: dup + IL_0015: brtrue.s IL_002e + + IL_0017: pop + IL_0018: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_001d: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_2'(int32) + IL_0023: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_0028: dup + IL_0029: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_2' + IL_002e: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0033: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_3' + IL_0038: dup + IL_0039: brtrue.s IL_0052 + + IL_003b: pop + IL_003c: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0041: ldftn instance char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_3'(int32) + IL_0047: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_004c: dup + IL_004d: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_3' + IL_0052: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0057: br.s IL_00ac + + IL_0059: ldc.i4.0 + IL_005a: ldc.i4 0xff + IL_005f: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Range(int32, + int32) + IL_0064: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_0' + IL_0069: dup + IL_006a: brtrue.s IL_0083 + + IL_006c: pop + IL_006d: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0072: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_0'(int32) + IL_0078: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_007d: dup + IL_007e: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_0' + IL_0083: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Where(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_0088: ldsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_1' + IL_008d: dup + IL_008e: brtrue.s IL_00a7 + + IL_0090: pop + IL_0091: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9' + IL_0096: ldftn instance char ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'b__21_1'(int32) + IL_009c: newobj instance void class [mscorlib]System.Func`2::.ctor(object, + native int) + IL_00a1: dup + IL_00a2: stsfld class [mscorlib]System.Func`2 ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c'::'<>9__21_1' + IL_00a7: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Select(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Func`2) + IL_00ac: stloc.0 + IL_00ad: ldloc.0 + IL_00ae: ldloc.0 + IL_00af: call class [mscorlib]System.Collections.Generic.IEnumerable`1 [System.Core]System.Linq.Enumerable::Concat(class [mscorlib]System.Collections.Generic.IEnumerable`1, + class [mscorlib]System.Collections.Generic.IEnumerable`1) + IL_00b4: stloc.1 + IL_00b5: br.s IL_00b7 + + IL_00b7: ldloc.1 + IL_00b8: ret + } // end of method QueryExpressions::Issue1310a + .method public hidebysig static valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 Cast(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 a) cil managed { @@ -5510,43 +5641,43 @@ .locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 V_0) IL_0000: nop IL_0001: ldarg.0 - IL_0002: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_0' + IL_0002: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_0' IL_0007: dup IL_0008: brtrue.s IL_0021 IL_000a: pop - IL_000b: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_0010: ldftn instance class '<>f__AnonymousType17`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_0'(!0) + IL_000b: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_0010: ldftn instance class '<>f__AnonymousType17`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_0'(!0) IL_0016: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2'>::.ctor(object, native int) IL_001b: dup - IL_001c: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_0' + IL_001c: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2'> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_0' IL_0021: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType17`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) - IL_0026: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_1' + IL_0026: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_1' IL_002b: dup IL_002c: brtrue.s IL_0045 IL_002e: pop - IL_002f: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_0034: ldftn instance bool class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_1'(class '<>f__AnonymousType17`2') + IL_002f: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_0034: ldftn instance bool class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_1'(class '<>f__AnonymousType17`2') IL_003a: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2',bool>::.ctor(object, native int) IL_003f: dup - IL_0040: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_1' + IL_0040: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',bool> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_1' IL_0045: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Wheref__AnonymousType17`2'>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) - IL_004a: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_2' + IL_004a: ldsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_2' IL_004f: dup IL_0050: brtrue.s IL_0069 IL_0052: pop - IL_0053: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9' - IL_0058: ldftn instance !1 class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'b__21_2'(class '<>f__AnonymousType17`2') + IL_0053: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2' class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9' + IL_0058: ldftn instance !1 class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'b__22_2'(class '<>f__AnonymousType17`2') IL_005e: newobj instance void class [mscorlib]System.Func`2f__AnonymousType17`2',!!TB>::.ctor(object, native int) IL_0063: dup - IL_0064: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__21`2'::'<>9__21_2' + IL_0064: stsfld class [mscorlib]System.Func`2f__AnonymousType17`2',!1> class ICSharpCode.Decompiler.Tests.TestCases.Pretty.QueryExpressions/'<>c__22`2'::'<>9__22_2' IL_0069: call valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.MaybeExtensions::Selectf__AnonymousType17`2',!!1>(valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.Maybe`1, class [mscorlib]System.Func`2) IL_006e: stloc.0 From 91ee034fb79f3e1889ebecef2da07521ffb2a947 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 23 Jan 2019 00:24:56 +0100 Subject: [PATCH 07/24] Fix indentation of query expressions. --- .../CSharp/OutputVisitor/CSharpOutputVisitor.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs b/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs index 39b6bef3e..3341a3ee1 100644 --- a/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs @@ -1141,11 +1141,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor public virtual void VisitQueryExpression(QueryExpression queryExpression) { StartNode(queryExpression); - bool indent = queryExpression.Parent is QueryClause && !(queryExpression.Parent is QueryContinuationClause); - if (indent) { - writer.Indent(); - NewLine(); - } + writer.Indent(); bool first = true; foreach (var clause in queryExpression.Clauses) { if (first) { @@ -1157,9 +1153,7 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor } clause.AcceptVisitor(this); } - if (indent) { - writer.Unindent(); - } + writer.Unindent(); EndNode(queryExpression); } From d22e2ac677aa86ca5be2c84c0d9b9ecd2bfc14c9 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 26 Jan 2019 20:25:37 +0100 Subject: [PATCH 08/24] Add header and comments describing transformation. Add missing ILRanges. --- .../IL/Transforms/CombineExitsTransform.cs | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs index 469fbdedf..db08305dd 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/CombineExitsTransform.cs @@ -1,6 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Text; +// Copyright (c) 2019 Siegfried Pammer +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. namespace ICSharpCode.Decompiler.IL.Transforms { @@ -13,18 +27,24 @@ namespace ICSharpCode.Decompiler.IL.Transforms var block = container.EntryPoint; if (block.Kind != BlockKind.ControlFlow) return; - if (!(block.Instructions.SecondToLastOrDefault() is IfInstruction ifInst && block.Instructions.LastOrDefault() is Leave leave2)) + if (!(block.Instructions.SecondToLastOrDefault() is IfInstruction ifInst && block.Instructions.LastOrDefault() is Leave leaveElse)) return; if (!ifInst.FalseInst.MatchNop()) return; if (!(Block.Unwrap(ifInst.TrueInst) is Leave leave)) return; - if (!(leave.IsLeavingFunction && leave2.IsLeavingFunction)) + if (!(leave.IsLeavingFunction && leaveElse.IsLeavingFunction)) return; - if (leave.Value.MatchNop() || leave2.Value.MatchNop()) + if (leave.Value.MatchNop() || leaveElse.Value.MatchNop()) return; - IfInstruction value = new IfInstruction(ifInst.Condition, leave.Value, leave2.Value); - Leave combinedLeave = new Leave(leave.TargetContainer, value); + // if (cond) { + // leave (value) + // } + // leave (elseValue) + // => + // leave (if (cond) value else elseValue) + IfInstruction value = new IfInstruction(ifInst.Condition, leave.Value, leaveElse.Value) { ILRange = ifInst.ILRange }; + Leave combinedLeave = new Leave(leave.TargetContainer, value) { ILRange = leaveElse.ILRange }; ifInst.ReplaceWith(combinedLeave); block.Instructions.RemoveAt(combinedLeave.ChildIndex + 1); } From c23522dca18d7bafaf6240aace4d02661b235c05 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 13 Feb 2019 18:17:54 +0100 Subject: [PATCH 09/24] Add BAML decompiler engine from dnSpy. --- .../Metadata/AssemblyReferences.cs | 5 + .../Cases/AttachedEvent.xaml | 2 +- .../Cases/AvalonDockBrushes.xaml | 38 +- .../Cases/AvalonDockCommon.xaml | 24 +- .../Cases/EscapeSequence.xaml | 26 +- .../Cases/Issue445.xaml | 22 +- .../Cases/MarkupExtension.xaml | 11 +- .../Cases/MyControl.xaml | 8 +- .../Cases/NamespacePrefix.xaml | 17 +- .../Cases/Resources.xaml | 14 +- ILSpy.BamlDecompiler.Tests/Cases/Simple.xaml | 2 +- .../Cases/SimpleDictionary.xaml | 2 +- .../Cases/SimpleNames.xaml | 2 +- .../Cases/SimplePropertyElement.xaml | 7 +- ILSpy.BamlDecompiler/Baml/BamlContext.cs | 97 + ILSpy.BamlDecompiler/Baml/BamlDocument.cs | 39 + ILSpy.BamlDecompiler/Baml/BamlNode.cs | 164 ++ ILSpy.BamlDecompiler/Baml/BamlReader.cs | 259 ++ ILSpy.BamlDecompiler/Baml/BamlRecords.cs | 992 +++++++ ILSpy.BamlDecompiler/Baml/BamlWriter.cs | 65 + ILSpy.BamlDecompiler/Baml/KnownMembers.cs | 297 +++ ILSpy.BamlDecompiler/Baml/KnownThings.cs | 80 + ILSpy.BamlDecompiler/Baml/KnownThings.g.cs | 1321 ++++++++++ ILSpy.BamlDecompiler/Baml/KnownThings.gen.cs | 278 ++ ILSpy.BamlDecompiler/Baml/KnownTypes.cs | 788 ++++++ ILSpy.BamlDecompiler/Baml/test.cs | 2325 +++++++++++++++++ ILSpy.BamlDecompiler/BamlConnectionId.cs | 39 + ILSpy.BamlDecompiler/BamlElement.cs | 60 + ILSpy.BamlDecompiler/BamlResourceEntryNode.cs | 185 +- ILSpy.BamlDecompiler/CecilType.cs | 65 - ILSpy.BamlDecompiler/CecilTypeResolver.cs | 78 - .../Blocks/ConstructorParametersHandler.cs | 39 + .../Handlers/Blocks/DocumentHandler.cs | 38 + .../Handlers/Blocks/ElementHandler.cs | 56 + .../Handlers/Blocks/KeyElementStartHandler.cs | 49 + .../Handlers/Blocks/PropertyArrayHandler.cs | 47 + .../Handlers/Blocks/PropertyComplexHandler.cs | 47 + .../Blocks/PropertyDictionaryHandler.cs | 47 + .../Handlers/Blocks/PropertyListHandler.cs | 47 + .../Handlers/Records/AssemblyInfoHandler.cs | 31 + .../Handlers/Records/AttributeInfoHandler.cs | 31 + .../Handlers/Records/ConnectionIdHandler.cs | 37 + .../ConstructorParameterTypeHandler.cs | 48 + .../Records/ContentPropertyHandler.cs | 36 + .../Handlers/Records/DefAttributeHandler.cs | 39 + .../Records/DefAttributeKeyStringHandler.cs | 49 + .../Records/DefAttributeKeyTypeHandler.cs | 56 + .../Records/DeferableContentStartHandler.cs | 38 + .../Records/LineNumberAndPositionHandler.cs | 31 + .../Handlers/Records/LinePositionHandler.cs | 31 + .../Handlers/Records/LiteralContentHandler.cs | 42 + .../Records/OptimizedStaticResourceHandler.cs | 106 + .../Handlers/Records/PIMappingHandler.cs | 31 + .../PresentationOptionsAttributeHandler.cs | 40 + .../Handlers/Records/PropertyCustomHandler.cs | 160 ++ .../Handlers/Records/PropertyHandler.cs | 49 + .../Records/PropertyTypeReferenceHandler.cs | 56 + .../Records/PropertyWithConverterHandler.cs | 29 + .../Records/PropertyWithExtensionHandler.cs | 101 + .../PropertyWithStaticResourceIdHandler.cs | 65 + .../Handlers/Records/TextHandler.cs | 49 + .../Records/TextWithConverterHandler.cs | 29 + .../Handlers/Records/TypeInfoHandler.cs | 37 + .../Handlers/Records/XmlnsPropertyHandler.cs | 71 + ILSpy.BamlDecompiler/IHandlers.cs | 91 + .../ILSpy.BamlDecompiler.csproj | 90 +- ILSpy.BamlDecompiler/IRewritePass.cs | 29 + .../Rewrite/AttributeRewritePass.cs | 79 + .../ConnectionIdRewritePass.cs} | 127 +- .../Rewrite/DocumentRewritePass.cs | 44 + .../Rewrite/MarkupExtensionRewritePass.cs | 180 ++ .../Rewrite/XClassRewritePass.cs | 62 + .../BAML format.txt | 22 - .../BamlBinaryReader.cs | 40 - .../BamlRecordType.cs | 68 - .../IDependencyPropertyDescriptor.cs | 20 - .../IType.cs | 39 - .../ITypeResolver.cs | 14 - .../KeyMapping.cs | 46 - .../KnownInfo.cs | 1345 ---------- .../NodesCollection.cs | 57 - .../PropertyDeclaration.cs | 55 - .../ResourceName.cs | 29 - .../TypeDeclaration.cs | 167 -- .../XmlBamlElement.cs | 58 - .../XmlBamlNode.cs | 19 - .../XmlBamlProperty.cs | 59 - .../XmlBamlPropertyElement.cs | 45 - .../XmlBamlReader.cs | 1738 ------------ .../XmlBamlSimpleProperty.cs | 38 - .../XmlBamlText.cs | 30 - .../XmlNamespace.cs | 41 - .../XmlToClrNamespaceMapping.cs | 31 - .../SRMDependencyPropertyDescriptor.cs | 33 - ILSpy.BamlDecompiler/Xaml/NamespaceMap.cs | 46 + ILSpy.BamlDecompiler/Xaml/XamlExtension.cs | 83 + .../Xaml/XamlPathDeserializer.cs | 187 ++ ILSpy.BamlDecompiler/Xaml/XamlProperty.cs | 95 + ILSpy.BamlDecompiler/Xaml/XamlResourceKey.cs | 98 + ILSpy.BamlDecompiler/Xaml/XamlType.cs | 102 + ILSpy.BamlDecompiler/Xaml/XamlUtils.cs | 77 + ILSpy.BamlDecompiler/XamlContext.cs | 203 ++ ILSpy.BamlDecompiler/XamlDecompiler.cs | 65 + ILSpy.BamlDecompiler/XmlnsDictionary.cs | 123 + 104 files changed, 10357 insertions(+), 4392 deletions(-) create mode 100644 ILSpy.BamlDecompiler/Baml/BamlContext.cs create mode 100644 ILSpy.BamlDecompiler/Baml/BamlDocument.cs create mode 100644 ILSpy.BamlDecompiler/Baml/BamlNode.cs create mode 100644 ILSpy.BamlDecompiler/Baml/BamlReader.cs create mode 100644 ILSpy.BamlDecompiler/Baml/BamlRecords.cs create mode 100644 ILSpy.BamlDecompiler/Baml/BamlWriter.cs create mode 100644 ILSpy.BamlDecompiler/Baml/KnownMembers.cs create mode 100644 ILSpy.BamlDecompiler/Baml/KnownThings.cs create mode 100644 ILSpy.BamlDecompiler/Baml/KnownThings.g.cs create mode 100644 ILSpy.BamlDecompiler/Baml/KnownThings.gen.cs create mode 100644 ILSpy.BamlDecompiler/Baml/KnownTypes.cs create mode 100644 ILSpy.BamlDecompiler/Baml/test.cs create mode 100644 ILSpy.BamlDecompiler/BamlConnectionId.cs create mode 100644 ILSpy.BamlDecompiler/BamlElement.cs delete mode 100644 ILSpy.BamlDecompiler/CecilType.cs delete mode 100644 ILSpy.BamlDecompiler/CecilTypeResolver.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/ConstructorParametersHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/DocumentHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/ElementHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/PropertyArrayHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/PropertyComplexHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/PropertyDictionaryHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Blocks/PropertyListHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/AssemblyInfoHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/AttributeInfoHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/ConnectionIdHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/ContentPropertyHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/DeferableContentStartHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/LineNumberAndPositionHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/LinePositionHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PIMappingHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyCustomHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyWithConverterHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyWithExtensionHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/PropertyWithStaticResourceIdHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/TextHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/TextWithConverterHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/TypeInfoHandler.cs create mode 100644 ILSpy.BamlDecompiler/Handlers/Records/XmlnsPropertyHandler.cs create mode 100644 ILSpy.BamlDecompiler/IHandlers.cs create mode 100644 ILSpy.BamlDecompiler/IRewritePass.cs create mode 100644 ILSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs rename ILSpy.BamlDecompiler/{ConnectMethodDecompiler.cs => Rewrite/ConnectionIdRewritePass.cs} (58%) create mode 100644 ILSpy.BamlDecompiler/Rewrite/DocumentRewritePass.cs create mode 100644 ILSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs create mode 100644 ILSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/BAML format.txt delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/BamlBinaryReader.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/BamlRecordType.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/IDependencyPropertyDescriptor.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/IType.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/ITypeResolver.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/KeyMapping.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/KnownInfo.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/NodesCollection.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/PropertyDeclaration.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/ResourceName.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/TypeDeclaration.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlElement.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlNode.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlProperty.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlPropertyElement.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlReader.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlSimpleProperty.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlBamlText.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlNamespace.cs delete mode 100644 ILSpy.BamlDecompiler/Ricciolo.StylesExplorer.MarkupReflection/XmlToClrNamespaceMapping.cs delete mode 100644 ILSpy.BamlDecompiler/SRMDependencyPropertyDescriptor.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/NamespaceMap.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlExtension.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlPathDeserializer.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlProperty.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlResourceKey.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlType.cs create mode 100644 ILSpy.BamlDecompiler/Xaml/XamlUtils.cs create mode 100644 ILSpy.BamlDecompiler/XamlContext.cs create mode 100644 ILSpy.BamlDecompiler/XamlDecompiler.cs create mode 100644 ILSpy.BamlDecompiler/XmlnsDictionary.cs diff --git a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs index 70631c246..2fd984596 100644 --- a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs +++ b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs @@ -156,6 +156,11 @@ namespace ICSharpCode.Decompiler.Metadata return name; } + + public override string ToString() + { + return FullName; + } } public class AssemblyReference : IAssemblyReference diff --git a/ILSpy.BamlDecompiler.Tests/Cases/AttachedEvent.xaml b/ILSpy.BamlDecompiler.Tests/Cases/AttachedEvent.xaml index 866abc9b6..4f45dfe48 100644 --- a/ILSpy.BamlDecompiler.Tests/Cases/AttachedEvent.xaml +++ b/ILSpy.BamlDecompiler.Tests/Cases/AttachedEvent.xaml @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockBrushes.xaml b/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockBrushes.xaml index cc7e517c9..b934fe7ca 100644 --- a/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockBrushes.xaml +++ b/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockBrushes.xaml @@ -1,23 +1,23 @@  - + - + - + - + - + - + - + @@ -29,25 +29,25 @@ - - + + - + - - - - - - + + + + + + - - + + - + \ No newline at end of file diff --git a/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockCommon.xaml b/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockCommon.xaml index bc3511614..bcb18aed2 100644 --- a/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockCommon.xaml +++ b/ILSpy.BamlDecompiler.Tests/Cases/AvalonDockCommon.xaml @@ -2,7 +2,7 @@ - + @@ -10,24 +10,24 @@ - +