using System.Collections.Immutable; using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp; internal sealed class BoundTryStatement : BoundStatement { public BoundBlock TryBlock { get; } public ImmutableArray CatchBlocks { get; } public BoundBlock? FinallyBlockOpt { get; } public LabelSymbol? FinallyLabelOpt { get; } public bool PreferFaultHandler { get; } public BoundTryStatement(SyntaxNode syntax, BoundBlock tryBlock, ImmutableArray catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt = null) : this(syntax, tryBlock, catchBlocks, finallyBlockOpt, finallyLabelOpt, preferFaultHandler: false) { } public BoundTryStatement(SyntaxNode syntax, BoundBlock tryBlock, ImmutableArray catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler, bool hasErrors = false) : base(BoundKind.TryStatement, syntax, hasErrors || tryBlock.HasErrors() || catchBlocks.HasErrors() || finallyBlockOpt.HasErrors()) { TryBlock = tryBlock; CatchBlocks = catchBlocks; FinallyBlockOpt = finallyBlockOpt; FinallyLabelOpt = finallyLabelOpt; PreferFaultHandler = preferFaultHandler; } [DebuggerStepThrough] public override BoundNode? Accept(BoundTreeVisitor visitor) { return visitor.VisitTryStatement(this); } public BoundTryStatement Update(BoundBlock tryBlock, ImmutableArray catchBlocks, BoundBlock? finallyBlockOpt, LabelSymbol? finallyLabelOpt, bool preferFaultHandler) { if (tryBlock != TryBlock || catchBlocks != CatchBlocks || finallyBlockOpt != FinallyBlockOpt || !SymbolEqualityComparer.ConsiderEverything.Equals(finallyLabelOpt, FinallyLabelOpt) || preferFaultHandler != PreferFaultHandler) { BoundTryStatement boundTryStatement = new BoundTryStatement(Syntax, tryBlock, catchBlocks, finallyBlockOpt, finallyLabelOpt, preferFaultHandler, base.HasErrors); boundTryStatement.CopyAttributes(this); return boundTryStatement; } return this; } }