private static string GetCapturedVariableFieldName(Symbol variable, ref int uniqueId) { if (IsThis(variable)) { return(GeneratedNames.ThisProxyName()); } var local = variable as LocalSymbol; if ((object)local != null) { if (local.SynthesizedLocalKind == SynthesizedLocalKind.LambdaDisplayClass) { return(GeneratedNames.MakeLambdaDisplayClassStorageName(uniqueId++)); } if (local.SynthesizedLocalKind == SynthesizedLocalKind.ExceptionFilterAwaitHoistedExceptionLocal) { return(GeneratedNames.MakeHoistedLocalFieldName(string.Empty, uniqueId++)); } } Debug.Assert(variable.Name != null); return(variable.Name); }
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); } } } } }