using System.Collections.Immutable; using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp; internal sealed class BoundDynamicInvocation : BoundDynamicInvocableBase { protected override ImmutableArray Children => StaticCast.From(base.Arguments.Insert(0, base.Expression)); public new TypeSymbol Type => base.Type; public ImmutableArray ArgumentNamesOpt { get; } public ImmutableArray ArgumentRefKindsOpt { get; } public ImmutableArray ApplicableMethods { get; } public BoundDynamicInvocation(SyntaxNode syntax, ImmutableArray argumentNamesOpt, ImmutableArray argumentRefKindsOpt, ImmutableArray applicableMethods, BoundExpression expression, ImmutableArray arguments, TypeSymbol type, bool hasErrors = false) : base(BoundKind.DynamicInvocation, syntax, expression, arguments, type, hasErrors || expression.HasErrors() || arguments.HasErrors()) { ArgumentNamesOpt = argumentNamesOpt; ArgumentRefKindsOpt = argumentRefKindsOpt; ApplicableMethods = applicableMethods; } [DebuggerStepThrough] public override BoundNode? Accept(BoundTreeVisitor visitor) { return visitor.VisitDynamicInvocation(this); } public BoundDynamicInvocation Update(ImmutableArray argumentNamesOpt, ImmutableArray argumentRefKindsOpt, ImmutableArray applicableMethods, BoundExpression expression, ImmutableArray arguments, TypeSymbol type) { if (argumentNamesOpt != ArgumentNamesOpt || argumentRefKindsOpt != ArgumentRefKindsOpt || applicableMethods != ApplicableMethods || expression != base.Expression || arguments != base.Arguments || !TypeSymbol.Equals(type, Type, (TypeCompareKind)0)) { BoundDynamicInvocation boundDynamicInvocation = new BoundDynamicInvocation(Syntax, argumentNamesOpt, argumentRefKindsOpt, applicableMethods, expression, arguments, type, base.HasErrors); boundDynamicInvocation.CopyAttributes(this); return boundDynamicInvocation; } return this; } }