/// <summary> /// Rewrite an iterator method into a state machine class. /// </summary> /// <param name="body">The original body of the method</param> /// <param name="method">The method's identity</param> /// <param name="compilationState">The collection of generated methods that result from this transformation and which must be emitted</param> /// <param name="diagnostics">Diagnostic bag for diagnostics.</param> /// <param name="generateDebugInfo"></param> internal static BoundStatement Rewrite( BoundStatement body, MethodSymbol method, TypeCompilationState compilationState, DiagnosticBag diagnostics, bool generateDebugInfo) { TypeSymbol elementType = method.IteratorElementType; if ((object)elementType == null) { return body; } // Figure out what kind of iterator we are generating. bool isEnumerable; switch (method.ReturnType.OriginalDefinition.SpecialType) { case SpecialType.System_Collections_IEnumerable: case SpecialType.System_Collections_Generic_IEnumerable_T: isEnumerable = true; break; case SpecialType.System_Collections_IEnumerator: case SpecialType.System_Collections_Generic_IEnumerator_T: isEnumerable = false; break; default: throw ExceptionUtilities.UnexpectedValue(method.ReturnType.OriginalDefinition.SpecialType); } var iteratorClass = new IteratorStateMachine(method, isEnumerable, elementType, compilationState); return new IteratorRewriter(body, method, isEnumerable, iteratorClass, compilationState, diagnostics, generateDebugInfo).Rewrite(); }
internal IteratorConstructor(IteratorStateMachine container) : base(container) { var intType = container.DeclaringCompilation.GetSpecialType(SpecialType.System_Int32); parameters = ImmutableArray.Create<ParameterSymbol>( new SynthesizedParameterSymbol(this, intType, 0, RefKind.None, GeneratedNames.MakeStateMachineStateName())); }
public IteratorFinallyMethodSymbol(IteratorStateMachine stateMachineType, string name) { Debug.Assert(stateMachineType != null); Debug.Assert(name != null); _stateMachineType = stateMachineType; _name = name; }
public IteratorFinallyMethodSymbol(IteratorStateMachine stateMachineType, string name) { Debug.Assert((object)stateMachineType != null); Debug.Assert(name != null); _stateMachineType = stateMachineType; _name = name; }
internal IteratorConstructor(IteratorStateMachine container) : base(container) { var intType = container.DeclaringCompilation.GetSpecialType(SpecialType.System_Int32); _parameters = ImmutableArray.Create <ParameterSymbol>( SynthesizedParameterSymbol.Create(this, intType, 0, RefKind.None, GeneratedNames.MakeStateMachineStateFieldName())); }
public IteratorFinallyMethodSymbol(IteratorStateMachine stateMachineType, string name) { Debug.Assert(stateMachineType != null); Debug.Assert(name != null); this.stateMachineType = stateMachineType; this.name = name; }
private IteratorRewriter( BoundStatement body, MethodSymbol method, bool isEnumerable, IteratorStateMachine iteratorClass, TypeCompilationState compilationState, DiagnosticBag diagnostics) : base(body, method, iteratorClass, compilationState, diagnostics) { // the element type may contain method type parameters, which are now alpha-renamed into type parameters of the generated class this.elementType = iteratorClass.ElementType; this.isEnumerable = isEnumerable; }
private IteratorRewriter( BoundStatement body, MethodSymbol method, bool isEnumerable, IteratorStateMachine stateMachineType, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics) : base(body, method, stateMachineType, slotAllocatorOpt, compilationState, diagnostics) { // the element type may contain method type parameters, which are now alpha-renamed into type parameters of the generated class _elementType = stateMachineType.ElementType; _isEnumerable = isEnumerable; }
private IteratorRewriter( BoundStatement body, MethodSymbol method, bool isEnumerable, IteratorStateMachine stateMachineType, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics) : base(body, method, stateMachineType, slotAllocatorOpt, compilationState, diagnostics) { // the element type may contain method type parameters, which are now alpha-renamed into type parameters of the generated class _elementType = stateMachineType.ElementType; _isEnumerable = isEnumerable; }
private IteratorRewriter( BoundStatement body, MethodSymbol method, bool isEnumerable, IteratorStateMachine iteratorClass, TypeCompilationState compilationState, DiagnosticBag diagnostics, bool generateDebugInfo) : base(body, method, iteratorClass, compilationState, diagnostics, generateDebugInfo) { // the element type may contain method type parameters, which are now alpha-renamed into type parameters of the generated class this.elementType = iteratorClass.ElementType; this.isEnumerable = isEnumerable; }
internal static BoundStatement Rewrite( BoundStatement body, MethodSymbol method, int methodOrdinal, ArrayBuilder <StateMachineStateDebugInfo> stateMachineStateDebugInfoBuilder, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, out IteratorStateMachine stateMachineType) { TypeWithAnnotations elementType = method.IteratorElementTypeWithAnnotations; if (elementType.IsDefault || method.IsAsync) { stateMachineType = null; return(body); } // Figure out what kind of iterator we are generating. bool isEnumerable; switch (method.ReturnType.OriginalDefinition.SpecialType) { case SpecialType.System_Collections_IEnumerable: case SpecialType.System_Collections_Generic_IEnumerable_T: isEnumerable = true; break; case SpecialType.System_Collections_IEnumerator: case SpecialType.System_Collections_Generic_IEnumerator_T: isEnumerable = false; break; default: throw ExceptionUtilities.UnexpectedValue(method.ReturnType.OriginalDefinition.SpecialType); } stateMachineType = new IteratorStateMachine(slotAllocatorOpt, compilationState, method, methodOrdinal, isEnumerable, elementType); compilationState.ModuleBuilderOpt.CompilationState.SetStateMachineType(method, stateMachineType); var rewriter = new IteratorRewriter(body, method, isEnumerable, stateMachineType, stateMachineStateDebugInfoBuilder, slotAllocatorOpt, compilationState, diagnostics); if (!rewriter.VerifyPresenceOfRequiredAPIs()) { return(body); } return(rewriter.Rewrite()); }
/// <summary> /// Rewrite an iterator method into a state machine class. /// </summary> internal static BoundStatement Rewrite( BoundStatement body, MethodSymbol method, int methodOrdinal, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics, out IteratorStateMachine stateMachineType) { TypeSymbol elementType = method.IteratorElementType; if ((object)elementType == null) { stateMachineType = null; return body; } // Figure out what kind of iterator we are generating. bool isEnumerable; switch (method.ReturnType.OriginalDefinition.SpecialType) { case SpecialType.System_Collections_IEnumerable: case SpecialType.System_Collections_Generic_IEnumerable_T: isEnumerable = true; break; case SpecialType.System_Collections_IEnumerator: case SpecialType.System_Collections_Generic_IEnumerator_T: isEnumerable = false; break; default: throw ExceptionUtilities.UnexpectedValue(method.ReturnType.OriginalDefinition.SpecialType); } stateMachineType = new IteratorStateMachine(slotAllocatorOpt, compilationState, method, methodOrdinal, isEnumerable, elementType); compilationState.ModuleBuilderOpt.CompilationState.SetStateMachineType(method, stateMachineType); var rewriter = new IteratorRewriter(body, method, isEnumerable, stateMachineType, slotAllocatorOpt, compilationState, diagnostics); if (!rewriter.VerifyPresenceOfRequiredAPIs()) { return body; } return rewriter.Rewrite(); }
/// <summary> /// Rewrite an iterator method into a state machine class. /// </summary> internal static BoundStatement Rewrite( BoundStatement body, MethodSymbol method, int methodOrdinal, VariableSlotAllocator slotAllocatorOpt, TypeCompilationState compilationState, DiagnosticBag diagnostics, out IteratorStateMachine stateMachineType) { TypeSymbol elementType = method.IteratorElementType; if ((object)elementType == null) { stateMachineType = null; return(body); } // Figure out what kind of iterator we are generating. bool isEnumerable; switch (method.ReturnType.OriginalDefinition.SpecialType) { case SpecialType.System_Collections_IEnumerable: case SpecialType.System_Collections_Generic_IEnumerable_T: isEnumerable = true; break; case SpecialType.System_Collections_IEnumerator: case SpecialType.System_Collections_Generic_IEnumerator_T: isEnumerable = false; break; default: throw ExceptionUtilities.UnexpectedValue(method.ReturnType.OriginalDefinition.SpecialType); } stateMachineType = new IteratorStateMachine(slotAllocatorOpt, compilationState, method, methodOrdinal, isEnumerable, elementType); compilationState.ModuleBuilderOpt.CompilationState.SetStateMachineType(method, stateMachineType); return(new IteratorRewriter(body, method, isEnumerable, stateMachineType, slotAllocatorOpt, compilationState, diagnostics).Rewrite()); }
public IteratorFinallyMethodSymbol(IteratorStateMachine stateMachineType, string name) { this.stateMachineType = stateMachineType; this.name = name; }
public IteratorFinallyMethodSymbol(IteratorStateMachine stateMachineType, string name) { this.stateMachineType = stateMachineType; this.name = name; }