private void EmitVariablesIfPresent(JsonTextWriter jsonWriter, ExpressionEmitter emitter) { if (!this.context.SemanticModel.Root.VariableDeclarations.Any(symbol => !this.context.VariablesToInline.Contains(symbol)) && this.context.FunctionVariables.Count == 0) { return; } jsonWriter.WritePropertyName("variables"); jsonWriter.WriteStartObject(); //emit internal variables foreach (var functionVariable in this.context.FunctionVariables.Values.OrderBy(x => x.Name, LanguageConstants.IdentifierComparer)) { jsonWriter.WritePropertyName(functionVariable.Name); emitter.EmitExpression(functionVariable.Value); } var variableLookup = this.context.SemanticModel.Root.VariableDeclarations.ToLookup(variableSymbol => variableSymbol.Value is ForSyntax); // local function IEnumerable <VariableSymbol> GetNonInlinedVariables(bool valueIsLoop) => variableLookup[valueIsLoop].Where(symbol => !this.context.VariablesToInline.Contains(symbol)); if (GetNonInlinedVariables(valueIsLoop: true).Any()) { // we have variables whose values are loops emitter.EmitProperty("copy", () => { jsonWriter.WriteStartArray(); foreach (var variableSymbol in GetNonInlinedVariables(valueIsLoop: true)) { // enforced by the lookup predicate above var @for = (ForSyntax)variableSymbol.Value; emitter.EmitCopyObject(variableSymbol.Name, @for, @for.Body); } jsonWriter.WriteEndArray(); }); } // emit non-loop variables foreach (var variableSymbol in GetNonInlinedVariables(valueIsLoop: false)) { jsonWriter.WritePropertyName(variableSymbol.Name); emitter.EmitExpression(variableSymbol.Value); } jsonWriter.WriteEndObject(); }
private void EmitVariable(VariableSymbol variableSymbol, ExpressionEmitter emitter) { emitter.EmitExpression(variableSymbol.Value); }