63 lines
2.6 KiB
C#
63 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|