Exemplo n.º 1
0
        private void CreateInitialProxies(MultiDictionary <Symbol, CSharpSyntaxNode> captured)
        {
            var typeMap = stateMachineClass.TypeMap;

            var orderedCaptured =
                from local in captured.Keys
                orderby local.Name, (local.Locations.Length == 0) ? 0 : local.Locations[0].SourceSpan.Start
            select local;

            foreach (var sym in orderedCaptured)
            {
                var local = sym as LocalSymbol;
                if ((object)local != null &&
                    (local.SynthesizedLocalKind == SynthesizedLocalKind.None ||
                     local.SynthesizedLocalKind == SynthesizedLocalKind.LambdaDisplayClass))
                {
                    // create proxies for user-defined variables and for lambda closures:
                    Debug.Assert(local.RefKind == RefKind.None);
                    MakeInitialProxy(typeMap, captured, local);
                    continue;
                }

                var parameter = sym as ParameterSymbol;
                if ((object)parameter != null)
                {
                    if (parameter.IsThis)
                    {
                        var proxyField = F.StateMachineField(method.ContainingType, GeneratedNames.ThisProxyName(), isPublic: true);
                        variableProxies.Add(parameter, new CapturedToFrameSymbolReplacement(proxyField));

                        if (PreserveInitialParameterValues)
                        {
                            var initialThis = method.ContainingType.IsStructType() ?
                                              F.StateMachineField(method.ContainingType, GeneratedNames.StateMachineThisParameterProxyName(), isPublic: true) : proxyField;

                            initialParameters.Add(parameter, new CapturedToFrameSymbolReplacement(initialThis));
                        }
                    }
                    else
                    {
                        var proxyField = F.StateMachineField(typeMap.SubstituteType(parameter.Type), parameter.Name, isPublic: true);
                        variableProxies.Add(parameter, new CapturedToFrameSymbolReplacement(proxyField));

                        if (PreserveInitialParameterValues)
                        {
                            string proxyName = GeneratedNames.StateMachineParameterProxyName(parameter.Name);
                            initialParameters.Add(parameter, new CapturedToFrameSymbolReplacement(
                                                      F.StateMachineField(typeMap.SubstituteType(parameter.Type), proxyName, isPublic: true)));
                        }
                        if (parameter.Type.IsRestrictedType())
                        {
                            // CS4013: Instance of type '{0}' cannot be used inside an anonymous function, query expression, iterator block or async method
                            diagnostics.Add(ErrorCode.ERR_SpecialByRefInLambda, parameter.Locations[0], parameter.Type);
                        }
                    }
                }
            }
        }