-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Description
Describe the bug
Azure CLI version 2.75 introduced a regression that causes "ArrayAccessSyntax" errors when using the replace() function within array indexing in Bicep templates. This worked correctly in Azure CLI 2.72 but fails in 2.75.
Root Cause:
The error occurs when using the replace() function within array indexing operations in Bicep templates, specifically when the array is loaded from JSON using loadJsonContent(). This suggests the issue is related to how the Bicep parser handles array access syntax for dynamically loaded JSON arrays.
Failing Code (Azure CLI 2.75):
// Load configuration from JSON file
var configs = {
myapp: loadJsonContent('./config/apps/myapp.json')[stage]
}
var config = configs[app]
// This fails when config array comes from JSON
resource originGroup 'Microsoft.Cdn/profiles/originGroups@2022-05-01-preview' = [for (endp, i) in config: {
parent: profile
name: replace(endp.originGroupNames[i], '.', '-') // ❌ FAILS in 2.75 with JSON arrays
// ...
}]
Working Code (Azure CLI 2.72 and workaround for 2.75):
// Same JSON loading
var configs = {
myapp: loadJsonContent('./config/apps/myapp.json')[stage]
}
var config = configs[app]
// This works without replace()
resource originGroup 'Microsoft.Cdn/profiles/originGroups@2022-05-01-preview' = [for (endp, i) in config: {
parent: profile
name: endp.originGroupNames[i] // ✅ WORKS
// ...
}]
Related command
az deployment group what-if
Errors
ERROR: Unhandled exception. System.ArgumentException: Unable to determine parent of specified node of type 'ArrayAccessSyntax' at span '[360:379]' because it has not been indexed.
at Bicep.Core.Syntax.SyntaxHierarchy.GetParent(SyntaxBase node)
Issue script & Debug output
at Bicep.Core.Emit.ExpressionConverter.GetFullyQualifiedResourceName(DeclaredResourceMetadata resource)
at Bicep.Core.Emit.ExpressionEmitter.GetFullyQualifiedResourceName(DeclaredResourceMetadata resource)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass69_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitResource(ExpressionEmitter emitter, ImmutableArray1 extensions, DeclaredResourceExpression resource) at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass67_0.<EmitResources>b__0() at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteArrayWithPosition(IPositionable sourcePosition, Action itemsFunc) at Bicep.Core.Emit.ExpressionEmitter.EmitArray(Action writeItemsFunc, IPositionable position) at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass35_0.<EmitArrayProperty>b__0() at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc) at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position) at Bicep.Core.Emit.ExpressionEmitter.EmitArrayProperty(String propertyName, Action writeItemsFunc, IPositionable position) at Bicep.Core.Emit.TemplateWriter.EmitResources(PositionTrackingJsonTextWriter jsonWriter, ExpressionEmitter emitter, ImmutableArray1 extensions, ImmutableArray1 resources, ImmutableArray1 modules)
at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter)
at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass74_0.b__2()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass34_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.EmitObjectProperty(String propertyName, Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass74_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteObjectWithPosition(IPositionable sourcePosition, Action propertiesFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitObject(Action writePropertiesFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitModule(PositionTrackingJsonTextWriter jsonWriter, DeclaredModuleExpression module, ExpressionEmitter emitter)
at Bicep.Core.Emit.TemplateWriter.<>c__DisplayClass67_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WriteArrayWithPosition(IPositionable sourcePosition, Action itemsFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitArray(Action writeItemsFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.<>c__DisplayClass35_0.b__0()
at Bicep.Core.Emit.PositionTrackingJsonTextWriter.WritePropertyWithPosition(IPositionable keyPosition, String name, Action valueFunc)
at Bicep.Core.Emit.ExpressionEmitter.EmitProperty(String propertyName, Action writeValueFunc, IPositionable position)
at Bicep.Core.Emit.ExpressionEmitter.EmitArrayProperty(String propertyName, Action writeItemsFunc, IPositionable position)
at Bicep.Core.Emit.TemplateWriter.EmitResources(PositionTrackingJsonTextWriter jsonWriter, ExpressionEmitter emitter, ImmutableArray1 extensions, ImmutableArray1 resources, ImmutableArray1 modules) at Bicep.Core.Emit.TemplateWriter.GenerateTemplateWithoutHash(PositionTrackingJsonTextWriter jsonWriter) at Bicep.Core.Emit.TemplateWriter.Write(SourceAwareJsonTextWriter writer) at Bicep.Core.Emit.TemplateEmitter.<>c__DisplayClass8_0.<Emit>b__0() at Bicep.Core.Emit.TemplateEmitter.EmitOrFail(Func1 write)
at Bicep.Core.Emit.TemplateEmitter.Emit(TextWriter textWriter)
at Bicep.Core.Emit.CompilationEmitter.Template(SemanticModel model)
at Bicep.Core.Emit.CompilationEmitter.Template()
at Bicep.Cli.Services.OutputWriter.TemplateToStdout(Compilation compilation)
at Bicep.Cli.Commands.BuildCommand.Compile(Uri inputUri, Uri outputUri, Boolean noRestore, Nullable1 diagnosticsFormat, Boolean outputToStdOut) at Bicep.Cli.Commands.BuildCommand.RunAsync(BuildArguments args) at Bicep.Cli.Program.RunAsync(String[] args, CancellationToken cancellationToken) at Bicep.Cli.Program.<>c__DisplayClass3_0.<<Main>b__0>d.MoveNext() --- End of stack trace from previous location --- at Bicep.Cli.Program.RunWithCancellationAsync(Func2 runFunc)
at Bicep.Cli.Program.Main(String[] args)
at Bicep.Cli.Program.
Expected behavior
The replace() function should work with array indexing on JSON-loaded arrays as it did in Azure CLI 2.72
No ArrayAccessSyntax errors should occur when combining loadJsonContent(), array iteration, and replace()
Environment Summary
Azure CLI Version (Working): 2.72
Azure CLI Version (Failing): 2.75
Operating System: Mac + Windows
Template Engine: Bicep
Command: az deployment group what-if
Additional context
This regression affects Azure Front Door deployment templates where resource names need character replacement for compliance with Azure naming restrictions. The issue specifically occurs when combining loadJsonContent() with array operations, suggesting a parsing problem with dynamically loaded JSON arrays. The issue specifically manifests when:
Loading configuration from JSON files using loadJsonContent()
Using array iteration with [for (item, i) in jsonArray: {...}] on the loaded data
Accessing array elements with index notation jsonArray[i]
Applying the replace() function to the indexed array element
The error occurs during Bicep syntax parsing, not during ARM template execution
This suggests the Bicep parser in Azure CLI 2.75 has issues with array access syntax specifically for JSON-loaded arrays, not statically defined arrays.