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(); }
private 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 if ( this.context.SemanticModel.ResourceMetadata.TryLookup(propertySyntax.Value) is {} resourceMetadata&& moduleSymbol.TryGetModuleType() is ModuleType moduleType && moduleType.TryGetParameterType(keyName) is ResourceParameterType parameterType) { // This is a resource being passed into a module, we actually want to pass in its id // rather than the whole resource. emitter.EmitProperty("value", new PropertyAccessSyntax(propertySyntax.Value, SyntaxFactory.DotToken, SyntaxFactory.CreateIdentifier("id"))); }
public static SyntaxBase GetModuleNameSyntax(ModuleSymbol moduleSymbol) { // this condition should have already been validated by the type checker return(moduleSymbol.TryGetBodyPropertyValue(LanguageConstants.ModuleNamePropertyName) ?? throw new ArgumentException($"Expected module syntax body to contain property 'name'")); }