diff --git a/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs b/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs index 9cef44869..e988dd370 100644 --- a/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs @@ -765,6 +765,19 @@ namespace ICSharpCode.Decompiler.CSharp.OutputVisitor EndNode(directionExpression); } + + public virtual void VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression) + { + StartNode(outVarDeclarationExpression); + + WriteKeyword(OutVarDeclarationExpression.OutKeywordRole); + Space(); + outVarDeclarationExpression.Type.AcceptVisitor(this); + Space(); + outVarDeclarationExpression.Expression.AcceptVisitor(this); + + EndNode(outVarDeclarationExpression); + } public virtual void VisitIdentifierExpression(IdentifierExpression identifierExpression) { diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/DepthFirstAstVisitor.cs b/ICSharpCode.Decompiler/CSharp/Syntax/DepthFirstAstVisitor.cs index f0a49e0ef..958a4a1d6 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/DepthFirstAstVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/DepthFirstAstVisitor.cs @@ -470,7 +470,12 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax { VisitChildren (objectCreateExpression); } - + + public virtual void VisitOutVarDeclarationExpression (OutVarDeclarationExpression outVarDeclarationExpression) + { + VisitChildren (outVarDeclarationExpression); + } + public virtual void VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression) { VisitChildren (anonymousTypeCreateExpression); @@ -1077,7 +1082,12 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax { return VisitChildren (objectCreateExpression); } - + + public virtual T VisitOutVarDeclarationExpression (OutVarDeclarationExpression outVarDeclarationExpression) + { + return VisitChildren(outVarDeclarationExpression); + } + public virtual T VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression) { return VisitChildren (anonymousTypeCreateExpression); @@ -1684,7 +1694,12 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax { return VisitChildren (objectCreateExpression, data); } - + + public virtual S VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression, T data) + { + return VisitChildren (outVarDeclarationExpression, data); + } + public virtual S VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression, T data) { return VisitChildren (anonymousTypeCreateExpression, data); diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/Expressions/OutVarDeclarationExpression.cs b/ICSharpCode.Decompiler/CSharp/Syntax/Expressions/OutVarDeclarationExpression.cs new file mode 100644 index 000000000..392ca34c5 --- /dev/null +++ b/ICSharpCode.Decompiler/CSharp/Syntax/Expressions/OutVarDeclarationExpression.cs @@ -0,0 +1,73 @@ +// Copyright (c) 2017 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.CSharp.Syntax +{ + /// + /// out type expression + /// + public class OutVarDeclarationExpression : Expression + { + public readonly static TokenRole OutKeywordRole = DirectionExpression.OutKeywordRole; + + public CSharpTokenNode OutKeywordToken { + get { return GetChildByRole(OutKeywordRole); } + } + + public AstType Type { + get { return GetChildByRole(Roles.Type); } + set { SetChildByRole(Roles.Type, value); } + } + + public Expression Expression { + get { return GetChildByRole(Roles.Expression); } + set { SetChildByRole(Roles.Expression, value); } + } + + public OutVarDeclarationExpression() + { + } + + public OutVarDeclarationExpression(AstType type, string name) + { + this.Type = type; + this.Expression = new IdentifierExpression(name); + } + + public override void AcceptVisitor(IAstVisitor visitor) + { + visitor.VisitOutVarDeclarationExpression(this); + } + + public override T AcceptVisitor(IAstVisitor visitor) + { + return visitor.VisitOutVarDeclarationExpression(this); + } + + public override S AcceptVisitor(IAstVisitor visitor, T data) + { + return visitor.VisitOutVarDeclarationExpression(this, data); + } + + protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) + { + var o = other as OutVarDeclarationExpression; + return o != null && this.Type.DoMatch(o.Type, match) && this.Expression.DoMatch(o.Expression, match); + } + } +} diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/IAstVisitor.cs b/ICSharpCode.Decompiler/CSharp/Syntax/IAstVisitor.cs index 00cf42c83..1ae0308c3 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/IAstVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/IAstVisitor.cs @@ -47,6 +47,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax void VisitNamedExpression(NamedExpression namedExpression); void VisitNullReferenceExpression(NullReferenceExpression nullReferenceExpression); void VisitObjectCreateExpression(ObjectCreateExpression objectCreateExpression); + void VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression); void VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression); void VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression); void VisitPointerReferenceExpression(PointerReferenceExpression pointerReferenceExpression); @@ -179,6 +180,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax S VisitNamedExpression(NamedExpression namedExpression); S VisitNullReferenceExpression(NullReferenceExpression nullReferenceExpression); S VisitObjectCreateExpression(ObjectCreateExpression objectCreateExpression); + S VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression); S VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression); S VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression); S VisitPointerReferenceExpression(PointerReferenceExpression pointerReferenceExpression); @@ -311,6 +313,7 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax S VisitNamedExpression(NamedExpression namedExpression, T data); S VisitNullReferenceExpression(NullReferenceExpression nullReferenceExpression, T data); S VisitObjectCreateExpression(ObjectCreateExpression objectCreateExpression, T data); + S VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression, T data); S VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression, T data); S VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression, T data); S VisitPointerReferenceExpression(PointerReferenceExpression pointerReferenceExpression, T data); diff --git a/ICSharpCode.Decompiler/CSharp/Syntax/ObservableAstVisitor.cs b/ICSharpCode.Decompiler/CSharp/Syntax/ObservableAstVisitor.cs index 0248d26f6..eaaf8a2b9 100644 --- a/ICSharpCode.Decompiler/CSharp/Syntax/ObservableAstVisitor.cs +++ b/ICSharpCode.Decompiler/CSharp/Syntax/ObservableAstVisitor.cs @@ -639,7 +639,14 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax { Visit(EnterObjectCreateExpression, LeaveObjectCreateExpression, objectCreateExpression); } - + + public event Action EnterOutVarDeclarationExpression, LeaveOutVarDeclarationExpression; + + void IAstVisitor.VisitOutVarDeclarationExpression(OutVarDeclarationExpression outVarDeclarationExpression) + { + Visit(EnterOutVarDeclarationExpression, LeaveOutVarDeclarationExpression, outVarDeclarationExpression); + } + public event Action EnterAnonymousTypeCreateExpression, LeaveAnonymousTypeCreateExpression; void IAstVisitor.VisitAnonymousTypeCreateExpression(AnonymousTypeCreateExpression anonymousTypeCreateExpression) diff --git a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj index 5a411cedc..276e47dae 100644 --- a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj +++ b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj @@ -94,6 +94,7 @@ +