Files

63 lines
2.6 KiB
C#
Raw Permalink Normal View History

2026-08-27 10:56:38 -06:00
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CodeGen;
using Microsoft.CodeAnalysis.PooledObjects;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp;
internal sealed class AsyncStateMachine : StateMachineTypeSymbol
{
private readonly TypeKind _typeKind;
private readonly MethodSymbol _constructor;
private readonly ImmutableArray<NamedTypeSymbol> _interfaces;
internal readonly TypeSymbol IteratorElementType;
public override TypeKind TypeKind => _typeKind;
internal override MethodSymbol Constructor => _constructor;
internal override bool IsRecord => false;
internal override bool IsRecordStruct => false;
public AsyncStateMachine(VariableSlotAllocator variableAllocatorOpt, TypeCompilationState compilationState, MethodSymbol asyncMethod, int asyncMethodOrdinal, TypeKind typeKind)
: base(variableAllocatorOpt, compilationState, asyncMethod, asyncMethodOrdinal)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
_typeKind = typeKind;
CSharpCompilation declaringCompilation = asyncMethod.DeclaringCompilation;
ArrayBuilder<NamedTypeSymbol> instance = ArrayBuilder<NamedTypeSymbol>.GetInstance();
bool isIterator = asyncMethod.IsIterator;
if (isIterator)
{
TypeSymbol typeSymbol = (IteratorElementType = base.TypeMap.SubstituteType(asyncMethod.IteratorElementTypeWithAnnotations).Type);
if (asyncMethod.IsAsyncReturningIAsyncEnumerable(declaringCompilation))
{
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)288).Construct(typeSymbol));
}
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)289).Construct(typeSymbol));
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)293).Construct(declaringCompilation.GetSpecialType((SpecialType)7)));
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)294));
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)287));
}
instance.Add(declaringCompilation.GetWellKnownType((WellKnownType)242));
_interfaces = instance.ToImmutableAndFree();
_constructor = (isIterator ? ((SynthesizedInstanceConstructor)new IteratorConstructor(this)) : ((SynthesizedInstanceConstructor)new AsyncConstructor(this)));
}
internal override bool HasPossibleWellKnownCloneMethod()
{
return false;
}
internal override ImmutableArray<NamedTypeSymbol> InterfacesNoUseSiteDiagnostics(ConsList<TypeSymbol> basesBeingResolved)
{
return _interfaces;
}
}