private void EmitModule(ModuleSymbol moduleSymbol) { writer.WriteStartObject(); this.emitter.EmitProperty("type", NestedDeploymentResourceType); this.emitter.EmitProperty("apiVersion", NestedDeploymentResourceApiVersion); // emit all properties apart from 'params'. In practice, this currrently only allows 'name', but we may choose to allow other top-level resource properties in future. // params requires special handling (see below). var moduleBody = (ObjectSyntax)moduleSymbol.DeclaringModule.Body; this.emitter.EmitObjectProperties(moduleBody, ModulePropertiesToOmit); var scopeProperty = moduleBody.Properties.FirstOrDefault(x => x.TryGetKeyText() == LanguageConstants.ModuleScopePropertyName); if (scopeProperty != null) { var scopeType = context.SemanticModel.GetTypeInfo(scopeProperty); this.emitter.EmitModuleScopeProperty(scopeType); } writer.WritePropertyName("properties"); { writer.WriteStartObject(); writer.WritePropertyName("expressionEvaluationOptions"); { writer.WriteStartObject(); this.emitter.EmitProperty("scope", "inner"); writer.WriteEndObject(); } this.emitter.EmitProperty("mode", "Incremental"); EmitModuleParameters(moduleSymbol); writer.WritePropertyName("template"); { if (!moduleSymbol.TryGetSemanticModel(out var moduleSemanticModel, out _)) { // this should have already been checked during type assignment throw new InvalidOperationException($"Unable to find referenced compilation for module {moduleSymbol.Name}"); } var moduleWriter = new TemplateWriter(writer, moduleSemanticModel); moduleWriter.Write(); } writer.WriteEndObject(); } this.EmitDependsOn(moduleSymbol); writer.WriteEndObject(); }
private void EmitModule(ModuleSymbol moduleSymbol) { writer.WriteStartObject(); this.emitter.EmitProperty("type", NestedDeploymentResourceType); this.emitter.EmitProperty("apiVersion", NestedDeploymentResourceApiVersion); // emit all properties apart from 'params'. In practice, this currrently only allows 'name', but we may choose to allow other top-level resource properties in future. // params requires special handling (see below). var moduleBody = (ObjectSyntax)moduleSymbol.DeclaringModule.Body; this.emitter.EmitObjectProperties(moduleBody, ModulePropertiesToOmit); var scopeData = context.ModuleScopeData[moduleSymbol]; ScopeHelper.EmitModuleScopeProperties(scopeData, emitter); writer.WritePropertyName("properties"); { writer.WriteStartObject(); writer.WritePropertyName("expressionEvaluationOptions"); { writer.WriteStartObject(); this.emitter.EmitProperty("scope", "inner"); writer.WriteEndObject(); } this.emitter.EmitProperty("mode", "Incremental"); EmitModuleParameters(moduleSymbol); writer.WritePropertyName("template"); { var moduleSemanticModel = GetModuleSemanticModel(moduleSymbol); var moduleWriter = new TemplateWriter(writer, moduleSemanticModel); moduleWriter.Write(); } writer.WriteEndObject(); } this.EmitDependsOn(moduleSymbol); writer.WriteEndObject(); }
private void EmitModule(ModuleSymbol moduleSymbol) { writer.WriteStartObject(); if (moduleSymbol.DeclaringModule.IfCondition is IfConditionSyntax ifCondition) { this.emitter.EmitProperty("condition", ifCondition.ConditionExpression); } this.emitter.EmitProperty("type", NestedDeploymentResourceType); this.emitter.EmitProperty("apiVersion", NestedDeploymentResourceApiVersion); // emit all properties apart from 'params'. In practice, this currrently only allows 'name', but we may choose to allow other top-level resource properties in future. // params requires special handling (see below). this.emitter.EmitObjectProperties((ObjectSyntax)moduleSymbol.DeclaringModule.Body, ModulePropertiesToOmit); var scopeData = context.ModuleScopeData[moduleSymbol]; ScopeHelper.EmitModuleScopeProperties(scopeData, emitter); if (scopeData.RequestedScope != ResourceScopeType.ResourceGroupScope) { // if we're deploying to a scope other than resource group, we need to supply a location if (this.context.SemanticModel.TargetScope == ResourceScopeType.ResourceGroupScope) { // the deployment() object at resource group scope does not contain a property named 'location', so we have to use resourceGroup().location this.emitter.EmitProperty("location", new FunctionExpression( "resourceGroup", new LanguageExpression[] { }, new LanguageExpression[] { new JTokenExpression("location") })); } else { // at all other scopes we can just use deployment().location this.emitter.EmitProperty("location", new FunctionExpression( "deployment", new LanguageExpression[] { }, new LanguageExpression[] { new JTokenExpression("location") })); } } writer.WritePropertyName("properties"); { writer.WriteStartObject(); writer.WritePropertyName("expressionEvaluationOptions"); { writer.WriteStartObject(); this.emitter.EmitProperty("scope", "inner"); writer.WriteEndObject(); } this.emitter.EmitProperty("mode", "Incremental"); EmitModuleParameters(moduleSymbol); writer.WritePropertyName("template"); { var moduleSemanticModel = GetModuleSemanticModel(moduleSymbol); var moduleWriter = new TemplateWriter(writer, moduleSemanticModel); moduleWriter.Write(); } writer.WriteEndObject(); } this.EmitDependsOn(moduleSymbol); writer.WriteEndObject(); }