private static void EmitModuleParameters(JsonTextWriter jsonWriter, ModuleSymbol moduleSymbol, ExpressionEmitter emitter) { var paramsValue = moduleSymbol.TryGetBodyPropertyValue(LanguageConstants.ModuleParamsPropertyName); if (paramsValue is not ObjectSyntax paramsObjectSyntax) { // 'params' is optional if the module has no required params return; } jsonWriter.WritePropertyName("parameters"); jsonWriter.WriteStartObject(); foreach (var propertySyntax in paramsObjectSyntax.Properties) { if (!(propertySyntax.TryGetKeyText() is string keyName)) { // should have been caught by earlier validation throw new ArgumentException("Disallowed interpolation in module parameter"); } // we can't just call EmitObjectProperties here because the ObjectSyntax is flatter than the structure we're generating // because nested deployment parameters are objects with a single value property jsonWriter.WritePropertyName(keyName); jsonWriter.WriteStartObject(); if (propertySyntax.Value is ForSyntax @for) { // the value is a for-expression // write a single property copy loop emitter.EmitProperty("copy", () => { jsonWriter.WriteStartArray(); emitter.EmitCopyObject("value", @for, @for.Body, "value"); jsonWriter.WriteEndArray(); }); } else { // the value is not a for-expression - can emit normally emitter.EmitModuleParameterValue(propertySyntax.Value); } jsonWriter.WriteEndObject(); } jsonWriter.WriteEndObject(); }